[pygccxml-commit] SF.net SVN: pygccxml: [555] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-18 20:42:22
|
Revision: 555 http://svn.sourceforge.net/pygccxml/?rev=555&view=rev Author: roman_yakovenko Date: 2006-09-18 13:42:11 -0700 (Mon, 18 Sep 2006) Log Message: ----------- introducing opaque_type_registrator This is a start for next "redesign" session. New base class for code creators should be introduced: regstration_t. It will keep the list of associated creators, that register declarations in global scope Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/creator.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-18 20:03:06 UTC (rev 554) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-18 20:42:11 UTC (rev 555) @@ -30,6 +30,12 @@ def __init__(self, function, wrapper=None ): declaration_based.declaration_based_t.__init__( self, declaration=function ) self._wrapper = wrapper + self._associated_decl_creators = [] + + @property + def associated_decl_creators( self ): + """ references to declaration code creators. """ + return self._associated_decl_creators def _get_wrapper( self ): return self._wrapper Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-18 20:03:06 UTC (rev 554) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-18 20:42:11 UTC (rev 555) @@ -99,18 +99,6 @@ """ references to class declaration code creators. """ return self._associated_decl_creators - def recursive_associated_decl_creators( self ): - """ references to all class declaration code creators. """ - associated_creators = self.associated_decl_creators[:] - - relevant_creators = filter( lambda creator: isinstance( creator, class_t ) - , algorithm.make_flatten( self.creators ) ) - - map( lambda creator: associated_creators.extend( creator.associated_decl_creators ) - , relevant_creators ) - - return associated_creators - def _get_held_type(self): return self.declaration.held_type def _set_held_type(self, held_type): Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-18 20:03:06 UTC (rev 554) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-18 20:42:11 UTC (rev 555) @@ -183,10 +183,11 @@ creators = filter( lambda x: isinstance(x, class_types ), class_creator.creators ) decl_creators = [] - for creator in creators: - if not isinstance( creator, code_creators.class_t ): - continue - decl_creators.extend( creator.recursive_associated_decl_creators() ) + class_creators = filter( lambda creator: isinstance( creator, code_creators.class_t ) + , creators ) + + map( lambda creator: decl_creators.extend( self.associated_decl_creators( creator ) ) + , class_creators ) self.split_internal_creators( class_creator, creators, 'classes', decl_creators ) return 'classes' Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-18 20:03:06 UTC (rev 554) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-18 20:42:11 UTC (rev 555) @@ -61,6 +61,21 @@ @type: str """ ) + def associated_decl_creators( self, creator ): + """ references to all class declaration code creators. """ + if not isinstance( creator, code_creators.class_t ): + return [] + + associated_creators = creator.associated_decl_creators[:] + + relevant_creators = filter( lambda acreator: isinstance( acreator, code_creators.class_t ) + , code_creators.make_flatten( creator.creators ) ) + + map( lambda acreator: associated_creators.extend( acreator.associated_decl_creators ) + , relevant_creators ) + + return associated_creators + def create_function_code( self, function_name ): return "void %s();" % function_name @@ -199,7 +214,7 @@ class_wrapper = None decl_creators = [] if isinstance( class_creator, code_creators.class_t ): - decl_creators.extend( class_creator.recursive_associated_decl_creators() ) + decl_creators.extend( self.associated_decl_creators( class_creator ) ) if class_creator.wrapper: class_wrapper = class_creator.wrapper decl_creators.append( class_creator.wrapper ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-18 20:03:06 UTC (rev 554) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-18 20:42:11 UTC (rev 555) @@ -131,7 +131,8 @@ self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] self.__exposed_free_fun_overloads = set() - + self.__exposed_opaque_decls = set() + def _prepare_decls( self, decls, doc_extractor ): global DO_NOT_REPORT_MSGS @@ -316,6 +317,18 @@ return True #we already decided that those functions should be exposed, so I need wrapper for them return bool( self.redefined_funcs(class_inst) ) + def register_opaque_type( self, type_, call_policy ): + if not decl_wrappers.is_return_opaque_pointer_policy( call_policy ): + return #not our case + naked_type = declarations.remove_cv( declarations.remove_pointer( type_ ) ) + if decl_wrappers.python_traits.is_immutable( naked_type ): + return #don't register opaque converter for immutable types. + if decl in self.__exposed_opaque_decls: + return #already registered + self.__exposed_opaque_decls.add( decl ) + creator = code_creators.opaque_type_registrator_t( decl ) + self.__extmodule.adopt_declaration_creator( creator ) + def _adopt_free_operator( self, operator ): def adopt_operator_impl( operator, found_creators ): creator = filter( lambda creator: isinstance( creator, code_creators.class_t ) @@ -520,7 +533,8 @@ self.__types_db.update( self.curr_decl ) if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) - + self.register_opaque_type( self.curr_decl.return_type, self.curr_decl.call_policies ) + maker_cls, fwrapper_cls = creators_wizard.find_out_mem_fun_creator_classes( self.curr_decl ) maker = None @@ -598,7 +612,8 @@ if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) - + self.register_opaque_type( self.curr_decl.return_type, self.curr_decl.call_policies ) + self.__types_db.update( self.curr_decl ) if not self.curr_decl.parent.is_abstract \ and not declarations.is_reference( self.curr_decl.return_type ): @@ -627,7 +642,7 @@ self.__types_db.update( f ) if None is f.call_policies: f.call_policies = self.__call_policies_resolver( f ) - + self.register_opaque_type( f.return_type, f.call_policies ) overloads_cls_creator = code_creators.free_fun_overloads_class_t( overloads ) self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) @@ -637,6 +652,7 @@ self.__types_db.update( self.curr_decl ) if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) + self.register_opaque_type( self.curr_decl.return_type, self.curr_decl.call_policies ) maker = code_creators.free_function_t( function=self.curr_decl ) self.curr_code_creator.adopt_creator( maker ) @@ -664,6 +680,7 @@ self.__types_db.update( f ) if None is f.call_policies: f.call_policies = self.__call_policies_resolver( f ) + self.register_opaque_type( f.return_type, f.call_policies ) overloads_cls_creator = code_creators.mem_fun_overloads_class_t( overloads ) self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) @@ -801,6 +818,7 @@ elif declarations.is_reference( self.curr_decl.type ): if None is self.curr_decl.getter_call_policies: self.curr_decl.getter_call_policies = self.__call_policies_resolver( self.curr_decl, 'get' ) + self.register_opaque_type( self.curr_decl.type, self.curr_decl.getter_call_policies ) if None is self.curr_decl.setter_call_policies: self.curr_decl.setter_call_policies = self.__call_policies_resolver( self.curr_decl, 'set' ) wrapper = code_creators.mem_var_ref_wrapper_t( variable=self.curr_decl ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |