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