[pygccxml-commit] SF.net SVN: pygccxml:[1402] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
|
From: <rom...@us...> - 2008-08-21 09:19:50
|
Revision: 1402
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1402&view=rev
Author: roman_yakovenko
Date: 2008-08-21 09:19:58 +0000 (Thu, 21 Aug 2008)
Log Message:
-----------
improve "already_exposed" functionality
Modified Paths:
--------------
pygccxml_dev/unittests/vector_traits_tester.py
pyplusplus_dev/pyplusplus/code_creators/declaration_based.py
pyplusplus_dev/pyplusplus/code_creators/module.py
pyplusplus_dev/pyplusplus/file_writers/single_file.py
pyplusplus_dev/pyplusplus/file_writers/writer.py
pyplusplus_dev/pyplusplus/module_creator/creator.py
pyplusplus_dev/pyplusplus/utils/__init__.py
pyplusplus_dev/unittests/already_exposed_tester.py
pyplusplus_dev/unittests/balanced_files_tester.py
pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp
pyplusplus_dev/unittests/exposed_decls_db_tester.py
pyplusplus_dev/unittests/fundamental_tester_base.py
pyplusplus_dev/unittests/split_module_tester.py
pyplusplus_dev/unittests/unions_tester.py
Added Paths:
-----------
pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp
Modified: pygccxml_dev/unittests/vector_traits_tester.py
===================================================================
--- pygccxml_dev/unittests/vector_traits_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pygccxml_dev/unittests/vector_traits_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -55,6 +55,11 @@
continue
self.failUnless( not traits.is_my_case( struct.typedef( 'container' ) ) )
+ def test_declaration( self ):
+ cnt = 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >@::std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >'
+ traits = declarations.find_container_traits( cnt )
+ self.failUnless( declarations.vector_traits is traits)
+
def create_suite():
suite = unittest.TestSuite()
suite.addTest( unittest.makeSuite(tester_t))
@@ -64,4 +69,4 @@
unittest.TextTestRunner(verbosity=2).run( create_suite() )
if __name__ == "__main__":
- run_suite()
\ No newline at end of file
+ run_suite()
Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -23,20 +23,19 @@
if name == None:
name = self.declaration.name
return algorithm.create_valid_name( name )
-
- def _get_declaration(self):
+
+ @property
+ def declaration(self):
+ """The declaration this code creator is based on.
+ @type: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>}
+ """
return self._decl
- declaration = property( _get_declaration,
- doc="""The declaration this code creator is based on.
- @type: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>}
- """)
def _get_alias_impl( self ):
return self.declaration.alias
- def _get_alias(self):
- return self._get_alias_impl()
-
+ def _get_alias(self):
+ return self._get_alias_impl()
def _set_alias(self, alias):
self.declaration.alias = alias
alias = property( _get_alias, _set_alias )
Modified: pyplusplus_dev/pyplusplus/code_creators/module.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/module.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/code_creators/module.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -11,7 +11,9 @@
import compound
import algorithm
import module_body
+import declaration_based
import include_directories
+from pygccxml import utils
class module_t(compound.compound_t):
"""This class represents the source code for the entire extension module.
@@ -179,3 +181,19 @@
def add_declaration_code( self, code, position ):
self.adopt_declaration_creator( custom.custom_text_t( code ) )
+
+ @utils.cached
+ def specially_exposed_decls(self):
+ """list of exposed declarations, which were not ``included``, but still
+ were exposed. For example, std containers.
+ """
+ decls = set()
+ #select all declaration based code creators
+ ccs = filter( lambda cc: isinstance( cc, declaration_based.declaration_based_t )
+ , algorithm.make_flatten_list( self ) )
+ #leave only "ignored"
+ ccs = filter( lambda cc: cc.declaration.ignore == True, ccs )
+
+ decls = map( lambda cc: cc.declaration, ccs )
+
+ return set( decls )
Modified: pyplusplus_dev/pyplusplus/file_writers/single_file.py
===================================================================
--- pyplusplus_dev/pyplusplus/file_writers/single_file.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/file_writers/single_file.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -23,9 +23,11 @@
target_dir = os.path.dirname( self.file_name )
if not target_dir:
target_dir = os.getcwd()
+ if not os.path.exists( target_dir ):
+ os.makedirs( target_dir )
headers = self.get_user_headers( [self.extmodule] )
map( lambda header: self.extmodule.add_include( header )
, headers )
self.write_code_repository( target_dir )
self.write_file( self.file_name, self.extmodule.create(), encoding=self.encoding )
- self.save_exposed_decls_db( target_dir )
\ No newline at end of file
+ self.save_exposed_decls_db( target_dir )
Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py
===================================================================
--- pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -32,7 +32,8 @@
if None is files_sum_repository:
self.__files_sum_repository = md5sum_repository.dummy_repository_t()
self.__exposed_decls_db = utils.exposed_decls_db_t()
- self.__exposed_decls_db.register_decls( extmodule.global_ns )
+ self.__exposed_decls_db.register_decls( extmodule.global_ns
+ , extmodule.specially_exposed_decls )
@property
def encoding( self ):
Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py
===================================================================
--- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -253,6 +253,21 @@
self.__extmodule.adopt_creators( uc_creators, insert_pos )
cls_creator.associated_decl_creators.extend( uc_creators )
+ def __get_exposed_containers(self):
+ """list of exposed declarations, which were not ``included``, but still
+ were exposed. For example, std containers
+
+ std containers exposed by Py++, even if the user didn't ``include`` them.
+ """
+ cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string )
+ used_containers = list( self.__types_db.used_containers )
+ used_containers = filter( lambda cls: cls.indexing_suite.include_files
+ , used_containers )
+ used_containers.sort( cmp_by_name )
+ used_containers = filter( lambda cnt: cnt.already_exposed == False
+ , used_containers )
+ return used_containers
+
def _treat_indexing_suite( self ):
def create_explanation(cls):
msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !'
@@ -271,17 +286,9 @@
creators = []
created_value_traits = set()
- cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string )
- used_containers = list( self.__types_db.used_containers )
- used_containers = filter( lambda cls: cls.indexing_suite.include_files
- , used_containers )
- used_containers.sort( cmp_by_name )
- for cls in used_containers:
+ for cls in self.__get_exposed_containers():
self.__print_readme( cls )
- if cls.already_exposed:
- continue
-
cls_creator = create_cls_cc( cls )
self.__dependencies_manager.add_exported( cls )
creators.append( cls_creator )
Modified: pyplusplus_dev/pyplusplus/utils/__init__.py
===================================================================
--- pyplusplus_dev/pyplusplus/utils/__init__.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/pyplusplus/utils/__init__.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -85,13 +85,17 @@
self.exposed_sign, self.key, self.normalized_name, self.signature \
= row.split( self.FIELD_DELIMITER )
+ def update_key( self, cls ):
+ self.key = cls.__name__
+
def __init_from_decl( self, decl ):
if decl.ignore:
self.exposed_sign = self.UNEXPOSED_DECL_SIGN
else:
self.exposed_sign = self.EXPOSED_DECL_SIGN
- self.key = decl.__class__.__name__
- self.signature = decl.decl_string
+ self.update_key( decl.__class__ )
+
+ self.signature = decl.create_decl_string( with_defaults=False )
if isinstance( decl, declarations.calldef_t ):
self.signature = self.signature + decl.function_type().decl_string
self.normalized_name = self.find_out_normalized_name( decl )
@@ -137,9 +141,8 @@
self.__registry[ row.key ][row.normalized_name] = [row]
else:
self.__registry[ row.key ][row.normalized_name].append(row)
-
- def __find_in_registry( self, decl ):
- row = self.row_t( decl )
+
+ def __find_row_in_registry( self, row ):
try:
decls = filter( lambda rrow: rrow.does_refer_same_decl( row )
, self.__registry[ row.key ][ row.normalized_name ] )
@@ -149,7 +152,24 @@
return None
except KeyError:
return None
-
+
+ def __find_in_registry( self, decl ):
+ row = self.row_t( decl )
+ found = self.__find_row_in_registry( row )
+ if found:
+ return found
+ if isinstance( decl, declarations.class_t ):
+ row.update_key( declarations.class_declaration_t )
+ found = self.__find_row_in_registry( row )
+ if found:
+ return found
+ if isinstance( decl, declarations.class_declaration_t ):
+ row.update_key( declarations.class_t )
+ found = self.__find_row_in_registry( row )
+ if found:
+ return found
+ return None
+
def is_exposed( self, decl ):
row = self.__find_in_registry( decl)
return row and self.row_t.EXPOSED_DECL_SIGN == row.exposed_sign
@@ -166,6 +186,15 @@
decl.ignore = True
decl.already_exposed = False
- def register_decls( self, global_ns ):
+ def register_decls( self, global_ns, special_decls ):
+ """register decls in the database
+
+ global_ns - reference to the global namespace object
+ special_decls - set of declarations, which were exposed, even so they
+ were not ``included``. For example std containers.
+ """
for decl in global_ns.decls():
- self.__update_registry( self.row_t( decl ) )
+ row = self.row_t( decl )
+ if decl in special_decls:
+ row.exposed_sign = row.EXPOSED_DECL_SIGN
+ self.__update_registry( row )
Modified: pyplusplus_dev/unittests/already_exposed_tester.py
===================================================================
--- pyplusplus_dev/unittests/already_exposed_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/already_exposed_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -12,24 +12,36 @@
import fundamental_tester_base
class tester_t( unittest.TestCase ):
- def test(self):
- exposed_db = utils.exposed_decls_db_t()
-
+ def test(self):
fpath = os.path.join( autoconfig.data_directory, 'already_exposed_to_be_exported.hpp' )
mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )]
, gccxml_path=autoconfig.gccxml.executable )
mb.global_ns.exclude()
mb.namespace( 'already_exposed' ).include()
- exposed_db.register_decls( mb.global_ns )
- exposed_db.save( autoconfig.build_dir )
- mb.register_module_dependency( autoconfig.build_dir )
- mb.class_( 'ae_derived' ).include()
+ mb.build_code_creator( 'already_exposed' )
+
+ already_exposed_dir = os.path.join( autoconfig.build_directory, 'already_exposed' )
+ mb.write_module( os.path.join( already_exposed_dir, 'already_exposed.cpp' ) )
+
+ #-----------------------------------------------------------------------
+
+ fpath = os.path.join( autoconfig.data_directory, 'already_exposed_2to_be_exported.hpp' )
+ mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )]
+ , gccxml_path=autoconfig.gccxml.executable )
+
+ mb.global_ns.exclude()
+ mb.namespace( 'to_be_exposed' ).include()
+ mb.build_code_creator( 'to_be_exposed' )
+
+ mb.register_module_dependency( already_exposed_dir )
- mb.build_code_creator( 'xxx' )
+ mb.build_code_creator( 'to_be_exposed' )
+ to_be_exposed_dir = os.path.join( autoconfig.build_directory, 'to_be_exposed' )
+ mb.write_module( os.path.join( to_be_exposed_dir, 'to_be_exposed.cpp' ) )
body = mb.code_creator.body
- self.failUnless( 1 == len( body.creators ) )
+ self.failUnless( 2 == len( body.creators ) )
ae_derived_code = body.creators[0].create()
self.failUnless( mb.class_( 'ae_base' ).decl_string in ae_derived_code )
Modified: pyplusplus_dev/unittests/balanced_files_tester.py
===================================================================
--- pyplusplus_dev/unittests/balanced_files_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/balanced_files_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -32,7 +32,7 @@
exposed_db = utils.exposed_decls_db_t()
- exposed_db.register_decls( mb.global_ns )
+ exposed_db.register_decls( mb.global_ns, [] )
exposed_db.save( autoconfig.build_dir )
mb.register_module_dependency( autoconfig.build_dir )
Added: pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp
===================================================================
--- pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp (rev 0)
+++ pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp 2008-08-21 09:19:58 UTC (rev 1402)
@@ -0,0 +1,24 @@
+// Copyright 2004 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)
+
+#ifndef __already_exposed_2to_be_exported_hpp__
+#define __already_exposed_2to_be_exported_hpp__
+
+#include "already_exposed_to_be_exported.hpp"
+#include <vector>
+#include <string>
+
+namespace to_be_exposed{
+
+struct ae_derived : public already_exposed::ae_base
+{};
+
+inline std::vector< std::string > do_nothing(){
+ return std::vector< std::string >();
+}
+
+}
+
+#endif//__already_exposed_2to_be_exported_hpp__
Modified: pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp
===================================================================
--- pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp 2008-08-21 09:19:58 UTC (rev 1402)
@@ -6,6 +6,9 @@
#ifndef __already_exposed_to_be_exported_hpp__
#define __already_exposed_to_be_exported_hpp__
+#include <vector>
+#include <string>
+
namespace already_exposed{
struct ae_t{};
@@ -14,9 +17,8 @@
struct ae_base{};
+void do_smth( const std::vector< std::string >& );
+
}
-
-struct ae_derived : public already_exposed::ae_base
-{};
-
+
#endif//__already_exposed_to_be_exported_hpp__
Modified: pyplusplus_dev/unittests/exposed_decls_db_tester.py
===================================================================
--- pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -69,7 +69,7 @@
global_ns.exclude()
ns.include()
- db.register_decls( global_ns )
+ db.register_decls( global_ns, [] )
for x in ns.decls(recursive=True):
self.failUnless( db.is_exposed( x ) == True )
Modified: pyplusplus_dev/unittests/fundamental_tester_base.py
===================================================================
--- pyplusplus_dev/unittests/fundamental_tester_base.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/fundamental_tester_base.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -54,14 +54,17 @@
irrelevant_decl_types = ( declarations.typedef_t
, declarations.namespace_t
, declarations.free_operator_t )
+ specially_exposed_decls = mb.code_creator.specially_exposed_decls
for d in mb.decls():
if not d.exportable:
continue
elif isinstance( d, declarations.free_operator_t ):
continue
elif d.ignore:
+ if d in specially_exposed_decls:
+ continue
if exposed_db.is_exposed( d ):
- i = 0
+ i = 0
self.failUnless( not exposed_db.is_exposed( d )
, '''Declaration "%s" is NOT exposed, but for some reason it is marked as such.'''
% str( d ) )
Modified: pyplusplus_dev/unittests/split_module_tester.py
===================================================================
--- pyplusplus_dev/unittests/split_module_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/split_module_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -32,7 +32,7 @@
exposed_db = utils.exposed_decls_db_t()
- exposed_db.register_decls( mb.global_ns )
+ exposed_db.register_decls( mb.global_ns, [] )
exposed_db.save( autoconfig.build_dir )
mb.register_module_dependency( autoconfig.build_dir )
Modified: pyplusplus_dev/unittests/unions_tester.py
===================================================================
--- pyplusplus_dev/unittests/unions_tester.py 2008-08-20 20:07:03 UTC (rev 1401)
+++ pyplusplus_dev/unittests/unions_tester.py 2008-08-21 09:19:58 UTC (rev 1402)
@@ -44,8 +44,9 @@
obj2.set_i( 1977 )
self.failUnless( obj2.i == 1977 )
- mdll = ctypes.cdll.LoadLibrary( module.__file__ )
- self.failUnless( 4 == mdll.mmm( 1, 3 ) )
+ if 'win' not in sys.platform:
+ mdll = ctypes.cdll.LoadLibrary( module.__file__ )
+ self.failUnless( 4 == mdll.mmm( 1, 3 ) )
def create_suite():
suite = unittest.TestSuite()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|