[pygccxml-commit] SF.net SVN: pygccxml:[1567] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-01-13 23:29:52
|
Revision: 1567 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1567&view=rev Author: roman_yakovenko Date: 2009-01-13 23:29:45 +0000 (Tue, 13 Jan 2009) Log Message: ----------- adding support for anonymous structs Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/anonymous/ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript pyplusplus_dev/unittests/data/ctypes/include_algorithm/ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript Modified: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -9,14 +9,26 @@ import declaration_based from pygccxml import declarations +ctypes_base_classes = { + declarations.CLASS_TYPES.CLASS : 'Structure' + , declarations.CLASS_TYPES.UNION : 'Union' + , declarations.CLASS_TYPES.STRUCT : 'Structure' +} + class class_introduction_t(compound.compound_t, declaration_based.declaration_based_t): def __init__( self, class_ ): compound.compound_t.__init__(self) declaration_based.declaration_based_t.__init__( self, class_ ) + @property + def ctypes_base_class( self ): + global ctypes_base_classes + return ctypes_base_classes[ self.declaration.class_type ] + def _create_impl(self): result = [] - result.append( "class %s(ctypes.Structure):" % self.alias ) + result.append( "class %(alias)s(ctypes.%(base)s):" + % dict( alias=self.alias, base=self.ctypes_base_class ) ) result.append( self.indent( '"""class %s"""' % self.decl_identifier ) ) if self.creators: result.append( self.indent( '' ) ) Modified: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -4,6 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) import os +import algorithm import code_creator import ctypes_formatter import declaration_based @@ -19,8 +20,29 @@ code_creator.code_creator_t.__init__(self) declaration_based.declaration_based_t.__init__( self, class_ ) + def has_unnamed_type( self, var ): + type_ = declarations.remove_pointer( var.type ) + #~ type_ = declarations.remove_declarated( type_ ) + if declarations.class_traits.is_my_case( type_ ): + cls = declarations.class_traits.get_declaration( type_ ) + return bool( not cls.name ) + else: + return False + def _create_impl(self): result = [] + #~ import pdb + #~ pdb.set_trace() + + anonymous_vars = self.declaration.vars( self.has_unnamed_type, recursive=False, allow_empty=True ) + if anonymous_vars: + formated_vars = [] + for var in anonymous_vars: + formated_vars.append( '"%s"' % var.alias ) + result.append( '%(complete_py_name)s._anonymous_ = [%(vars)s]' + % dict( complete_py_name=self.complete_py_name + , vars=', '.join( formated_vars ) ) ) + result.append( '%(complete_py_name)s._fields_ = [ #class %(decl_identifier)s' % dict( complete_py_name=self.complete_py_name , decl_identifier=self.decl_identifier) ) @@ -35,7 +57,7 @@ vars.sort( key=lambda d: d.location.line ) for v in vars: result.append( self.indent( '("%(name)s", %(type)s),' - % dict( name=v.name + % dict( name=v.alias ,type=ctypes_formatter.as_ctype( v.type ) ) ) ) result.append( ']' ) return os.linesep.join( result ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -235,8 +235,6 @@ def visit_class(self): self.__dependencies_manager.add_exported( self.curr_decl ) if not self.curr_decl.opaque: - #fields definition should be recursive using the visitor - self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) if self.curr_decl.calldefs( self.__should_generate_code, recursive=False, allow_empty=True ): md_cc = code_creators.methods_definition_t( self.curr_decl ) self.__class2methods_def[ self.curr_decl ] = md_cc @@ -247,6 +245,9 @@ self.curr_decl = decl declarations.apply_visitor( self, decl ) self.curr_decl = class_ + #fields definition should be recursive using the visitor + #internal classes fields should be defined first + self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) else: cls_intro_cc = self.__class2introduction[ self.curr_decl ] cls_intro_cc.adopt_creator( code_creators.opaque_init_introduction_t( self.curr_decl ) ) Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -58,7 +58,7 @@ self.global_ns = self.__parse_declarations( files, gccxml_config ) self.__blob2decl = binary_parsers.merge_information( self.global_ns, exported_symbols_file ) - self.__include_declarations() + self.__apply_defaults() self.__code_creator = None if optimize_queries: @@ -89,7 +89,7 @@ continue self.logger.debug( 'discovered dependency %s - included' % str(dependency) ) dd = traits.get_declaration( dependency ) - dd.ignore = False + dd.include() def __include_parent_classes( self, decl ): self.logger.debug( 'including decl %s' % str(decl) ) @@ -99,7 +99,7 @@ break else: self.logger.debug( 'including parent class %s' % str(parent) ) - parent.ignore = False + parent.include() parent = parent.parent def __include_declarations( self ): @@ -113,6 +113,15 @@ self.__include_dependencies( d ) self.logger.debug( 'including decl %s - done' % str(d) ) + def __apply_defaults( self ): + self.__include_declarations() + anonymous_classes = self.global_ns.classes( '', recursive=True, allow_empty=True ) + anonymous_classes.alias = '_' + #TODO: check whether the anonymous class unique or not + #if 1 == len( anonymous.parent.classes( '', recursive=False ) ): + anonymous_vars = self.global_ns.vars( '', recursive=True, allow_empty=True ) + anonymous_vars.alias = '_' + def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns , library_path Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -141,9 +141,29 @@ udt = self.module_ref.create() self.failUnless( 1977 == self.module_ref.read_user_data(udt) ) self.module_ref.destroy( udt ) + +class include_algorithm_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'include_algorithm', *args, **keywd ) + def customize( self, mb ): + self.failUnless( mb.global_ns.class_( 'io_marker_t' ).ignore == False ) + def test(self): + self.failUnless( mb.module_ref.io_marker_t ) +class anonymous_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'anonymous', *args, **keywd ) + + def customize( self, mb ): + mb.class_( 'rgbai' ).include() + + def test(self): + c = self.module_ref.color() + c.r + c.val + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: @@ -151,6 +171,8 @@ suite.addTest( unittest.makeSuite(issues_tester_t)) suite.addTest( unittest.makeSuite(enums_tester_t)) suite.addTest( unittest.makeSuite(opaque_tester_t)) + suite.addTest( unittest.makeSuite(include_algorithm_tester_t)) + suite.addTest( unittest.makeSuite(anonymous_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,3 @@ +#include "anonymous.h" + +void do_smth( color ){} Added: pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,26 @@ +#pragma once +#include "libconfig.h" + + +struct EXPORT_SYMBOL rgbai{ + struct { + float r,g,b,a; + }; + int i; +}; + +struct EXPORT_SYMBOL color{ + union{ + struct { + float r,g,b,a; + }; + float val[4]; + }; +}; + +struct { + int x; +} unnamed_struct_with_mem_var_x; + +void EXPORT_SYMBOL do_smth( color ); + Added: pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'anonymous' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +#include "include_algorithm.h" + +void do_nothing( io_file_t* ){ + return; +} Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,11 @@ +#pragma once + +#include "libconfig.h" + +struct EXPORT_SYMBOL io_marker_t{}; + +struct EXPORT_SYMBOL io_file_t{ + io_marker_t* io_marker; +}; + +void EXPORT_SYMBOL do_nothing( io_file_t* ); Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'include_algorithm' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -1,10 +1,12 @@ #pragma once -struct user_data_t{ +#include "libconfig.h" + +struct EXPORT_SYMBOL user_data_t{ int i; }; -user_data_t* create(); -int read_user_data(user_data_t*); -void destroy(user_data_t*); +user_data_t* EXPORT_SYMBOL create(); +int EXPORT_SYMBOL read_user_data(user_data_t*); +void EXPORT_SYMBOL destroy(user_data_t*); Modified: pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -6,9 +6,11 @@ #ifndef __unnamed_enums_to_be_exported_hpp__ #define __unnamed_enums_to_be_exported_hpp__ +#include "libconfig.h" + namespace unnamed_enums{ -struct color{ +struct EXPORT_SYMBOL color{ union{ struct { float r,g,b,a; @@ -17,10 +19,12 @@ }; }; -struct{ +struct { int x; } unnamed_struct_with_mem_var_x; +void EXPORT_SYMBOL do_smth( color ){} + } #endif//__unnamed_enums_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/sconstruct 2009-01-13 23:29:45 UTC (rev 1567) @@ -13,7 +13,9 @@ env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) -scripts = [ 'pof', 'issues', 'enums', 'opaque' ] +env.AppendUnique( CPPPATH=['#data'] ) + +scripts = [ 'pof', 'issues', 'enums', 'opaque', 'include_algorithm', 'anonymous' ] for s in scripts: SConscript( 'data/ctypes/%s/sconscript' % s , variant_dir='data/ctypes/%s/binaries' % s This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |