[pygccxml-commit] SF.net SVN: pygccxml:[1746] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
|
From: <rom...@us...> - 2009-08-08 19:00:59
|
Revision: 1746
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1746&view=rev
Author: roman_yakovenko
Date: 2009-08-08 19:00:48 +0000 (Sat, 08 Aug 2009)
Log Message:
-----------
making ctypes code generator treat right struct dependencies
Modified Paths:
--------------
pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py
pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py
pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py
Modified: pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py
===================================================================
--- pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-08-08 06:08:18 UTC (rev 1745)
+++ pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-08-08 19:00:48 UTC (rev 1746)
@@ -633,6 +633,9 @@
def __init__( self, *args, **keywd ):
raise RuntimeError( "Unable to create instance of opaque type." )
+class __mpz_struct(ctypes.Structure):
+ """class __mpz_struct"""
+
class __gmp_randstate_struct(ctypes.Structure):
"""class __gmp_randstate_struct"""
@@ -645,27 +648,12 @@
class __mpq_struct(ctypes.Structure):
"""class __mpq_struct"""
-class __mpz_struct(ctypes.Structure):
- """class __mpz_struct"""
-
-__mpq_struct._fields_ = [ #class __mpq_struct
- ("_mp_num", __mpz_struct),
- ("_mp_den", __mpz_struct),
-]
-
__mpz_struct._fields_ = [ #class __mpz_struct
("_mp_alloc", ctypes.c_int),
("_mp_size", ctypes.c_int),
("_mp_d", ctypes.POINTER( ctypes.c_ulong )),
]
-__mpf_struct._fields_ = [ #class __mpf_struct
- ("_mp_prec", ctypes.c_int),
- ("_mp_size", ctypes.c_int),
- ("_mp_exp", ctypes.c_long),
- ("_mp_d", ctypes.POINTER( ctypes.c_ulong )),
-]
-
__gmp_randstate_struct._._fields_ = [ #class __gmp_randstate_struct
("_mp_lc", ctypes.c_void_p),
]
@@ -677,6 +665,18 @@
("_mp_algdata", __gmp_randstate_struct._),
]
+__mpf_struct._fields_ = [ #class __mpf_struct
+ ("_mp_prec", ctypes.c_int),
+ ("_mp_size", ctypes.c_int),
+ ("_mp_exp", ctypes.c_long),
+ ("_mp_d", ctypes.POINTER( ctypes.c_ulong )),
+]
+
+__mpq_struct._fields_ = [ #class __mpq_struct
+ ("_mp_num", __mpz_struct),
+ ("_mp_den", __mpz_struct),
+]
+
gmpq_add_type = ctypes.CFUNCTYPE( None, ctypes.POINTER( __mpq_struct ), ctypes.POINTER( __mpq_struct ), ctypes.POINTER( __mpq_struct ) )
gmpq_add = gmpq_add_type( ( libgmp_lib.undecorated_names["extern void __gmpq_add(mpq_ptr arg0, mpq_srcptr arg1, mpq_srcptr arg2) [free function]"], libgmp_lib ) )
Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py
===================================================================
--- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-08-08 06:08:18 UTC (rev 1745)
+++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-08-08 19:00:48 UTC (rev 1746)
@@ -70,29 +70,6 @@
return decl in self.__exported_decls
return True
- #~ def __prepare_decls( self, global_ns ):
- #~ to_be_exposed = []
- #~ for decl in declarations.make_flatten( global_ns ):
- #~ if decl.ignore:
- #~ continue
-
- #~ if not decl.exportable:
- #~ #leave only decls that user wants to export and that could be exported
- #~ self.__print_readme( decl )
- #~ continue
-
- #~ if decl.already_exposed:
- #~ #check wether this is already exposed in other module
- #~ continue
-
- #~ if isinstance( decl.parent, declarations.namespace_t ):
- #~ #leave only declarations defined under namespace, but remove namespaces
- #~ to_be_exposed.append( decl )
-
- #~ self.__print_readme( decl )
-
- #~ return to_be_exposed
-
def __contains_exported( self, decl ):
return bool( decl.decls( self.__should_generate_code, recursive=True, allow_empty=True ) )
@@ -104,10 +81,13 @@
self.__class2introduction[ class_ ] = ci_creator
cc.adopt_creator( ci_creator )
classes = class_.classes( recursive=False, allow_empty=True)
- classes = sort_algorithms.sort_classes( classes )
+ classes = sort_algorithms.sort_classes( classes, include_vars=True )
for internal_class in classes:
self.__add_class_introductions( ci_creator, internal_class )
+ if not class_.opaque:
+ self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( class_ ) )
+
def create(self ):
"""
create and return the module for the extension - code creators tree root
@@ -134,7 +114,7 @@
f = lambda cls: self.__should_generate_code( cls ) \
and isinstance( cls.parent, declarations.namespace_t )
ns_classes = self.global_ns.classes( f, recursive=True, allow_empty=True)
- ns_classes = sort_algorithms.sort_classes( ns_classes )
+ ns_classes = sort_algorithms.sort_classes( ns_classes, include_vars=True )
for class_ in ns_classes:
self.__add_class_introductions( self.__class_ccs, class_ )
@@ -241,9 +221,6 @@
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/creators_factory/sort_algorithms.py
===================================================================
--- pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py 2009-08-08 06:08:18 UTC (rev 1745)
+++ pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py 2009-08-08 19:00:48 UTC (rev 1746)
@@ -12,9 +12,10 @@
BLACK = 2
class class_organizer_t(object):
- def __init__( self, decls ):
+ def __init__( self, decls, include_vars=False):
object.__init__( self )
+ self.__include_vars = include_vars
self.__classes = filter( lambda x: isinstance( x, declarations.class_t )
, decls )
self.__classes.sort( lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) )
@@ -66,6 +67,19 @@
if top_class_inst:
i_depend_on_them.add( full_name( top_class_inst ) )
+ if self.__include_vars:
+ vars = filter( lambda decl: isinstance( decl, declarations.variable_t )
+ , declarations.make_flatten( class_ ))
+ for var in vars:
+ if declarations.is_pointer( var.type ):
+ continue
+ base_type = declarations.base_type( var.type )
+ if not isinstance( base_type, declarations.declarated_t ):
+ continue
+ top_class_inst = self.__get_top_class_inst( base_type.declaration )
+ if top_class_inst:
+ i_depend_on_them.add( full_name( top_class_inst ) )
+
for internal_cls in class_.classes(allow_empty=True):
internal_cls_dependencies = self.__find_out_class_dependencies( internal_cls )
i_depend_on_them.update( internal_cls_dependencies )
@@ -170,8 +184,8 @@
result = self.__join_groups(groups)
return result
-def sort_classes( classes ):
- organizer = class_organizer_t( classes )
+def sort_classes( classes, include_vars=False ):
+ organizer = class_organizer_t( classes, include_vars=include_vars )
return organizer.desired_order()
def sort_calldefs( decls ):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|