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