[pygccxml-commit] SF.net SVN: pygccxml: [577] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-23 20:31:12
|
Revision: 577 http://svn.sourceforge.net/pygccxml/?rev=577&view=rev Author: roman_yakovenko Date: 2006-09-23 13:30:56 -0700 (Sat, 23 Sep 2006) Log Message: ----------- adding initial support for automatic registrayion of opaque type Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.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/opaque_type_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py 2006-09-23 07:47:39 UTC (rev 576) +++ pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py 2006-09-23 20:30:56 UTC (rev 577) @@ -4,13 +4,16 @@ # http://www.boost.org/LICENSE_1_0.txt) import os +import code_creator import declaration_based -class opaque_type_registrator_t( declaration_based.declaration_based_t ): +class opaque_type_registrator_t( code_creator.code_creator_t + , declaration_based.declaration_based_t ): """ This class creates code that register static sized array """ def __init__( self, pointee ): + code_creator.code_creator_t.__init__( self ) declaration_based.declaration_based_t.__init__( self, pointee ) self.works_on_instance = False Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-23 07:47:39 UTC (rev 576) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-23 20:30:56 UTC (rev 577) @@ -108,7 +108,8 @@ for decl_creator in self.associated_decl_creators( creator ): source_code.append( '' ) source_code.append( decl_creator.create() ) - decl_creator.create = lambda: '' + if not isinstance( decl_creator, self.ref_count_creators ): + decl_creator.create = lambda: '' # Write the register() function... source_code.append( '' ) @@ -228,7 +229,8 @@ for creator in class_creator.associated_decl_creators: source_code.append( '' ) source_code.append( creator.create() ) - creator.create = lambda: '' + if not isinstance( creator, self.ref_count_creators ): + creator.create = lambda: '' # Write the register() function... source_code.append( '' ) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-23 07:47:39 UTC (rev 576) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-23 20:30:56 UTC (rev 577) @@ -40,8 +40,8 @@ self.split_method_names = [] # List of methods from the split files self.write_main = write_main self.written_files = [] + self.ref_count_creators = ( code_creators.opaque_type_registrator_t, ) - def write_file( self, fpath, content ): self.written_files.append( fpath ) writer.writer_t.write_file( fpath, content ) @@ -198,7 +198,8 @@ for creator in declaration_creators: answer.append( '' ) answer.append( creator.create() ) - creator.create = lambda: '' + if not isinstance( creator, self.ref_count_creators ): + creator.create = lambda: '' # Write the register() function... answer.append( '' ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-23 07:47:39 UTC (rev 576) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-23 20:30:56 UTC (rev 577) @@ -131,7 +131,7 @@ self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] self.__exposed_free_fun_overloads = set() - self.__exposed_opaque_decls = set() + self.__exposed_opaque_decls = {} #decl : creator def _prepare_decls( self, decls, doc_extractor ): global DO_NOT_REPORT_MSGS @@ -319,18 +319,26 @@ return True #function transformers require wrapper return bool( self.redefined_funcs(class_inst) ) - def register_opaque_type( self, type_, call_policy ): + def register_opaque_type( self, creator, 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 ) - + decl = None + if declarations.is_class( naked_type ): + decl = declarations.class_traits.get_declaration( naked_type ) + else:#class declaration: + decl = declarations.class_declaration_traits.get_declaration( naked_type ) + opaque_type_registrator = None + if not id(decl) in self.__exposed_opaque_decls.keys(): + opaque_type_registrator = code_creators.opaque_type_registrator_t( decl ) + self.__exposed_opaque_decls[ id(decl) ] = opaque_type_registrator + self.__extmodule.adopt_declaration_creator( opaque_type_registrator ) + else: + opaque_type_registrator = self.__exposed_opaque_decls[ id(decl) ] + creator.associated_decl_creators.append(opaque_type_registrator) + def _adopt_free_operator( self, operator ): def adopt_operator_impl( operator, found_creators ): creator = filter( lambda creator: isinstance( creator, code_creators.class_t ) @@ -535,7 +543,6 @@ 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 ) @@ -553,6 +560,8 @@ maker = maker_cls( function=self.curr_decl ) self.curr_code_creator.adopt_creator( maker ) + self.register_opaque_type( maker, self.curr_decl.return_type, self.curr_decl.call_policies ) + # Make sure all required headers are included... required_headers = getattr(fwrapper, "get_required_headers", lambda : [])() for header in required_headers: @@ -566,7 +575,6 @@ # Make Py++ write the header self.__extmodule.add_system_header( header ) - if self.curr_decl.has_static: #static_method should be created only once. found = filter( lambda creator: isinstance( creator, code_creators.static_method_t ) @@ -615,17 +623,18 @@ 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 ): maker = code_creators.casting_operator_t( operator=self.curr_decl ) self.__module_body.adopt_creator( maker ) + self.register_opaque_type( maker, self.curr_decl.return_type, self.curr_decl.call_policies ) #what to do if class is abstract if self.curr_decl.access_type == ACCESS_TYPES.PUBLIC: maker = code_creators.casting_member_operator_t( operator=self.curr_decl ) self.curr_code_creator.adopt_creator( maker ) + self.register_opaque_type( maker, self.curr_decl.return_type, self.curr_decl.call_policies ) def visit_free_function( self ): if self.curr_decl in self.__exposed_free_fun_overloads: @@ -645,7 +654,6 @@ 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 ) @@ -653,13 +661,14 @@ overloads_reg = code_creators.free_fun_overloads_t( overloads_cls_creator ) self.curr_code_creator.adopt_creator( overloads_reg ) overloads_reg.associated_decl_creators.append( overloads_cls_creator ) + self.register_opaque_type( overloads_reg, f.return_type, f.call_policies ) else: 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 ) + self.register_opaque_type( maker, self.curr_decl.return_type, self.curr_decl.call_policies ) def visit_free_operator( self ): self.__types_db.update( self.curr_decl ) @@ -685,15 +694,15 @@ 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 ) overloads_reg = code_creators.mem_fun_overloads_t( overloads_cls_creator ) cls_creator.adopt_creator( overloads_reg ) + overloads_reg.associated_decl_creators.append( overloads_cls_creator ) - overloads_reg.associated_decl_creators.append( overloads_cls_creator ) + self.register_opaque_type( overloads_reg, f.return_type, f.call_policies ) return exposed def visit_class(self ): @@ -825,11 +834,11 @@ 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 ) maker = code_creators.mem_var_ref_t( variable=self.curr_decl, wrapper=wrapper ) + self.register_opaque_type( maker, self.curr_decl.type, self.curr_decl.getter_call_policies ) else: maker = code_creators.member_variable_t( variable=self.curr_decl ) if wrapper: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |