[pygccxml-commit] SF.net SVN: pygccxml:[1504] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-12-26 09:43:51
|
Revision: 1504 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1504&view=rev Author: roman_yakovenko Date: 2008-12-26 09:43:47 +0000 (Fri, 26 Dec 2008) Log Message: ----------- first code creators classes for ctypes Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/bpmodule.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/import_.py pyplusplus_dev/pyplusplus/code_creators/library_reference.py pyplusplus_dev/pyplusplus/code_creators/name_mappings.py pyplusplus_dev/pyplusplus/creators_factory/__init__.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py Property Changed: ---------------- pyplusplus_dev/pyplusplus/cpptypes/mydll/ pyplusplus_dev/pyplusplus/cpptypes/mydll/release/ Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -15,6 +15,7 @@ """ from code_creator import code_creator_t +from code_creator import separator_t from compound import compound_t from algorithm import (make_flatten, make_flatten_list, make_flatten_generator) @@ -141,6 +142,8 @@ from ctypes_integration_creators import expose_sizeof_t #pure ctypes +from ctypes_module import ctypes_module_t from import_ import import_t from library_reference import library_reference_t -from name_mappings import name_mapping_t +from name_mappings import name_mappings_t + Modified: pyplusplus_dev/pyplusplus/code_creators/bpmodule.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -126,15 +126,17 @@ def _create_impl(self): self.do_include_dirs_optimization() index = 0 - includes = [] + code = [] for index in range( len( self.creators ) ): if not isinstance( self.creators[index], include.include_t ): break else: - includes.append( self.creators[index].create() ) - code = compound.compound_t.create_internal_code( self.creators[index:] ) - code = self.unindent(code) - return os.linesep.join( includes ) + 2 * os.linesep + code + os.linesep + code.append( self.creators[index].create() ) + if code: + code.append( 2* os.linesep ) + code.append( self.create_internal_code( self.creators[index:], indent_code=False )) + code.append( os.linesep ) + return os.linesep.join( code ) def add_include( self, header, user_defined=True, system=False ): creator = include.include_t( header=header, user_defined=user_defined, system=system ) Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -63,7 +63,12 @@ @type: L{target_configuration_t} """) - def _get_top_parent(self): + @property + def top_parent(self): + """top_parent - reference to top parent code creator + + @type: L{code_creator_t} + """ parent = self.parent me = self while True: @@ -72,11 +77,6 @@ else: me = parent parent = me.parent - """top_parent - reference to top parent code creator""" - top_parent = property( _get_top_parent, - doc="""Root of the code creator tree. - @type: L{code_creator_t} - """) def _create_impl(self): """ @@ -185,3 +185,16 @@ return true_ else: return false_ + + +class separator_t(code_creator_t): + """Creates Python import directive""" + def __init__( self, num=1): + code_creator_t.__init__(self) + self.__code = os.linesep * num + + def _create_impl(self): + return self.__code + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -13,11 +13,11 @@ @param parent: Parent code creator. @type parent: L{code_creator_t} """ - code_creator.code_creator_t.__init__( self ) + code_creator.code_creator_t.__init__( self ) self._creators = [] - + def _get_creators(self): - return self._creators + return self._creators creators = property(_get_creators, doc="""A list of children nodes. @type: list of L{code_creator_t}""") @@ -58,10 +58,10 @@ @type creator: L{code_creator_t} """ creator.parent = None - del self._creators[ self._creators.index( creator ) ] + del self._creators[ self._creators.index( creator ) ] @staticmethod - def create_internal_code( creators ): + def create_internal_code( creators, indent_code=True ): """Concatenate the code from a list of code creators. @param creators: A list with code creators @@ -70,20 +70,20 @@ """ internals = map( lambda expr: expr.create(), creators ) internals = filter(None, internals ) - internals = map( lambda code: code_creator.code_creator_t.indent( code ) - , internals ) + if indent_code: + internals = map( lambda code: code_creator.code_creator_t.indent( code ) + , internals ) for index in range( len( internals ) - 1): internals[index] = internals[index] + os.linesep return os.linesep.join( internals ) - + def get_system_headers( self, recursive=False, unique=False ): files = [ "boost/python.hpp" ] files.extend( self._get_system_headers_impl() ) if recursive: - for creator in self._creators: + for creator in self._creators: files.extend( creator.get_system_headers(recursive, unique=False) ) files = filter( None, files ) if unique: files = self.unique_headers( files ) return files - \ No newline at end of file Added: pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -0,0 +1,31 @@ +# Copyright 2004-2008 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import module +import import_ +import library_reference +from pygccxml import utils + +class ctypes_module_t(module.module_t): + """This class represents the source code for the entire extension module. + + The root of the code creator tree is always a module_t object. + """ + def __init__(self, global_ns): + """Constructor. + """ + module.module_t.__init__(self, global_ns) + + def _create_impl(self): + return self.create_internal_code( self.creators, indent_code=False ) + + @utils.cached + def library_var_name(self): + for creator in self.creators: + if isinstance( creator, library_reference.library_reference_t ): + return creator.library_var_name + else: + raise RuntimeError( "Internal Error: library_reference_t creator was not created" ) Modified: pyplusplus_dev/pyplusplus/code_creators/import_.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -14,7 +14,7 @@ self._module_name = module_name def _create_impl(self): - return 'import %(module)s' % dict( module=self.module_name ) + return 'import %(module)s' % dict( module=self._module_name ) def _get_system_headers_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/library_reference.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -3,25 +3,36 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import os import code_creator +from pyplusplus import decl_wrappers - class library_reference_t(code_creator.code_creator_t): """Creates reference to a library""" - def __init__( self, library_var_name, library_path, is_cpp_library ): + def __init__( self, library_path, library_var_name=None, is_cpp_library=True ): code_creator.code_creator_t.__init__(self) self._library_path = library_path self._is_cpp_library = is_cpp_library - self._library_var_name = library_var_name + self._library_var_name = self.__create_library_var_name( library_path, library_var_name ) + @property + def library_var_name(self): + return self._library_var_name + + def __create_library_var_name( self, library_path, library_var_name ): + if library_var_name: + return library_var_name + else: + basename = os.path.splitext( os.path.basename( library_path ) )[0] + return decl_wrappers.algorithm.create_valid_name( basename ) + def _create_impl(self): return '%(var)s = ctypes.%(loader)s( r"%(path)s" )' \ - % dict( var=self._library_var_name + % dict( var=self.library_var_name , loader=self.iif( self._is_cpp_library, 'CPPDLL', 'CDLL' ) , path=self._library_path ) - def _get_system_headers_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/name_mappings.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -7,14 +7,13 @@ import code_creator -class name_mapping_t(code_creator.code_creator_t): +class name_mappings_t(code_creator.code_creator_t): """creates dictionery { [un]decorated name : [un]decorated name }""" def __init__( self, exported_symbols ): code_creator.code_creator_t.__init__(self) self._exported_symbols = exported_symbols - def _create_impl(self): tmpl = '"%s" : "%s", ' items_decorated = [] @@ -24,7 +23,8 @@ items_undecorated.append( tmpl % ( undecorated, blob ) ) result = [] - result.append('%s.undecorated_names = {#mapping between decorated and undecorated names' % self._dictionary_var_name ) + result.append( '%s.undecorated_names = {#mapping between decorated and undecorated names' + % self.top_parent.library_var_name ) for s in items_undecorated: result.append( self.indent( s ) ) for s in items_decorated: @@ -32,7 +32,6 @@ result.append( '}' ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): return [] Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll ___________________________________________________________________ Added: svn:ignore + Debug *.ncb *.suo *.user Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll/release ___________________________________________________________________ Added: svn:ignore + *.htm Modified: pyplusplus_dev/pyplusplus/creators_factory/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -4,6 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) from bpcreator import bpcreator_t +from ctypes_creator import ctypes_creator_t from sort_algorithms import sort_classes as findout_desired_order from call_policies_resolver import built_in_resolver_t Added: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py (rev 0) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -0,0 +1,134 @@ +# Copyright 2004-2008 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + + +import dependencies_manager +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_creators +from pyplusplus import code_repository +from pyplusplus import _logging_ + +ACCESS_TYPES = declarations.ACCESS_TYPES +VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES + +class ctypes_creator_t( declarations.decl_visitor_t ): + def __init__( self + , global_ns + , library_path + , exported_symbols + , doc_extractor=None ): + declarations.decl_visitor_t.__init__(self) + self.logger = _logging_.loggers.module_builder + self.decl_logger = _logging_.loggers.declarations + + self.__library_path = library_path + self.__exported_symbols = exported_symbols + + self.__extmodule = code_creators.ctypes_module_t( global_ns ) + self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) + + #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) + #~ self.__decls = sort_algorithms.sort( prepared_decls ) + self.curr_decl = global_ns + self.curr_code_creator = self.__extmodule + + def __print_readme( self, decl ): + readme = decl.readme() + if not readme: + return + + if not decl.exportable: + reason = readme[0] + readme = readme[1:] + self.decl_logger.warn( "%s;%s" % ( decl, reason ) ) + + for msg in readme: + self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) + + #~ def __prepare_decls( self, global_ns, doc_extractor ): + #~ 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 ) + + #~ if doc_extractor: + #~ decl.documentation = doc_extractor( decl ) + + #~ self.__print_readme( decl ) + + #~ return to_be_exposed + + + def create(self ): + """Create and return the module for the extension. + + @returns: Returns the root of the code creators tree + @rtype: L{module_t<code_creators.module_t>} + """ + # Invoke the appropriate visit_*() method on all decls + self.__extmodule.adopt_creator( code_creators.import_t( 'ctypes' ) ) + self.__extmodule.adopt_creator( code_creators.separator_t() ) + self.__extmodule.adopt_creator( code_creators.library_reference_t( self.__library_path ) ) + self.__extmodule.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) + self.__extmodule.adopt_creator( code_creators.separator_t() ) + + declarations.apply_visitor( self, self.curr_decl ) + + self.__dependencies_manager.inform_user() + + return self.__extmodule + + def visit_member_function( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_constructor( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_destructor( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_member_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_casting_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_free_function( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_free_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_class_declaration(self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_class(self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_enumeration(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_namespace(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_typedef(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_variable(self): + self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -92,18 +92,13 @@ if isinstance( d, decls_package.class_t ): d.parent.include() - def build_code_creator( self ): - pass - #~ creator = creators_factory.creator_t( self.global_ns - #~ , module_name - #~ , boost_python_ns_name - #~ , call_policies_resolver_ - #~ , types_db - #~ , target_configuration - #~ , enable_indexing_suite - #~ , doc_extractor) - #~ self.__code_creator = creator.create() - #~ return self.__code_creator + def build_code_creator( self, library_path, doc_extractor=None ): + creator = creators_factory.ctypes_creator_t( self.global_ns + , library_path + , self.__blob2undecorated + , doc_extractor) + self.__code_creator = creator.create() + return self.__code_creator @property def code_creator( self ): Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -19,6 +19,8 @@ def test(self): mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) + mb.build_code_creator( self.symbols_file ) + print mb.code_creator.create() def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |