[pygccxml-commit] SF.net SVN: pygccxml:[1528] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-01-04 20:29:41
|
Revision: 1528 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1528&view=rev Author: roman_yakovenko Date: 2009-01-04 20:29:35 +0000 (Sun, 04 Jan 2009) Log Message: ----------- adding more unittests Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/dependencies.py pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py pyplusplus_dev/pyplusplus/code_creators/methods_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/pof/sconscript pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/issues/ pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp pyplusplus_dev/unittests/data/ctypes/issues/issues.h pyplusplus_dev/unittests/data/ctypes/issues/sconscript Property Changed: ---------------- pygccxml_dev/unittests/ pygccxml_dev/unittests/data/msvc/ pygccxml_dev/unittests/data/msvc_build/ Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -61,18 +61,27 @@ return None @staticmethod + def they_depend_on_me( decl ): + """returns set of declarations. every item in the returned set, depends on a + declaration from the input""" + import class_declaration #prevent cyclic imports + to_be_included = set() + for dependency_info in decl.i_depend_on_them(): + ddecl = dependency_info.find_out_depend_on_declaration() + if ddecl: + to_be_included.add( ddecl ) + + if isinstance( decl.parent, class_declaration.class_t ): + to_be_included.add( decl.parent ) + return to_be_included + + @staticmethod def they_depend_on_us( decls ): """returns set of declarations. every item in the returned set, depends on a declaration from the input""" import class_declaration #prevent cyclic imports to_be_included = set() for decl in decls: - for dependency_info in decl.i_depend_on_them(): - ddecl = dependency_info.find_out_depend_on_declaration() - if ddecl: - to_be_included.add( ddecl ) - - if isinstance( decl.parent, class_declaration.class_t ): - to_be_included.add( decl.parent ) + to_be_included.update( dependency_info_t.they_depend_on_me( decl ) ) return to_be_included Property changes on: pygccxml_dev/unittests ___________________________________________________________________ Modified: svn:ignore - *.pyc temp *.pdbrc + *.pyc temp *.pdbrc *.bak Property changes on: pygccxml_dev/unittests/data/msvc ___________________________________________________________________ Modified: svn:ignore - Release + Release Debug *.suo Property changes on: pygccxml_dev/unittests/data/msvc_build ___________________________________________________________________ Modified: svn:ignore - Debug + Debug *.ncb *.suo *.user Modified: pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py =================================================================== --- pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -4,9 +4,9 @@ import ctypes_utils -easybmp = ctypes.CPPDLL( r"E:\development\language-binding\pyplusplus_dev\examples\pyeasybmp_dev\easybmp\binaries\easybmp.dll" ) +easybmplib = ctypes.CPPDLL( r"E:\development\language-binding\pyplusplus_dev\examples\pyeasybmp_dev\easybmp\binaries\easybmp.dll" ) -easybmp.undecorated_names = {#mapping between decorated and undecorated names +easybmplib.undecorated_names = {#mapping between decorated and undecorated names "unsigned short FlipWORD(unsigned short)" : "?FlipWORD@@YAGG@Z", "BMP::BMP(void)" : "??0BMP@@QAE@XZ", "bool BMP::SetPixel(int,int RGBApixel)" : "?SetPixel@BMP@@QAE_NHHURGBApixel@@@Z", @@ -249,7 +249,7 @@ ("bfOffBits", ctypes.c_uint), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMFH, "BMFH", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMFH, "BMFH" ) BMFH._methods_ = { #class non-virtual member functions definition list "__init__" : mfcreator.multi_method() .register( mfcreator.default_constructor() ) @@ -275,7 +275,7 @@ ("biClrImportant", ctypes.c_uint), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMIH, "BMIH", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMIH, "BMIH" ) BMIH._methods_ = { #class non-virtual member functions definition list "__init__" : mfcreator.multi_method() .register( mfcreator.default_constructor() ) @@ -294,7 +294,7 @@ ("Alpha", ctypes.c_ubyte), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, RGBApixel, "RGBApixel", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, RGBApixel, "RGBApixel" ) RGBApixel._methods_ = { #class non-virtual member functions definition list } @@ -314,7 +314,7 @@ ("SizeOfMetaData2", ctypes.c_int), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMP, "BMP", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMP, "BMP" ) BMP._methods_ = { #class non-virtual member functions definition list "TellBitDepth" : mfcreator( "int BMP::TellBitDepth(void)", restype=ctypes.c_int ), @@ -372,21 +372,21 @@ } del mfcreator -Square = getattr( easybmp, easybmp.undecorated_names["double Square(double)"] ) +Square = getattr( easybmplib, easybmplib.undecorated_names["double Square(double)"] ) Square.restype = ctypes.c_double Square.argtypes = [ ctypes.c_double ] -IntSquare = getattr( easybmp, easybmp.undecorated_names["int IntSquare(int)"] ) +IntSquare = getattr( easybmplib, easybmplib.undecorated_names["int IntSquare(int)"] ) IntSquare.restype = ctypes.c_int IntSquare.argtypes = [ ctypes.c_int ] -FlipDWORD = getattr( easybmp, easybmp.undecorated_names["unsigned int FlipDWORD(unsigned int)"] ) +FlipDWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned int FlipDWORD(unsigned int)"] ) FlipDWORD.restype = ctypes.c_uint FlipDWORD.argtypes = [ ctypes.c_uint ] -IsBigEndian = getattr( easybmp, easybmp.undecorated_names["bool IsBigEndian(void)"] ) +IsBigEndian = getattr( easybmplib, easybmplib.undecorated_names["bool IsBigEndian(void)"] ) IsBigEndian.restype = ctypes.c_bool -FlipWORD = getattr( easybmp, easybmp.undecorated_names["unsigned short FlipWORD(unsigned short)"] ) +FlipWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned short FlipWORD(unsigned short)"] ) FlipWORD.restype = ctypes.c_ushort FlipWORD.argtypes = [ ctypes.c_ushort ] Modified: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -37,12 +37,16 @@ del scope[0] #del :: from the global namespace del scope[-1] #del self from the list - result.append( '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' - % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name - , library_var_name=self.top_parent.library_var_name - , complete_py_name=self.complete_py_name - , class_name=self.declaration.name - , ns='::'.join(scope) ) ) + tmpl = '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' + if not scope: + tmpl = '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s" )' + + result.append( tmpl % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name + , library_var_name=self.top_parent.library_var_name + , complete_py_name=self.complete_py_name + , class_name=self.declaration.name + , ns='::'.join(scope) ) ) + result.append( '%(complete_py_name)s._methods_ = { #class non-virtual member functions definition list' % dict( complete_py_name=self.complete_py_name ) ) result.append( compound.compound_t.create_internal_code( self.creators ) ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -108,8 +108,7 @@ classes = class_.classes( recursive=False, allow_empty=True) classes = sort_algorithms.sort_classes( classes ) for internal_class in classes: - if self.__contains_exported( internal_class ): - self.__add_class_introductions( ci_creator, internal_class ) + self.__add_class_introductions( ci_creator, internal_class ) def create(self ): """Create and return the module for the extension. Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -88,14 +88,31 @@ included_decls = set() included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) included_decls.update( self.global_ns.variables( is_exported, allow_empty=True, recursive=True ) ) - #include declarations, on which exported declarations depend - they_depend_on_us = decls_package.dependency_info_t.they_depend_on_us - included_decls.update( they_depend_on_us( included_decls ) ) + + they_depend_on_me = decls_package.dependency_info_t.they_depend_on_me for d in included_decls: d.include() - if isinstance( d, decls_package.class_t ): - d.top_class.include() + self.logger.info( 'including decl %s' % str(d) ) + parent = d.parent + while True: + if isinstance( parent, decls_package.namespace_t ): + break + else: + self.logger.info( 'including parent class %s' % str(parent) ) + parent.ignore = False + parent = parent.parent + for dependency in they_depend_on_me( d ): + self.logger.info( 'discovered dependency %s' % str(dependency) ) + #include declarations, on which exported declarations depend + #I need this for classes, referenced by function arguments + decls_traits = ( decls_package.class_traits, decls_package.class_declaration_traits, decls_package.enum_traits ) + for traits in decls_traits: + if traits.is_my_case( dependency ): + self.logger.info( 'discovered dependency %s - included' % str(dependency) ) + traits.get_declaration( dependency ).ignore = False + self.logger.info( 'including decl %s - done' % str(d) ) + 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-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -11,6 +11,7 @@ from pyplusplus.module_builder import ctypes_module_builder_t class ctypes_base_tester_t(unittest.TestCase): + _module_ref_ = None def __init__( self, base_name, *args, **keywd ): unittest.TestCase.__init__( self, *args, **keywd ) @@ -33,22 +34,23 @@ return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' ) def setUp( self ): - if ctypes_base_tester_t._module_ref_: - return - + if self.base_name in sys.modules: + return sys.modules[ self.base_name ] + #~ import pdb + #~ pdb.set_trace() autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) mb.build_code_creator( self.symbols_file ) mb.write_module( os.path.join( self.project_dir, 'binaries', self.base_name + '.py' ) ) sys.path.insert( 0, os.path.join( self.project_dir, 'binaries' ) ) - ctypes_base_tester_t._module_ref_ = __import__( self.base_name ) + __import__( self.base_name ) @property def module_ref(self): - return self._module_ref_ + return sys.modules[ self.base_name ] -class tester_t( ctypes_base_tester_t ): +class pof_tester_t( ctypes_base_tester_t ): def __init__( self, *args, **keywd ): ctypes_base_tester_t.__init__( self, 'pof', *args, **keywd ) @@ -84,10 +86,24 @@ #~ obj2 = obj1.clone() #~ self.fail( obj1.get_value() == obj2.get_value() ) + +class issues_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'issues', *args, **keywd ) + + def test_return_by_value(self): + x = self.module_ref.return_by_value_t() + result = x.add( 32, 2 ).result + self.failUnless( 34 == result, "Expected result 34, got %d" % result) + + def test_free_fun_add( self ): + self.failUnless( 1977 == self.module_ref.add( 77, 1900 ) ) + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: - suite.addTest( unittest.makeSuite(tester_t)) + suite.addTest( unittest.makeSuite(pof_tester_t)) + suite.addTest( unittest.makeSuite(issues_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,5 @@ +#include "issues.h" + +int add( int i, int j){ + return i + j; +} Added: pyplusplus_dev/unittests/data/ctypes/issues/issues.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/issues.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/issues.h 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,13 @@ +#pragma once + + +struct __declspec(dllexport) return_by_value_t{ +public: + struct result_t{ int i; int j; int result; }; + result_t add( int i, int j ){ + result_t r = { i, j, i + j}; + return r; + } +}; + +int __declspec(dllexport) add( int, int ); Added: pyplusplus_dev/unittests/data/ctypes/issues/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/sconscript 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'issues' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/data/ctypes/pof/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/pof/sconscript 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/data/ctypes/pof/sconscript 2009-01-04 20:29:35 UTC (rev 1528) @@ -1,7 +1,5 @@ Import('*') target_name = 'pof' -shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] - , LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) - +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/sconstruct 2009-01-04 20:29:35 UTC (rev 1528) @@ -11,8 +11,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"] ) -SConscript( 'data/ctypes/pof/sconscript' - , variant_dir='data/ctypes/pof/binaries' - , duplicate=0 - , exports=["env"] ) - +scripts = [ 'pof', 'issues' ] +for s in scripts: + SConscript( 'data/ctypes/%s/sconscript' % s + , variant_dir='data/ctypes/%s/binaries' % s + , duplicate=0 + , exports=["env"] ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |