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