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