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