[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.
|