From: Roman <rom...@us...> - 2006-03-29 04:27:06
|
Update of /cvsroot/pygccxml/source/pyplusplus/examples/tnfox In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31188/pyplusplus/examples/tnfox Modified Files: call_policies.py create_tnfox.py declarations_to_exclude.py files_to_exclude.py Log Message: 1. adding most of the aliases needed to functionality needed by user to module builder package 2. updating examples and cleaning unittests Index: files_to_exclude.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/examples/tnfox/files_to_exclude.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** files_to_exclude.py 16 Nov 2005 07:01:12 -0000 1.2 --- files_to_exclude.py 29 Mar 2006 04:26:58 -0000 1.3 *************** *** 5,8 **** --- 5,10 ---- # http://www.boost.org/LICENSE_1_0.txt) + import os + files = [ "FXArray.h" *************** *** 35,36 **** --- 37,45 ---- , "QThread.h" ] + + def is_excluded( decl ): + global files + if None is decl.location: + return False + file_name = os.path.split( decl.location.file_name )[1] + return file_name in files Index: create_tnfox.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/examples/tnfox/create_tnfox.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** create_tnfox.py 28 Feb 2006 07:31:33 -0000 1.15 --- create_tnfox.py 29 Mar 2006 04:26:58 -0000 1.16 *************** *** 8,11 **** --- 8,12 ---- import time from environment import settings + from pygccxml import parser from pygccxml import declarations *************** *** 14,17 **** --- 15,20 ---- from pyplusplus import file_writers from pyplusplus import utils as pypp_utils + from pyplusplus import decl_wrappers + from pyplusplus import module_builder import aliases *************** *** 22,92 **** import declarations_to_exclude ! def should_stay(decl): ! if isinstance( decl, declarations.namespace_t ): ! return True ! fname = declarations.full_name( decl ) ! if not fname.startswith( '::FX' ): ! return False ! if fname in declarations_to_exclude.declarations: ! return False ! if decl.name.startswith('FXIPCMsg'): ! return False ! file_name = os.path.split( decl.location.file_name )[1] ! #pyplusplus could be very powerfull :-) ! if declarations_to_exclude.deprecated.has_key( file_name ): ! if decl.location.line in declarations_to_exclude.deprecated[ file_name ]: ! return False ! if fname.startswith( '::FX::Pol::' ): ! return False ! file_name = os.path.split( decl.location.file_name )[1] ! if file_name in files_to_exclude.files: ! return False ! if isinstance( decl, declarations.constructor_t ) \ ! and decl.name == 'FXFunctorTarget' \ ! and len(decl.arguments) == 1: ! return False #there are some problems to compile this constructor ! if fname.startswith('::FX::QValueList<FX::Pol::knowReferrers::ReferrerEntry>') or fname.startswith('::FX::QPtrVector<FX::Generic::BoundFunctorV>'): ! return False #Niall? wrapper for this function could not be compiled ! if decl.name == 'bind' and decl.parent.name == 'FXSQLDBStatement' and len( decl.arguments ) == 3: ! return False ! if isinstance( decl, declarations.calldef_t ): #I want to exclude all functions that returns pointer to pointer #and returns pointer to fundamental type ! if declarations.is_pointer( decl.return_type ): ! temp = declarations.remove_pointer( decl.return_type ) if declarations.is_fundamental( temp ) and not declarations.is_const(temp): ! return False ! temp = declarations.remove_cv( decl.return_type ) temp = declarations.remove_pointer( temp ) if declarations.is_pointer( temp ): ! return False ! ! return True ! ! def set_call_policies( decl ): #first of all call policies defined within data base ! full_name = declarations.full_name( decl ) ! if call_policies.db.has_key( full_name ): ! return call_policies.db[ full_name ] ! if 'FXGL' in decl.parent.name and decl.name == 'copy': ! return code_creators.return_value_policy( code_creators.manage_new_object ) ! if 'QPtrVector<' in decl.parent.name and decl.name == 'take': ! # Set reference_existing object only on the overload not returning a bool ! if declarations.is_pointer( decl.return_type ): ! return code_creators.return_value_policy( code_creators.reference_existing_object ) ! if decl.name == 'manufacture': ! return code_creators.return_value_policy( code_creators.manage_new_object ) ! if decl.name == 'getMetaClass': ! return code_creators.return_value_policy( code_creators.reference_existing_object ) ! #second build in ! built_in_resolver = module_creator.built_in_resolver_t() ! policy = built_in_resolver( decl ) ! if policy: ! return policy #third calculated ! return_by_value = code_creators.return_value_policy( code_creators.return_by_value ) ! return_internal_ref = code_creators.return_internal_reference() const_t = declarations.const_t pointer_t = declarations.pointer_t --- 25,77 ---- import declarations_to_exclude ! def filter_decls(mb): ! mb.global_ns.exclude() ! fx_ns = mb.namespace( 'FX' ) ! fx_ns.include() ! fx_ns.decls( declarations_to_exclude.is_excluded ).exclude() ! fx_ns.decls( lambda decl: decl.name.startswith('FXIPCMsg') ).exclude() ! fx_ns.namespace( 'Pol' ).exclude() ! fx_ns.decls( files_to_exclude.is_excluded ).exclude() ! #find FXFunctorTarget constructor that takes 1 argument of some type ! fx_ns.constructors( name='FXFunctorTarget', arg_type=[None] ).exclude() ! fx_ns.class_( 'QValueList<FX::Pol::knowReferrers::ReferrerEntry>').exclude() ! fx_ns.class_( 'QPtrVector<FX::Generic::BoundFunctorV>').exclude() #Niall? wrapper for this function could not be compiled ! FXSQLDBStatement = fx_ns.class_( 'FXSQLDBStatement' ) ! FXSQLDBStatement.member_function( name='bind', arg_types=[None,None,None] ).exclude() ! ! for func in fx_ns.calldefs(): #I want to exclude all functions that returns pointer to pointer #and returns pointer to fundamental type ! if declarations.is_pointer( func.return_type ): ! temp = declarations.remove_pointer( func.return_type ) if declarations.is_fundamental( temp ) and not declarations.is_const(temp): ! func.exclude() ! temp = declarations.remove_cv( func.return_type ) temp = declarations.remove_pointer( temp ) if declarations.is_pointer( temp ): ! func.exclude() ! def set_call_policies(mb): #first of all call policies defined within data base ! for fname, call_pol in call_policies.db.items(): ! mb.calldefs( fname ).call_policies = call_pol ! ! copy_funcs = mb.calldefs( lambda decl: 'FXGL' in decl.parent.name and decl.name == 'copy' ) ! copy_funcs.call_policies = decl_wrappers.return_value_policy( decl_wrappers.manage_new_object ) ! ! take_funcs = mb.calldefs( lambda decl: 'QPtrVector<' in decl.parent.name \ ! and decl.name == 'take' \ ! and declarations.is_pointer( decl.return_type ) ) ! # Set reference_existing object only on the overload not returning a bool ! take_funcs.call_policies = decl_wrappers.return_value_policy( decl_wrappers.reference_existing_object ) ! mb.calldefs( 'manufacture' ).call_policies \ ! = decl_wrappers.return_value_policy( decl_wrappers.manage_new_object ) ! mb.calldefs( 'getMetaClass' ).call_policies \ ! = decl_wrappers.return_value_policy( decl_wrappers.reference_existing_object ) ! #third calculated ! return_by_value = decl_wrappers.return_value_policy( decl_wrappers.return_by_value ) ! return_internal_ref = decl_wrappers.return_internal_reference() const_t = declarations.const_t pointer_t = declarations.pointer_t *************** *** 102,132 **** for type_, policy in system_wide.items(): ! if declarations.is_same( type_, decl.return_type ): ! return policy - if isinstance( decl, declarations.casting_operator_t ): - #Niall? - if decl.parent.name in ( 'FXVec4d', 'FXVec4f', 'FXVec3d', 'FXVec3f', 'QMemArray<unsigned char>' ): - return return_internal_ref - #better solution could be implemented - #casting_operator_t : ::FX::FXVec4d::operator 38 - #---> ::FX::FXVec3d & ( ::FX::FXVec4d::* )( ) - #casting_operator_t : ::FX::FXVec4f::operator 40 - #---> ::FX::FXVec3f & ( ::FX::FXVec4f::* )( ) - #casting_operator_t : ::FX::FXVec3d::operator 31 - #---> ::FX::FXVec2d & ( ::FX::FXVec3d::* )( ) - #casting_operator_t : ::FX::FXVec3f::operator 36 - #---> ::FX::FXVec2f & ( ::FX::FXVec3f::* )( ) - #casting_operator_t : ::FX::QMemArray<unsigned char>::operator 24 - #---> unsigned char const * ( ::FX::QMemArray<unsigned char>::* )( ) const return None ! def fix_default_args( code_creator ): ! for arg in code_creator.declaration.arguments: ! if arg.default_value == 'FX::FXString::null': ! arg.default_value = 'FX::FXString::nullStr()' ! def customize_module( extmodule ): extmodule.license = customization_data.license --- 87,113 ---- for type_, policy in system_wide.items(): ! mb.calldefs( return_type=type_ ).call_policies = policy ! ! for name in 'FXVec4d', 'FXVec4f', 'FXVec3d', 'FXVec3f', 'QMemArray<unsigned char>': ! mb.casting_operators( name ).call_policies = return_internal_ref return None ! def customize_decls( mb ): ! classes = mb.classes() ! classes.always_expose_using_scope = True #better error reporting from compiler ! classes.redefine_operators = True #redefine all operators found in base classes ! for class_ in classes: ! if class_.name in aliases.db: ! class_.alias = aliases.db[ class_.name ] ! class_.wrapper_alias = class_.alias + '_wrapper' + for func in mb.calldefs(): + for arg in func.arguments: + if arg.default_value == 'FX::FXString::null': + arg.default_value = 'FX::FXString::nullStr()' ! def customize_module( mb ): ! extmodule = mb.code_creator extmodule.license = customization_data.license *************** *** 136,213 **** map( lambda creator: extmodule.remove_creator( creator ), includes ) extmodule.adopt_include( code_creators.include_t( header="fx.h" ) ) - ##extmodule.adopt_include( code_creators.include_t( header="CArrays.h" ) ) - ##extmodule.adopt_include( code_creators.include_t( color_array.file_name ) ) position = extmodule.last_include_index() + 1 extmodule.adopt_creator( code_creators.namespace_using_t('::FX'), position ) extmodule.user_defined_directories.append( settings.generated_files_dir ) - #Niall? - #extmodule.precompiled_header = ??? - class_creators = filter( lambda creator: isinstance( creator, code_creators.class_t ) - , code_creators.make_flatten( extmodule.body.creators ) ) - for creator in class_creators: - creator.always_expose_using_scope = True #better error reporting from compiler - creator.redefine_operators = True #redefine all operators found in base classes - if aliases.db.has_key( creator.declaration.name ): - creator.alias = aliases.db[ creator.declaration.name ] - ##fname = declarations.full_name( creator.declaration ) - ##if fname in color_array.classes: - ##creator.adopt_creator( color_array.register_color_array_t( creator.declaration.name ) ) - #some times it is much easier to exclude declarations by alias ! for creator in code_creators.make_flatten( extmodule.creators ): ! if not isinstance( creator, code_creators.declaration_based_t ): ! continue ! if creator.alias in declarations_to_exclude.declarations_aliases: ! creator.parent.remove_creator( creator ) ! if creator.alias == "as_unsigned_char_const__ptr_" \ ! and creator.declaration.parent.name == 'QMemArray<unsigned char>': ! creator.parent.remove_creator( creator ) ! if isinstance( creator.declaration, declarations.calldef_t): ! fix_default_args( creator ) - pypp_utils.missing_call_policies.print_( extmodule ) ! def prepare_module(): parser_config = parser.config_t( gccxml_path=settings.gccxml_path , include_paths=[settings.boost_path, settings.tnfox_include_path] , define_symbols=settings.defined_symbols_gccxml ) ! reader = parser.source_reader_t( parser_config ) fx_xml = os.path.join( settings.xml_files, 'fx.xml' ) ! if not os.path.exists( fx_xml ): ! print 'compiling fx.h file' ! reader.create_xml_file( 'fx.h', fx_xml ) ! print 'compiling fx.h file - done' ! print 'reading declarations' ! decls = reader.read_xml_file( fx_xml ) ! print 'reading declarations - done' print 'filtering declarations' ! decls = declarations.filtering.user_defined( decls, should_stay ) print 'filtering declarations - done' print 'creating module' ! creator = module_creator.creator_t( decls ! , settings.module_name ! , create_castinig_constructor=True ! , call_policies_resolver_=set_call_policies) ! extmodule = creator.create() print 'creating module - done' print 'customizing module' ! customize_module( extmodule ) print 'customizing module - done' ! ! return extmodule ! def write_module( extmodule ): print 'writing module to files' start_time = time.clock() file_writers.write_file( os.path.join( settings.generated_files_dir, color_array.file_name ) , color_array.create_file_content()) ! file_writers.write_multiple_files( extmodule, settings.generated_files_dir ) print 'time taken : ', time.clock() - start_time, ' seconds' print 'writing module to files - done' def export(): ! extmodule = prepare_module() ! write_module( extmodule ) if __name__ == '__main__': --- 117,174 ---- map( lambda creator: extmodule.remove_creator( creator ), includes ) extmodule.adopt_include( code_creators.include_t( header="fx.h" ) ) position = extmodule.last_include_index() + 1 extmodule.adopt_creator( code_creators.namespace_using_t('::FX'), position ) extmodule.user_defined_directories.append( settings.generated_files_dir ) #some times it is much easier to exclude declarations by alias ! #for creator in code_creators.make_flatten( extmodule.creators ): ! #if not isinstance( creator, code_creators.declaration_based_t ): ! #continue ! #if creator.alias in declarations_to_exclude.declarations_aliases: ! #creator.parent.remove_creator( creator ) ! #if creator.alias == "as_unsigned_char_const__ptr_" \ ! #and creator.declaration.parent.name == 'QMemArray<unsigned char>': ! #creator.parent.remove_creator( creator ) ! def create_module(): parser_config = parser.config_t( gccxml_path=settings.gccxml_path , include_paths=[settings.boost_path, settings.tnfox_include_path] , define_symbols=settings.defined_symbols_gccxml ) ! fx_xml = os.path.join( settings.xml_files, 'fx.xml' ) ! mb = module_builder.module_builder_t( [ parser.create_cached_source_fc( 'fx.h', fx_xml ) ] ! , parser_config ) ! mb.run_query_optimizer() print 'filtering declarations' ! filter_decls( mb ) print 'filtering declarations - done' + print 'set call policies' + set_call_policies( mb ) + print 'set call policies - done' + print 'customize declarations' + customize_decls( mb ) + print 'customize declarations - done' print 'creating module' ! mb.build_code_creator(settings.module_name ) print 'creating module - done' print 'customizing module' ! customize_module( mb ) print 'customizing module - done' ! return mb ! def write_module( mb ): print 'writing module to files' + assert isinstance( mb, module_builder.module_builder_t ) start_time = time.clock() file_writers.write_file( os.path.join( settings.generated_files_dir, color_array.file_name ) , color_array.create_file_content()) ! mb.split_module( settings.generated_files_dir ) print 'time taken : ', time.clock() - start_time, ' seconds' print 'writing module to files - done' def export(): ! mb = create_module() ! write_module( mb ) if __name__ == '__main__': Index: declarations_to_exclude.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/examples/tnfox/declarations_to_exclude.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** declarations_to_exclude.py 25 Jan 2006 07:27:23 -0000 1.9 --- declarations_to_exclude.py 29 Mar 2006 04:26:58 -0000 1.10 *************** *** 7,12 **** import os from environment import settings ! declarations = [ "::FX::FXACL::int_toWin32SecurityDescriptor" , "::FX::FXApp::dispatchEvent" --- 7,13 ---- import os from environment import settings + from pygccxml import declarations ! to_be_excluded = [ "::FX::FXACL::int_toWin32SecurityDescriptor" , "::FX::FXApp::dispatchEvent" *************** *** 154,155 **** --- 155,166 ---- deprecated = find_deprecated() + + def is_deprecated( decl ): + global deprecated + if None is decl.location: + return False + file_name = os.path.split( decl.location.file_name )[1] + return deprecated.has_key( file_name ) and decl.location.line in deprecated[ file_name ] + + def is_excluded( decl ): + return declarations.full_name( decl ) in to_be_excluded or is_deprecated( decl ) \ No newline at end of file Index: call_policies.py =================================================================== RCS file: /cvsroot/pygccxml/source/pyplusplus/examples/tnfox/call_policies.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** call_policies.py 31 Jan 2006 08:19:23 -0000 1.6 --- call_policies.py 29 Mar 2006 04:26:58 -0000 1.7 *************** *** 8,22 **** from environment import settings ! from pyplusplus import code_creators ! from pyplusplus.code_creators import return_self ! from pyplusplus.code_creators import return_internal_reference ! from pyplusplus.code_creators import with_custodian_and_ward ! from pyplusplus.code_creators import copy_const_reference ! from pyplusplus.code_creators import copy_non_const_reference ! from pyplusplus.code_creators import manage_new_object ! from pyplusplus.code_creators import reference_existing_object ! from pyplusplus.code_creators import return_by_value ! from pyplusplus.code_creators import return_opaque_pointer ! from pyplusplus.code_creators import return_value_policy db = { --- 8,22 ---- from environment import settings ! from pyplusplus import decl_wrappers ! from pyplusplus.decl_wrappers import return_self ! from pyplusplus.decl_wrappers import return_internal_reference ! from pyplusplus.decl_wrappers import with_custodian_and_ward ! from pyplusplus.decl_wrappers import copy_const_reference ! from pyplusplus.decl_wrappers import copy_non_const_reference ! from pyplusplus.decl_wrappers import manage_new_object ! from pyplusplus.decl_wrappers import reference_existing_object ! from pyplusplus.decl_wrappers import return_by_value ! from pyplusplus.decl_wrappers import return_opaque_pointer ! from pyplusplus.decl_wrappers import return_value_policy db = { *************** *** 73,77 **** , "::FX::FXBitmap::getData" : return_internal_reference() , "::FX::FXBitmapView::getBitmap" : return_internal_reference() - , "::FX::FXCharset::clear" : return_self() , "::FX::FXColorSelector::acceptButton" : return_internal_reference() , "::FX::FXColorSelector::cancelButton" : return_internal_reference() --- 73,76 ---- *************** *** 91,95 **** , "::FX::FXDirSelector::acceptButton" : return_internal_reference() , "::FX::FXDirSelector::cancelButton" : return_internal_reference() - , "::FX::FXDockBar::findDockAtSide" : return_value_policy( reference_existing_object ) , "::FX::FXDockBar::findDockNear" : return_value_policy( reference_existing_object ) , "::FX::FXDockBar::getDryDock" : return_value_policy( reference_existing_object ) --- 90,93 ---- *************** *** 207,211 **** , "::FX::FXId::getApp" : return_value_policy( reference_existing_object ) , "::FX::FXId::getEventLoop" : return_value_policy( reference_existing_object ) - , "::FX::FXId::getVisual" : return_value_policy( reference_existing_object ) , "::FX::FXImageFrame::getImage" : return_internal_reference() , "::FX::FXImage::getData" : return_internal_reference() --- 205,208 ---- *************** *** 259,264 **** , "::FX::FXMDIChild::getIcon" : return_internal_reference() , "::FX::FXMDIChild::getMenu" : return_internal_reference() - , "::FX::FXMDIChild::getWindowIcon" : return_internal_reference() - , "::FX::FXMDIChild::getWindowMenu" : return_internal_reference() , "::FX::FXMDIClient::getActiveChild" : return_internal_reference() , "::FX::FXMenuButton::getMenu" : return_internal_reference() --- 256,259 ---- *************** *** 283,287 **** , "::FX::FXOptionMenu::getCurrent" : return_internal_reference() , "::FX::FXOptionMenu::getMenu" : return_internal_reference() - , "::FX::FXOptionMenu::getPopup" : return_internal_reference() , "::FX::FXPopup::getGrabOwner" : return_internal_reference() , "::FX::FXPopup::getNextActive" : return_internal_reference() --- 278,281 ---- *************** *** 293,299 **** , "::FX::FXQuatd::adjust" : return_self() , "::FX::FXQuatf::adjust" : return_self() - , "::FX::FXRanged::clipTo" : return_self() , "::FX::FXRanged::include" : return_self() - , "::FX::FXRangef::clipTo" : return_self() , "::FX::FXRangef::include" : return_self() , "::FX::FXRealSpinner::getFont" : return_internal_reference() --- 287,291 ---- *************** *** 317,321 **** , "::FX::FXSpheref::include" : return_self() , "::FX::FXSpinner::getFont" : return_internal_reference() - , "::FX::FXSplashWindow::getFont" : return_internal_reference() , "::FX::FXSplashWindow::getIcon" : return_internal_reference() , "::FX::FXSplitter::findHSplit" : return_internal_reference() --- 309,312 ---- *************** *** 365,371 **** , "::FX::FXToggleButton::getAltIcon" : return_internal_reference() , "::FX::FXToolBar::findDockAtSide" : return_value_policy( reference_existing_object ) - , "::FX::FXToolBar::findDockNear" : return_value_policy( reference_existing_object ) - , "::FX::FXToolBar::getDryDock" : return_value_policy( reference_existing_object ) - , "::FX::FXToolBar::getWetDock" : return_value_policy( reference_existing_object ) , "::FX::FXToolTip::getFont" : return_internal_reference() , "::FX::FXTopWindow::getIcon" : return_value_policy( reference_existing_object ) --- 356,359 ---- *************** *** 442,446 **** , "::FX::QDir::entryInfoList" : return_internal_reference() , "::FX::QGZipDevice::GZData" : return_value_policy( reference_existing_object ) - , "::FX::QIODevice::permissions" : return_internal_reference() , "::FX::QMemArray<unsigned char>::data" : return_internal_reference() , "::FX::QMemArray<unsigned char>::assign" : return_self() --- 430,433 ---- |