[pygccxml-commit] SF.net SVN: pygccxml: [698] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-11-13 19:54:37
|
Revision: 698 http://svn.sourceforge.net/pygccxml/?rev=698&view=rev Author: roman_yakovenko Date: 2006-11-08 02:19:28 -0800 (Wed, 08 Nov 2006) Log Message: ----------- fixing treatment of opaque types Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py pyplusplus_dev/pyplusplus/module_creator/creator.py Added Paths: ----------- pyplusplus_dev/pyplusplus/module_creator/opaque_types_manager.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-11-08 10:08:43 UTC (rev 697) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-11-08 10:19:28 UTC (rev 698) @@ -53,6 +53,7 @@ self._equality_comparable = None self._less_than_comparable = None self._isuite_version = 1 + self._opaque = False def _get_indexing_suite_version( self ): return self._isuite_version @@ -112,7 +113,18 @@ less_than_comparable = property( _get_less_than_comparable, _set_less_than_comparable , doc="indicates existence of public operator<. " \ +"Default value is calculated, based on information presented in the declarations tree" ) + + def _get_opaque( self ): + return self._opaque + def _set_opaque( self, value ): + self._opaque = value + + opaque = property( _get_opaque, _set_opaque + , doc="If True, Py++ will treat return types and arguments T* as opaque types." \ + +"Thus it will be able to generate code, that uses " \ + +" BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID macro in a right places." ) + #this will only be exported if indexing suite is not None and only when needed class class_declaration_t( class_common_details_t , decl_wrapper.decl_wrapper_t Modified: pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-11-08 10:08:43 UTC (rev 697) +++ pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-11-08 10:19:28 UTC (rev 698) @@ -3,11 +3,14 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import opaque_types_manager from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators from pyplusplus.decl_wrappers import python_traits +#TODO: add opaque to documentation + class resolver_t( object ): def __init__( self ): object.__init__( self ) @@ -82,6 +85,9 @@ if declarations.is_same( return_type, self.__const_wchar_pointer ): return decl_wrappers.return_value_policy( decl_wrappers.return_by_value ) + if opaque_types_manager.find_out_opaque_decl( return_type, ensure_opaque_decl=True ): + return decl_wrappers.return_value_policy( decl_wrappers.return_opaque_pointer ) + return None class return_internal_reference_resolver_t( resolver_t ): @@ -167,4 +173,4 @@ resolved = resolver( calldef, hint ) if resolved: return resolved - return None \ No newline at end of file + return None Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-11-08 10:08:43 UTC (rev 697) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-11-08 10:19:28 UTC (rev 698) @@ -6,6 +6,7 @@ import types_database import creators_wizard import class_organizer +import opaque_types_manager import call_policies_resolver from pygccxml import declarations from pyplusplus import decl_wrappers @@ -137,7 +138,7 @@ self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] self.__exposed_free_fun_overloads = set() - self.__exposed_opaque_decls = {} #decl : creator + self.__opaque_types_manager = opaque_types_manager.manager_t( self.__extmodule ) def _prepare_decls( self, decls, doc_extractor ): global DO_NOT_REPORT_MSGS @@ -227,25 +228,6 @@ new_ordered.extend( variables ) return new_ordered # - 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. - 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 id(decl) not 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 ): @@ -475,9 +457,8 @@ else: maker = maker_cls( function=self.curr_decl ) self.curr_code_creator.adopt_creator( maker ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) - 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: @@ -544,12 +525,12 @@ 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 ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) #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 ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) def visit_free_function( self ): if self.curr_decl in self.__exposed_free_fun_overloads: @@ -576,7 +557,7 @@ 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 ) + self.__opaque_types_manager.register_opaque( overloads_reg, overloads ) ctext_t = code_creators.custom_text_t for f in overloads: @@ -590,7 +571,7 @@ self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) 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 ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) ctext_t = code_creators.custom_text_t uc_creators = map( lambda uc: ctext_t( uc.text ), self.curr_decl.declaration_code ) @@ -630,7 +611,7 @@ cls_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 ) + self.__opaque_types_manager.register_opaque( overloads_reg, overloads ) return exposed def visit_class(self ): @@ -769,7 +750,7 @@ 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 ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) else: maker = code_creators.member_variable_t( variable=self.curr_decl ) if wrapper: Added: pyplusplus_dev/pyplusplus/module_creator/opaque_types_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/opaque_types_manager.py (rev 0) +++ pyplusplus_dev/pyplusplus/module_creator/opaque_types_manager.py 2006-11-08 10:19:28 UTC (rev 698) @@ -0,0 +1,82 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +from pygccxml import declarations +from pyplusplus import code_creators +from pyplusplus import decl_wrappers + +def find_out_opaque_decl( type_, ensure_opaque_decl ): + naked_type = declarations.remove_cv( type_ ) + if not declarations.is_pointer( naked_type ): + return None + naked_type = declarations.remove_pointer( declarations.remove_cv( type_ ) ) + if decl_wrappers.python_traits.is_immutable( naked_type ): + return None#immutable types could not be opaque + decl = None + if declarations.is_class( naked_type ): + decl = declarations.class_traits.get_declaration( naked_type ) + elif declarations.is_class_declaration( naked_type ):#class declaration: + decl = declarations.class_declaration_traits.get_declaration( naked_type ) + else: + return None + if ensure_opaque_decl: + if decl.opaque: + return decl + else: + return None + else: + return decl + + +class manager_t( object ): + def __init__( self, extmodule ): + object.__init__( self ) + self.__extmodule = extmodule + self.__exposed_opaque_decls = {} #decl: creator + + def __find_out_opaque_decls( self, decl ): + opaque_types = [] + is_opaque_policy = decl_wrappers.is_return_opaque_pointer_policy + if isinstance( decl, declarations.variable_t ): + opaque_decl = find_out_opaque_decl( decl.type, ensure_opaque_decl=True ) + if opaque_decl: + opaque_types.append( opaque_decl ) + elif is_opaque_policy( decl.getter_call_policies ) or is_opaque_policy( decl.setter_call_policies ): + opaque_decl = find_out_opaque_decl( decl.type, ensure_opaque_decl=False ) + if opaque_decl: + opaque_types.append( opaque_decl ) + else: + pass + elif isinstance( decl, declarations.calldef_t ): + if is_opaque_policy( decl.call_policies ): + opaque_decl = find_out_opaque_decl( decl.return_type, ensure_opaque_decl=False ) + if opaque_decl: + opaque_types.append( opaque_decl ) + all_types = decl.argument_types[:] + if decl.return_type: + all_types.append( decl.return_type ) + for type_ in all_types: + opaque_decl = find_out_opaque_decl( type_, ensure_opaque_decl=True ) + if opaque_decl: + opaque_types.append( opaque_decl ) + else: + pass + return opaque_types + + + def register_opaque( self, creator, decl_or_decls ): + opaque_decls = [] + for decl in declarations.make_flatten( decl_or_decls ): + opaque_decls.extend( self.__find_out_opaque_decls( decl ) ) + + for decl in opaque_decls: + opaque_type_registrator = None + if id(decl) not 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) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |