Thread: [pygccxml-commit] SF.net SVN: pygccxml: [1063] pygccxml_dev (Page 2)
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-06-18 14:27:28
|
Revision: 1063 http://svn.sourceforge.net/pygccxml/?rev=1063&view=rev Author: roman_yakovenko Date: 2007-06-18 07:27:30 -0700 (Mon, 18 Jun 2007) Log Message: ----------- adding another set of containers to remove_defaults functionality Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/unittests/data/remove_template_defaults.hpp pygccxml_dev/unittests/remove_template_defaults_tester.py Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-18 07:17:19 UTC (rev 1062) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-18 14:27:30 UTC (rev 1063) @@ -37,7 +37,7 @@ class recursive_impl: @staticmethod - def decorated_call( cls_name, text, doit ): + def decorated_call_prefix( cls_name, text, doit ): has_text = cls_name.startswith( text ) if has_text: cls_name = cls_name[ len( text ): ] @@ -47,6 +47,16 @@ return answer @staticmethod + def decorated_call_suffix( cls_name, text, doit ): + has_text = cls_name.endswith( text ) + if has_text: + cls_name = cls_name[: len( text )] + answer = doit( cls_name ) + if has_text: + answer = answer + text + return answer + + @staticmethod def erase_call( cls_name ): global find_container_traits c_traits = find_container_traits( cls_name ) @@ -57,9 +67,11 @@ @staticmethod def erase_recursive( cls_name ): ri = defaults_eraser.recursive_impl - no_std = lambda cls_name: ri.decorated_call( cls_name, 'std::', ri.erase_call ) - no_const = lambda cls_name: ri.decorated_call( cls_name, 'const ', no_std ) - return no_const( cls_name ) + no_std = lambda cls_name: ri.decorated_call_prefix( cls_name, 'std::', ri.erase_call ) + no_stdext = lambda cls_name: ri.decorated_call_prefix( cls_name, 'stdext::', no_std ) + no_const = lambda cls_name: ri.decorated_call_prefix( cls_name, 'const ', no_stdext ) + no_end_const = lambda cls_name: ri.decorated_call_suffix( cls_name, ' const', no_const ) + return no_end_const( cls_name ) @staticmethod def erase_recursive( cls_name ): @@ -145,6 +157,53 @@ , [ defaults_eraser.erase_recursive( key_type ) , defaults_eraser.erase_recursive( mapped_type )] ) + + @staticmethod + def erase_hash_allocator( cls_name + , default_hash='stdext::hash_compare' + , default_compare='std::less' + , default_allocator='std::allocator' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 3 != len( c_args ): + return + value_type = c_args[0] + tmpl = string.Template( "$container< $value_type, $hash<$value_type, $less<$value_type> >, $allocator<$value_type> >" ) + tmpl = tmpl.substitute( container=c_name + , value_type=value_type + , hash=default_hash + , less=default_compare + , allocator=default_allocator ) + if defaults_eraser.normalize( cls_name ) == defaults_eraser.normalize( tmpl ): + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) + + + @staticmethod + def erase_hashmap_compare_allocator( cls_name + , default_hash='stdext::hash_compare' + , default_compare='std::less' + , default_allocator='std::allocator' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 4 != len( c_args ): + return + key_type = c_args[0] + mapped_type = c_args[1] + tmpl = string.Template( "$container< $key_type, $mapped_type, $hash<$key_type, $less<$key_type> >, $allocator< std::pair< const $key_type, $mapped_type> > >" ) + if key_type.startswith( 'const ' ) or key_type.endswith( ' const' ): + tmpl = string.Template( "$container< $key_type, $mapped_type, $hash<$key_type, $less<$key_type> >, $allocator< std::pair< $key_type, $mapped_type> > >" ) + tmpl = tmpl.substitute( container=c_name + , key_type=key_type + , mapped_type=mapped_type + , hash=default_hash + , less=default_compare + , allocator=default_allocator ) + if defaults_eraser.normalize( cls_name ) == defaults_eraser.normalize( tmpl ): + return templates.join( c_name + , [ defaults_eraser.erase_recursive( key_type ) + , defaults_eraser.erase_recursive( mapped_type )] ) + + class container_traits_impl_t: """this class implements the functionality needed for convinient work with STD container classes. @@ -278,14 +337,14 @@ map_traits = create_traits_class( 'map', 1, 'mapped_type', defaults_eraser.erase_map_compare_allocator ) multimap_traits = create_traits_class( 'multimap', 1, 'mapped_type', defaults_eraser.erase_map_compare_allocator ) -hash_map_traits = create_traits_class( 'hash_map', 1, 'mapped_type' ) -hash_multimap_traits = create_traits_class( 'hash_multimap', 1, 'mapped_type' ) +hash_map_traits = create_traits_class( 'hash_map', 1, 'mapped_type', defaults_eraser.erase_hashmap_compare_allocator ) +hash_multimap_traits = create_traits_class( 'hash_multimap', 1, 'mapped_type', defaults_eraser.erase_hashmap_compare_allocator ) set_traits = create_traits_class( 'set', 0, 'value_type', defaults_eraser.erase_compare_allocator) multiset_traits = create_traits_class( 'multiset', 0, 'value_type', defaults_eraser.erase_compare_allocator ) -hash_set_traits = create_traits_class( 'hash_set', 0, 'value_type' ) -hash_multiset_traits = create_traits_class( 'hash_multiset', 0, 'value_type' ) +hash_set_traits = create_traits_class( 'hash_set', 0, 'value_type', defaults_eraser.erase_hash_allocator ) +hash_multiset_traits = create_traits_class( 'hash_multiset', 0, 'value_type', defaults_eraser.erase_hash_allocator ) container_traits = ( list_traits Modified: pygccxml_dev/unittests/data/remove_template_defaults.hpp =================================================================== --- pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-18 07:17:19 UTC (rev 1062) +++ pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-18 14:27:30 UTC (rev 1063) @@ -6,6 +6,8 @@ #ifndef __remove_template_defaults_hpp__ #define __remove_template_defaults_hpp__ +#include <hash_set> +#include <hash_map> #include <string> #include <vector> #include <deque> @@ -68,7 +70,28 @@ typedef std::multimap< std::vector< int > const, mm_wstr2d const > mm_v_i2mm_wstr2d; } +namespace hash_sets{ + typedef std::hash_set< std::vector< int > > hs_v_int; + typedef std::hash_set< std::string > hs_string; } +namespace hash_multisets{ + typedef std::hash_multiset< std::vector< int > > mhs_v_int; + typedef std::hash_multiset< std::string > mhs_string; +} + +namespace hash_maps{ + typedef std::hash_map< int, double > hm_i2d; + typedef std::hash_map< std::wstring, double > hm_wstr2d; +} + +namespace hash_multimaps{ + typedef std::hash_multimap< int, double > hmm_i2d; + typedef std::hash_multimap< std::wstring const, double > hmm_wstr2d; + typedef std::hash_multimap< std::vector< int > const, hmm_wstr2d const > hmm_v_i2mm_wstr2d; +} + +} + #endif//__remove_template_defaults_hpp__ Modified: pygccxml_dev/unittests/remove_template_defaults_tester.py =================================================================== --- pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-18 07:17:19 UTC (rev 1062) +++ pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-18 14:27:30 UTC (rev 1063) @@ -104,6 +104,42 @@ self.failUnless( 'multimap< const std::vector< int >, const std::multimap< const std::wstring, double > >' == declarations.multimap_traits.remove_defaults( mm_v_i2mm_wstr2d ) ) + def test_hash_set( self ): + hs_v_int = self.global_ns.typedef( 'hs_v_int' ) + self.failUnless( 'hash_set< std::vector< int > >' + == declarations.hash_set_traits.remove_defaults( hs_v_int ) ) + hs_string = self.global_ns.typedef( 'hs_string' ) + self.failUnless( 'hash_set< std::string >' + == declarations.hash_set_traits.remove_defaults( hs_string ) ) + + def test_hash_multiset( self ): + mhs_v_int = self.global_ns.typedef( 'mhs_v_int' ) + self.failUnless( 'hash_multiset< std::vector< int > >' + == declarations.hash_multiset_traits.remove_defaults( mhs_v_int ) ) + mhs_string = self.global_ns.typedef( 'mhs_string' ) + self.failUnless( 'hash_multiset< std::string >' + == declarations.hash_multiset_traits.remove_defaults( mhs_string ) ) + + def test_hash_map( self ): + hm_i2d = self.global_ns.typedef( 'hm_i2d' ) + self.failUnless( 'hash_map< int, double >' + == declarations.hash_map_traits.remove_defaults( hm_i2d ) ) + hm_wstr2d = self.global_ns.typedef( 'hm_wstr2d' ) + self.failUnless( 'hash_map< std::wstring, double >' + == declarations.hash_map_traits.remove_defaults( hm_wstr2d ) ) + + def test_hash_multimap( self ): + hmm_i2d = self.global_ns.typedef( 'hmm_i2d' ) + self.failUnless( 'hash_multimap< int, double >' + == declarations.hash_multimap_traits.remove_defaults( hmm_i2d ) ) + hmm_wstr2d = self.global_ns.typedef( 'hmm_wstr2d' ) + self.failUnless( 'hash_multimap< const std::wstring, double >' + == declarations.hash_multimap_traits.remove_defaults( hmm_wstr2d ) ) + hmm_v_i2mm_wstr2d = self.global_ns.typedef( 'hmm_v_i2mm_wstr2d' ) + self.failUnless( 'hash_multimap< const std::vector< int >, const std::hash_multimap< const std::wstring, double > >' + == declarations.hash_multimap_traits.remove_defaults( hmm_v_i2mm_wstr2d ) ) + + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-19 09:35:52
|
Revision: 1064 http://svn.sourceforge.net/pygccxml/?rev=1064&view=rev Author: roman_yakovenko Date: 2007-06-19 02:35:45 -0700 (Tue, 19 Jun 2007) Log Message: ----------- moving functionality "container_traits" from Py++ to pygccxml Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/unittests/remove_template_defaults_tester.py pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/unittests/find_container_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-06-18 14:27:30 UTC (rev 1063) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -181,6 +181,7 @@ from container_traits import hash_set_traits from container_traits import multiset_traits from container_traits import hash_multiset_traits +from container_traits import find_container_traits from function_traits import is_same_function Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-06-18 14:27:30 UTC (rev 1063) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -81,6 +81,8 @@ """creates class that describes C++ class declaration( and not definition )""" declaration.declaration_t.__init__( self, name ) self._aliases = [] + self._container_traits = None + self._container_traits_set = False def _get__cmp__items(self): """implementation details""" @@ -96,6 +98,15 @@ aliases = property( _get_aliases, _set_aliases , doc="List of L{aliases<typedef_t>} to this instance") + @property + def container_traits( self ): + """reference to L{container traits<container_traits.py>} or None""" + if self._container_traits_set == False: + import container_traits #prevent cyclic dependencies + self._container_traits_set = True + self._container_traits = container_traits.find_container_traits( self ) + return self._container_traits + class class_t( scopedef.scopedef_t ): """describes class definition""" @@ -113,6 +124,8 @@ self._private_members = [] self._protected_members = [] self._aliases = [] + self._container_traits = None + self._container_traits_set = False def _get_name_impl( self ): if not self._name: #class with empty name @@ -365,4 +378,13 @@ return answer + @property + def container_traits( self ): + """reference to L{container traits<container_traits.py>} or None""" + if self._container_traits_set == False: + import container_traits #prevent cyclic dependencies + self._container_traits_set = True + self._container_traits = container_traits.find_container_traits( self ) + return self._container_traits + class_types = ( class_t, class_declaration_t ) Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-18 14:27:30 UTC (rev 1063) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -373,7 +373,7 @@ return cls_traits else: for cls_traits in container_traits: - if cls_traits.is_my_case( cls ): + if cls_traits.is_my_case( cls_or_string ): return cls_traits Added: pygccxml_dev/unittests/find_container_traits_tester.py =================================================================== --- pygccxml_dev/unittests/find_container_traits_tester.py (rev 0) +++ pygccxml_dev/unittests/find_container_traits_tester.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -0,0 +1,57 @@ +# 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) + +import unittest +import autoconfig +import parser_test_case + +from pygccxml import utils +from pygccxml import parser +from pygccxml import declarations + +class tester_t( parser_test_case.parser_test_case_t ): + global_ns = None + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'remove_template_defaults.hpp' + + def setUp(self): + if not tester_t.global_ns: + decls = parser.parse( [self.header], self.config ) + tester_t.global_ns = declarations.get_global_namespace( decls ) + tester_t.global_ns.init_optimizer() + + def __cmp_traits( self, typedef, expected ): + if isinstance( typedef, str ): + typedef = self.global_ns.typedef( typedef ) + self.failUnless( declarations.find_container_traits( typedef ) is expected ) + cls = declarations.remove_declarated( typedef ) + self.failUnless( cls.container_traits is expected ) + + def test_find_traits( self ): + self.__cmp_traits( 'v_int', declarations.vector_traits ) + self.__cmp_traits( 'l_int', declarations.list_traits ) + self.__cmp_traits( 'd_v_int', declarations.deque_traits ) + self.__cmp_traits( 'q_int', declarations.queue_traits ) + self.__cmp_traits( 'pq_int', declarations.priority_queue_traits) + self.__cmp_traits( 's_v_int', declarations.set_traits) + self.__cmp_traits( 'ms_v_int', declarations.multiset_traits) + self.__cmp_traits( 'm_i2d', declarations.map_traits ) + self.__cmp_traits( 'mm_i2d', declarations.multimap_traits ) + self.__cmp_traits( 'hs_v_int', declarations.hash_set_traits ) + self.__cmp_traits( 'mhs_v_int', declarations.hash_multiset_traits ) + self.__cmp_traits( 'hm_i2d', declarations.hash_map_traits ) + self.__cmp_traits( 'hmm_i2d', declarations.hash_multimap_traits ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pygccxml_dev/unittests/remove_template_defaults_tester.py =================================================================== --- pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-18 14:27:30 UTC (rev 1063) +++ pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -22,7 +22,7 @@ decls = parser.parse( [self.header], self.config ) tester_t.global_ns = declarations.get_global_namespace( decls ) tester_t.global_ns.init_optimizer() - + def test_vector( self ): v_int = self.global_ns.typedef( 'v_int' ) self.failUnless( 'vector< int >' Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2007-06-18 14:27:30 UTC (rev 1063) +++ pygccxml_dev/unittests/test_all.py 2007-06-19 09:35:45 UTC (rev 1064) @@ -42,6 +42,7 @@ import dependencies_tester import free_operators_tester import remove_template_defaults_tester +import find_container_traits_tester def create_suite(): testers = [ @@ -83,6 +84,7 @@ , dependencies_tester , free_operators_tester , remove_template_defaults_tester + , find_container_traits_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-20 05:23:38
|
Revision: 1066 http://svn.sourceforge.net/pygccxml/?rev=1066&view=rev Author: roman_yakovenko Date: 2007-06-19 22:23:38 -0700 (Tue, 19 Jun 2007) Log Message: ----------- adding support to GCC-XML attributes Modified Paths: -------------- pygccxml_dev/docs/history/history.rest pygccxml_dev/pygccxml/declarations/calldef.py pygccxml_dev/pygccxml/declarations/declaration.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/test_all.py Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2007-06-19 09:51:56 UTC (rev 1065) +++ pygccxml_dev/docs/history/history.rest 2007-06-20 05:23:38 UTC (rev 1066) @@ -19,6 +19,7 @@ * Gottfried Ganssauge * Gaetan Lehmann * Martin Preisler +* Miguel Lobo ----------- SVN Version @@ -27,6 +28,11 @@ 1. Class ``free_operator_t`` is now able to provide references to the class declarations instances it works on. +2. Support for `GCC-XML attributes`_ was added. Many thanks to Miguel Lobo for + the implementation. + +.. _`GCC-XML attributes`: http://www.gccxml.org/HTML/Running.html + ------------- Version 0.9.0 ------------- Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2007-06-19 09:51:56 UTC (rev 1065) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2007-06-20 05:23:38 UTC (rev 1066) @@ -39,11 +39,12 @@ class, that describes argument of "callable" declaration """ - def __init__( self, name='', type=None, default_value=None ): + def __init__( self, name='', type=None, default_value=None, attributes=None ): object.__init__(self) self._name = name self._default_value = default_value self._type = type + self._attributes = attributes def clone( self, **keywd ): """constructs new argument_t instance @@ -54,7 +55,8 @@ """ return argument_t( name=keywd.get( 'name', self.name ) , type=keywd.get( 'type', self.type ) - , default_value=keywd.get( 'default_value', self.default_value ) ) + , default_value=keywd.get( 'default_value', self.default_value ) + , attributes=keywd.get( 'attributes', self.attributes ) ) def __str__(self): if self.default_value==None: @@ -102,7 +104,17 @@ type = property( _get_type, _set_type , doc="""The type of the argument. @type: L{type_t}""") + + def _get_attributes( self ): + return self._attributes + def _set_attributes( self, attributes ): + self._attributes = attributes + attributes = property( _get_attributes, _set_attributes + , doc="""GCCXML attributes, set using __attribute__((gccxml("..."))) + @type: str + """ ) + class calldef_t( declaration.declaration_t ): """base class for all "callable" declarations""" def __init__( self, name='', arguments=None, exceptions=None, return_type=None, has_extern=False, does_throw=True ): Modified: pygccxml_dev/pygccxml/declarations/declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/declaration.py 2007-06-19 09:51:56 UTC (rev 1065) +++ pygccxml_dev/pygccxml/declarations/declaration.py 2007-06-20 05:23:38 UTC (rev 1066) @@ -57,12 +57,13 @@ class declaration_t( object ): """base class for all classes that represent a C++ declaration""" - def __init__( self, name='', location=None, is_artificial=False, mangled=None, demangled=None ): + def __init__( self, name='', location=None, is_artificial=False, mangled=None, demangled=None, attributes=None ): self._name = name self._location = location self._is_artificial = is_artificial self._mangled = mangled self._demangled = demangled + self._attributes = attributes self._parent = None self._cache = algorithms_cache.declaration_algs_cache_t() @@ -218,6 +219,17 @@ @type: str """ ) + def _get_attributes( self ): + return self._attributes + def _set_attributes( self, attributes ): + self._attributes = attributes + attributes = property( _get_attributes, _set_attributes + , doc="""GCCXML attributes, set using __attribute__((gccxml("..."))) + @type: str + """ ) + + + def _create_decl_string(self): return algorithm.full_name( self ) Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-06-19 09:51:56 UTC (rev 1065) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-06-20 05:23:38 UTC (rev 1066) @@ -19,6 +19,7 @@ XML_AN_ABSTRACT = "abstract" XML_AN_ACCESS = "access" XML_AN_ARTIFICIAL = "artificial" +XML_AN_ATTRIBUTES = "attributes" XML_AN_BASE_TYPE = "basetype" XML_AN_BASES = "bases" XML_AN_BITS = "bits" @@ -203,6 +204,7 @@ self.__read_artificial(obj, attrs) self.__read_mangled( obj, attrs) self.__read_demangled( obj, attrs) + self.__read_attributes(obj, attrs) elif isinstance( obj, type_t ): self.__types[ element_id ] = obj elif isinstance( obj, types.StringTypes ): @@ -246,6 +248,9 @@ def __read_demangled( self, decl, attrs ): decl.demangled = attrs.get( XML_AN_DEMANGLED, None ) + def __read_attributes( self, decl, attrs ): + decl.attributes = attrs.get( XML_AN_ATTRIBUTES, None ) + def __read_access( self, attrs ): self.__access[ attrs[XML_AN_ID] ] = attrs.get( XML_AN_ACCESS, ACCESS_TYPES.PUBLIC ) @@ -330,6 +335,7 @@ argument.name = attrs.get( XML_AN_NAME, 'arg%d' % len(self.__inst.arguments) ) argument.type = attrs[XML_AN_TYPE] argument.default_value = attrs.get( XML_AN_DEFAULT, None ) + self.__read_attributes( argument, attrs ) if argument.default_value == '<gccxml-cast-expr>': argument.default_value = None self.__inst.arguments.append( argument ) Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2007-06-19 09:51:56 UTC (rev 1065) +++ pygccxml_dev/unittests/test_all.py 2007-06-20 05:23:38 UTC (rev 1066) @@ -43,6 +43,7 @@ import free_operators_tester import remove_template_defaults_tester import find_container_traits_tester +import attributes_tester def create_suite(): testers = [ @@ -85,6 +86,7 @@ , free_operators_tester , remove_template_defaults_tester , find_container_traits_tester + , attributes_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-24 05:03:05
|
Revision: 1078 http://svn.sourceforge.net/pygccxml/?rev=1078&view=rev Author: roman_yakovenko Date: 2007-06-23 22:03:05 -0700 (Sat, 23 Jun 2007) Log Message: ----------- bug fix: any type could also be used as exception modifier in throw statement, in function definition Modified Paths: -------------- pygccxml_dev/pygccxml/parser/linker.py pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/unittests/data/type_as_exception_bug.h pygccxml_dev/unittests/type_as_exception_bug_tester.py Modified: pygccxml_dev/pygccxml/parser/linker.py =================================================================== --- pygccxml_dev/pygccxml/parser/linker.py 2007-06-24 04:28:27 UTC (rev 1077) +++ pygccxml_dev/pygccxml/parser/linker.py 2007-06-24 05:03:05 UTC (rev 1078) @@ -67,7 +67,10 @@ for arg in self.__inst.arguments: arg.type = self.__link_type(arg.type) for index in range( len( self.__inst.exceptions ) ): - self.__inst.exceptions[index] = self.__decls[ self.__inst.exceptions[index] ] + try: + self.__inst.exceptions[index] = self.__decls[ self.__inst.exceptions[index] ] + except KeyError: + self.__inst.exceptions[index] = self.__link_type( self.__inst.exceptions[index] ) def visit_member_function( self ): self.__link_calldef() Added: pygccxml_dev/unittests/data/type_as_exception_bug.h =================================================================== --- pygccxml_dev/unittests/data/type_as_exception_bug.h (rev 0) +++ pygccxml_dev/unittests/data/type_as_exception_bug.h 2007-06-24 05:03:05 UTC (rev 1078) @@ -0,0 +1,10 @@ +#ifndef __key_error_bug_h__ +#define __key_error_bug_h__ + +struct ExpressionError{}; + +struct xxx{ + virtual void buggy() throw( ExpressionError& ); +}; + +#endif//__key_error_bug_h__ Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2007-06-24 04:28:27 UTC (rev 1077) +++ pygccxml_dev/unittests/test_all.py 2007-06-24 05:03:05 UTC (rev 1078) @@ -44,6 +44,7 @@ import remove_template_defaults_tester import find_container_traits_tester import attributes_tester +import type_as_exception_bug_tester def create_suite(): testers = [ @@ -87,6 +88,7 @@ , remove_template_defaults_tester , find_container_traits_tester , attributes_tester + , type_as_exception_bug_tester ] main_suite = unittest.TestSuite() Added: pygccxml_dev/unittests/type_as_exception_bug_tester.py =================================================================== --- pygccxml_dev/unittests/type_as_exception_bug_tester.py (rev 0) +++ pygccxml_dev/unittests/type_as_exception_bug_tester.py 2007-06-24 05:03:05 UTC (rev 1078) @@ -0,0 +1,46 @@ +# 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) + +import unittest +import autoconfig +import parser_test_case + +from pygccxml import utils +from pygccxml import parser +from pygccxml import declarations + +class tester_t( parser_test_case.parser_test_case_t ): + global_ns = None + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'type_as_exception_bug.h' + + def setUp(self): + if not tester_t.global_ns: + decls = parser.parse( [self.header], self.config ) + tester_t.global_ns = declarations.get_global_namespace( decls ) + tester_t.global_ns.init_optimizer() + + def test( self ): + pass + #~ buggy = self.global_ns.mem_fun( 'buggy' ) + #~ ExpressionError = self.global_ns.class_( 'ExpressionError' ) + #~ self.failUnless( len( buggy.exceptions ) == 1 ) + #~ err = buggy.exceptions[0] + #~ self.failUnless( declarations.is_reference( err ) ) + #~ err = declarations.remove_declarated( declarations.remove_reference( err ) ) + #~ self.failUnless( err is ExpressionError ) + + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-03 21:15:58
|
Revision: 1118 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1118&view=rev Author: roman_yakovenko Date: 2007-11-03 14:15:57 -0700 (Sat, 03 Nov 2007) Log Message: ----------- adding few files, which describes the difference between GCC-XML 0.7 and 0.9 Added Paths: ----------- pygccxml_dev/gccxml-0.9-upgrade/ pygccxml_dev/gccxml-0.9-upgrade/const_variables.7.xml pygccxml_dev/gccxml-0.9-upgrade/const_variables.9.xml pygccxml_dev/gccxml-0.9-upgrade/const_variables.h pygccxml_dev/gccxml-0.9-upgrade/const_variables.h.diff pygccxml_dev/gccxml-0.9-upgrade/demangled.7.xml pygccxml_dev/gccxml-0.9-upgrade/demangled.9.xml pygccxml_dev/gccxml-0.9-upgrade/demangled.h pygccxml_dev/gccxml-0.9-upgrade/demangled.h.diff pygccxml_dev/gccxml-0.9-upgrade/offset.7.xml pygccxml_dev/gccxml-0.9-upgrade/offset.9.xml pygccxml_dev/gccxml-0.9-upgrade/offset.h pygccxml_dev/gccxml-0.9-upgrade/offset.h.diff pygccxml_dev/gccxml-0.9-upgrade/union_and_struct.7.xml pygccxml_dev/gccxml-0.9-upgrade/union_and_struct.9.xml pygccxml_dev/gccxml-0.9-upgrade/union_and_struct.h pygccxml_dev/gccxml-0.9-upgrade/union_and_struct.h.diff Added: pygccxml_dev/gccxml-0.9-upgrade/const_variables.7.xml =================================================================== --- pygccxml_dev/gccxml-0.9-upgrade/const_variables.7.xml (rev 0) +++ pygccxml_dev/gccxml-0.9-upgrade/const_variables.7.xml 2007-11-03 21:15:57 UTC (rev 1118) @@ -0,0 +1,404 @@ +<?xml version="1.0"?> +<GCC_XML cvs_revision="1.114"> + <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 " mangled="_Z2::" demangled="::"/> + <Namespace id="_2" name="std" context="_1" members="" mangled="_Z3std" demangled="std"/> + <Variable id="_3" name="initialized" type="_123c" init="10122004" context="_1" location="f0:6" file="f0" line="6"/> + <Function id="_4" name="__builtin_cpowl" returns="_125" context="_1" location="f1:131" file="f1" line="131" extern="1"> + <Argument type="_125" location="f1:131" file="f1" line="131"/> + <Argument type="_125" location="f1:131" file="f1" line="131"/> + </Function> + <Function id="_5" name="__builtin_cpow" returns="_126" context="_1" location="f1:130" file="f1" line="130" extern="1"> + <Argument type="_126" location="f1:130" file="f1" line="130"/> + <Argument type="_126" location="f1:130" file="f1" line="130"/> + </Function> + <Function id="_6" name="__builtin_cpowf" returns="_127" context="_1" location="f1:129" file="f1" line="129" extern="1"> + <Argument type="_127" location="f1:129" file="f1" line="129"/> + <Argument type="_127" location="f1:129" file="f1" line="129"/> + </Function> + <Function id="_7" name="__builtin_ctanhl" returns="_125" context="_1" location="f1:128" file="f1" line="128" extern="1"> + <Argument type="_125" location="f1:128" file="f1" line="128"/> + </Function> + <Function id="_8" name="__builtin_ctanh" returns="_126" context="_1" location="f1:127" file="f1" line="127" extern="1"> + <Argument type="_126" location="f1:127" file="f1" line="127"/> + </Function> + <Function id="_9" name="__builtin_ctanhf" returns="_127" context="_1" location="f1:126" file="f1" line="126" extern="1"> + <Argument type="_127" location="f1:126" file="f1" line="126"/> + </Function> + <Function id="_10" name="__builtin_ctanl" returns="_125" context="_1" location="f1:125" file="f1" line="125" extern="1"> + <Argument type="_125" location="f1:125" file="f1" line="125"/> + </Function> + <Function id="_11" name="__builtin_ctan" returns="_126" context="_1" location="f1:124" file="f1" line="124" extern="1"> + <Argument type="_126" location="f1:124" file="f1" line="124"/> + </Function> + <Function id="_12" name="__builtin_ctanf" returns="_127" context="_1" location="f1:123" file="f1" line="123" extern="1"> + <Argument type="_127" location="f1:123" file="f1" line="123"/> + </Function> + <Function id="_13" name="__builtin_csqrtl" returns="_125" context="_1" location="f1:122" file="f1" line="122" extern="1"> + <Argument type="_125" location="f1:122" file="f1" line="122"/> + </Function> + <Function id="_14" name="__builtin_csqrt" returns="_126" context="_1" location="f1:121" file="f1" line="121" extern="1"> + <Argument type="_126" location="f1:121" file="f1" line="121"/> + </Function> + <Function id="_15" name="__builtin_csqrtf" returns="_127" context="_1" location="f1:120" file="f1" line="120" extern="1"> + <Argument type="_127" location="f1:120" file="f1" line="120"/> + </Function> + <Function id="_16" name="__builtin_csinhl" returns="_125" context="_1" location="f1:119" file="f1" line="119" extern="1"> + <Argument type="_125" location="f1:119" file="f1" line="119"/> + </Function> + <Function id="_17" name="__builtin_csinh" returns="_126" context="_1" location="f1:118" file="f1" line="118" extern="1"> + <Argument type="_126" location="f1:118" file="f1" line="118"/> + </Function> + <Function id="_18" name="__builtin_csinhf" returns="_127" context="_1" location="f1:117" file="f1" line="117" extern="1"> + <Argument type="_127" location="f1:117" file="f1" line="117"/> + </Function> + <Function id="_19" name="__builtin_csinl" returns="_125" context="_1" location="f1:116" file="f1" line="116" extern="1"> + <Argument type="_125" location="f1:116" file="f1" line="116"/> + </Function> + <Function id="_20" name="__builtin_csin" returns="_126" context="_1" location="f1:115" file="f1" line="115" extern="1"> + <Argument type="_126" location="f1:115" file="f1" line="115"/> + </Function> + <Function id="_21" name="__builtin_csinf" returns="_127" context="_1" location="f1:114" file="f1" line="114" extern="1"> + <Argument type="_127" location="f1:114" file="f1" line="114"/> + </Function> + <Function id="_22" name="__builtin_clogl" returns="_125" context="_1" location="f1:113" file="f1" line="113" extern="1"> + <Argument type="_125" location="f1:113" file="f1" line="113"/> + </Function> + <Function id="_23" name="__builtin_clog" returns="_126" context="_1" location="f1:112" file="f1" line="112" extern="1"> + <Argument type="_126" location="f1:112" file="f1" line="112"/> + </Function> + <Function id="_24" name="__builtin_clogf" returns="_127" context="_1" location="f1:111" file="f1" line="111" extern="1"> + <Argument type="_127" location="f1:111" file="f1" line="111"/> + </Function> + <Function id="_25" name="__builtin_cexpl" returns="_125" context="_1" location="f1:110" file="f1" line="110" extern="1"> + <Argument type="_125" location="f1:110" file="f1" line="110"/> + </Function> + <Function id="_26" name="__builtin_cexp" returns="_126" context="_1" location="f1:109" file="f1" line="109" extern="1"> + <Argument type="_126" location="f1:109" file="f1" line="109"/> + </Function> + <Function id="_27" name="__builtin_cexpf" returns="_127" context="_1" location="f1:108" file="f1" line="108" extern="1"> + <Argument type="_127" location="f1:108" file="f1" line="108"/> + </Function> + <Function id="_28" name="__builtin_ccoshl" returns="_125" context="_1" location="f1:107" file="f1" line="107" extern="1"> + <Argument type="_125" location="f1:107" file="f1" line="107"/> + </Function> + <Function id="_29" name="__builtin_ccosh" returns="_126" context="_1" location="f1:106" file="f1" line="106" extern="1"> + <Argument type="_126" location="f1:106" file="f1" line="106"/> + </Function> + <Function id="_30" name="__builtin_ccoshf" returns="_127" context="_1" location="f1:105" file="f1" line="105" extern="1"> + <Argument type="_127" location="f1:105" file="f1" line="105"/> + </Function> + <Function id="_31" name="__builtin_ccosl" returns="_125" context="_1" location="f1:104" file="f1" line="104" extern="1"> + <Argument type="_125" location="f1:104" file="f1" line="104"/> + </Function> + <Function id="_32" name="__builtin_ccos" returns="_126" context="_1" location="f1:103" file="f1" line="103" extern="1"> + <Argument type="_126" location="f1:103" file="f1" line="103"/> + </Function> + <Function id="_33" name="__builtin_ccosf" returns="_127" context="_1" location="f1:102" file="f1" line="102" extern="1"> + <Argument type="_127" location="f1:102" file="f1" line="102"/> + </Function> + <Function id="_34" name="__builtin_popcountll" returns="_128" context="_1" location="f1:101" file="f1" line="101" extern="1"> + <Argument type="_129" location="f1:101" file="f1" line="101"/> + </Function> + <Function id="_35" name="__builtin_popcountl" returns="_128" context="_1" location="f1:100" file="f1" line="100" extern="1"> + <Argument type="_130" location="f1:100" file="f1" line="100"/> + </Function> + <Function id="_36" name="__builtin_popcount" returns="_128" context="_1" location="f1:99" file="f1" line="99" extern="1"> + <Argument type="_128" location="f1:99" file="f1" line="99"/> + </Function> + <Function id="_37" name="__builtin_ctzll" returns="_128" context="_1" location="f1:98" file="f1" line="98" extern="1"> + <Argument type="_129" location="f1:98" file="f1" line="98"/> + </Function> + <Function id="_38" name="__builtin_ctzl" returns="_128" context="_1" location="f1:97" file="f1" line="97" extern="1"> + <Argument type="_130" location="f1:97" file="f1" line="97"/> + </Function> + <Function id="_39" name="__builtin_ctz" returns="_128" context="_1" location="f1:96" file="f1" line="96" extern="1"> + <Argument type="_128" location="f1:96" file="f1" line="96"/> + </Function> + <Function id="_40" name="__builtin_cargl" returns="_131" context="_1" location="f1:95" file="f1" line="95" extern="1"> + <Argument type="_125" location="f1:95" file="f1" line="95"/> + </Function> + <Function id="_41" name="__builtin_carg" returns="_132" context="_1" location="f1:94" file="f1" line="94" extern="1"> + <Argument type="_126" location="f1:94" file="f1" line="94"/> + </Function> + <Function id="_42" name="__builtin_cargf" returns="_133" context="_1" location="f1:93" file="f1" line="93" extern="1"> + <Argument type="_127" location="f1:93" file="f1" line="93"/> + </Function> + <Function id="_43" name="__builtin_cabsl" returns="_131" context="_1" location="f1:92" file="f1" line="92" extern="1"> + <Argument type="_125" location="f1:92" file="f1" line="92"/> + </Function> + <Function id="_44" name="__builtin_cabs" returns="_132" context="_1" location="f1:91" file="f1" line="91" extern="1"> + <Argument type="_126" location="f1:91" file="f1" line="91"/> + </Function> + <Function id="_45" name="__builtin_cabsf" returns="_133" context="_1" location="f1:90" file="f1" line="90" extern="1"> + <Argument type="_127" location="f1:90" file="f1" line="90"/> + </Function> + <Function id="_46" name="__builtin_tanl" returns="_131" context="_1" location="f1:89" file="f1" line="89" extern="1"> + <Argument type="_131" location="f1:89" file="f1" line="89"/> + </Function> + <Function id="_47" name="__builtin_tanhl" returns="_131" context="_1" location="f1:88" file="f1" line="88" extern="1"> + <Argument type="_131" location="f1:88" file="f1" line="88"/> + </Function> + <Function id="_48" name="__builtin_tanhf" returns="_133" context="_1" location="f1:87" file="f1" line="87" extern="1"> + <Argument type="_133" location="f1:87" file="f1" line="87"/> + </Function> + <Function id="_49" name="__builtin_tanh" returns="_132" context="_1" location="f1:86" file="f1" line="86" extern="1"> + <Argument type="_132" location="f1:86" file="f1" line="86"/> + </Function> + <Function id="_50" name="__builtin_tanf" returns="_133" context="_1" location="f1:85" file="f1" line="85" extern="1"> + <Argument type="_133" location="f1:85" file="f1" line="85"/> + </Function> + <Function id="_51" name="__builtin_tan" returns="_132" context="_1" location="f1:84" file="f1" line="84" extern="1"> + <Argument type="_132" location="f1:84" file="f1" line="84"/> + </Function> + <Function id="_52" name="__builtin_sinhl" returns="_131" context="_1" location="f1:79" file="f1" line="79" extern="1"> + <Argument type="_131" location="f1:79" file="f1" line="79"/> + </Function> + <Function id="_53" name="__builtin_sinhf" returns="_133" context="_1" location="f1:78" file="f1" line="78" extern="1"> + <Argument type="_133" location="f1:78" file="f1" line="78"/> + </Function> + <Function id="_54" name="__builtin_sinh" returns="_132" context="_1" location="f1:77" file="f1" line="77" extern="1"> + <Argument type="_132" location="f1:77" file="f1" line="77"/> + </Function> + <Function id="_55" name="__builtin_powil" returns="_131" context="_1" location="f1:74" file="f1" line="74" extern="1"> + <Argument type="_131" location="f1:74" file="f1" line="74"/> + <Argument type="_128" location="f1:74" file="f1" line="74"/> + </Function> + <Function id="_56" name="__builtin_powif" returns="_133" context="_1" location="f1:73" file="f1" line="73" extern="1"> + <Argument type="_133" location="f1:73" file="f1" line="73"/> + <Argument type="_128" location="f1:73" file="f1" line="73"/> + </Function> + <Function id="_57" name="__builtin_powi" returns="_132" context="_1" location="f1:72" file="f1" line="72" extern="1"> + <Argument type="_132" location="f1:72" file="f1" line="72"/> + <Argument type="_128" location="f1:72" file="f1" line="72"/> + </Function> + <Function id="_58" name="__builtin_powl" returns="_131" context="_1" location="f1:71" file="f1" line="71" extern="1"> + <Argument type="_131" location="f1:71" file="f1" line="71"/> + <Argument type="_131" location="f1:71" file="f1" line="71"/> + </Function> + <Function id="_59" name="__builtin_powf" returns="_133" context="_1" location="f1:70" file="f1" line="70" extern="1"> + <Argument type="_133" location="f1:70" file="f1" line="70"/> + <Argument type="_133" location="f1:70" file="f1" line="70"/> + </Function> + <Function id="_60" name="__builtin_modfl" returns="_131" context="_1" location="f1:69" file="f1" line="69" extern="1"> + <Argument type="_131" location="f1:69" file="f1" line="69"/> + <Argument type="_134" location="f1:69" file="f1" line="69"/> + </Function> + <Function id="_61" name="__builtin_modff" returns="_133" context="_1" location="f1:68" file="f1" line="68" extern="1"> + <Argument type="_133" location="f1:68" file="f1" line="68"/> + <Argument type="_135" location="f1:68" file="f1" line="68"/> + </Function> + <Function id="_62" name="__builtin_log10l" returns="_131" context="_1" location="f1:65" file="f1" line="65" extern="1"> + <Argument type="_131" location="f1:65" file="f1" line="65"/> + </Function> + <Function id="_63" name="__builtin_log10f" returns="_133" context="_1" location="f1:64" file="f1" line="64" extern="1"> + <Argument type="_133" location="f1:64" file="f1" line="64"/> + </Function> + <Function id="_64" name="__builtin_log10" returns="_132" context="_1" location="f1:63" file="f1" line="63" extern="1"> + <Argument type="_132" location="f1:63" file="f1" line="63"/> + </Function> + <Function id="_65" name="__builtin_ldexpl" returns="_131" context="_1" location="f1:61" file="f1" line="61" extern="1"> + <Argument type="_131" location="f1:61" file="f1" line="61"/> + <Argument type="_128" location="f1:61" file="f1" line="61"/> + </Function> + <Function id="_66" name="__builtin_ldexpf" returns="_133" context="_1" location="f1:60" file="f1" line="60" extern="1"> + <Argument type="_133" location="f1:60" file="f1" line="60"/> + <Argument type="_128" location="f1:60" file="f1" line="60"/> + </Function> + <Function id="_67" name="__builtin_ldexp" returns="_132" context="_1" location="f1:59" file="f1" line="59" extern="1"> + <Argument type="_132" location="f1:59" file="f1" line="59"/> + <Argument type="_128" location="f1:59" file="f1" line="59"/> + </Function> + <Function id="_68" name="__builtin_frexpl" returns="_131" context="_1" location="f1:58" file="f1" line="58" extern="1"> + <Argument type="_131" location="f1:58" file="f1" line="58"/> + <Argument type="_136" location="f1:58" file="f1" line="58"/> + </Function> + <Function id="_69" name="__builtin_frexpf" returns="_133" context="_1" location="f1:57" file="f1" line="57" extern="1"> + <Argument type="_133" location="f1:57" file="f1" line="57"/> + <Argument type="_136" location="f1:57" file="f1" line="57"/> + </Function> + <Function id="_70" name="__builtin_frexp" returns="_132" context="_1" location="f1:56" file="f1" line="56" extern="1"> + <Argument type="_132" location="f1:56" file="f1" line="56"/> + <Argument type="_136" location="f1:56" file="f1" line="56"/> + </Function> + <Function id="_71" name="__builtin_fmodl" returns="_131" context="_1" location="f1:55" file="f1" line="55" extern="1"> + <Argument type="_131" location="f1:55" file="f1" line="55"/> + <Argument type="_131" location="f1:55" file="f1" line="55"/> + </Function> + <Function id="_72" name="__builtin_fmodf" returns="_133" context="_1" location="f1:54" file="f1" line="54" extern="1"> + <Argument type="_133" location="f1:54" file="f1" line="54"/> + <Argument type="_133" location="f1:54" file="f1" line="54"/> + </Function> + <Function id="_73" name="__builtin_floorl" returns="_131" context="_1" location="f1:53" file="f1" line="53" extern="1"> + <Argument type="_131" location="f1:53" file="f1" line="53"/> + </Function> + <Function id="_74" name="__builtin_floorf" returns="_133" context="_1" location="f1:52" file="f1" line="52" extern="1"> + <Argument type="_133" location="f1:52" file="f1" line="52"/> + </Function> + <Function id="_75" name="__builtin_floor" returns="_132" context="_1" location="f1:51" file="f1" line="51" extern="1"> + <Argument type="_132" location="f1:51" file="f1" line="51"/> + </Function> + <Function id="_76" name="__builtin_coshl" returns="_131" context="_1" location="f1:43" file="f1" line="43" extern="1"> + <Argument type="_131" location="f1:43" file="f1" line="43"/> + </Function> + <Function id="_77" name="__builtin_coshf" returns="_133" context="_1" location="f1:42" file="f1" line="42" extern="1"> + <Argument type="_133" location="f1:42" file="f1" line="42"/> + </Function> + <Function id="_78" name="__builtin_cosh" returns="_132" context="_1" location="f1:41" file="f1" line="41" extern="1"> + <Argument type="_132" location="f1:41" file="f1" line="41"/> + </Function> + <Function id="_79" name="__builtin_ceill" returns="_131" context="_1" location="f1:38" file="f1" line="38" extern="1"> + <Argument type="_131" location="f1:38" file="f1" line="38"/> + </Function> + <Function id="_80" name="__builtin_ceilf" returns="_133" context="_1" location="f1:37" file="f1" line="37" extern="1"> + <Argument type="_133" location="f1:37" file="f1" line="37"/> + </Function> + <Function id="_81" name="__builtin_ceil" returns="_132" context="_1" location="f1:36" file="f1" line="36" extern="1"> + <Argument type="_132" location="f1:36" file="f1" line="36"/> + </Function> + <Function id="_82" name="__builtin_atanl" returns="_131" context="_1" location="f1:35" file="f1" line="35" extern="1"> + <Argument type="_131" location="f1:35" file="f1" line="35"/> + </Function> + <Function id="_83" name="__builtin_atanf" returns="_133" context="_1" location="f1:34" file="f1" line="34" extern="1"> + <Argument type="_133" location="f1:34" file="f1" line="34"/> + </Function> + <Function id="_84" name="__builtin_atan2l" returns="_131" context="_1" location="f1:33" file="f1" line="33" extern="1"> + <Argument type="_131" location="f1:33" file="f1" line="33"/> + <Argument type="_131" location="f1:33" file="f1" line="33"/> + </Function> + <Function id="_85" name="__builtin_atan2f" returns="_133" context="_1" location="f1:32" file="f1" line="32" extern="1"> + <Argument type="_133" location="f1:32" file="f1" line="32"/> + <Argument type="_133" location="f1:32" file="f1" line="32"/> + </Function> + <Function id="_86" name="__builtin_atan2" returns="_132" context="_1" location="f1:31" file="f1" line="31" extern="1"> + <Argument type="_132" location="f1:31" file="f1" line="31"/> + <Argument type="_132" location="f1:31" file="f1" line="31"/> + </Function> + <Function id="_87" name="__builtin_atan" returns="_132" context="_1" location="f1:30" file="f1" line="30" extern="1"> + <Argument type="_132" location="f1:30" file="f1" line="30"/> + </Function> + <Function id="_88" name="__builtin_asinl" returns="_131" context="_1" location="f1:29" file="f1" line="29" extern="1"> + <Argument type="_131" location="f1:29" file="f1" line="29"/> + </Function> + <Function id="_89" name="__builtin_asinf" returns="_133" context="_1" location="f1:28" file="f1" line="28" extern="1"> + <Argument type="_133" location="f1:28" file="f1" line="28"/> + </Function> + <Function id="_90" name="__builtin_asin" returns="_132" context="_1" location="f1:27" file="f1" line="27" extern="1"> + <Argument type="_132" location="f1:27" file="f1" line="27"/> + </Function> + <Function id="_91" name="__builtin_acosl" returns="_131" context="_1" location="f1:26" file="f1" line="26" extern="1"> + <Argument type="_131" location="f1:26" file="f1" line="26"/> + </Function> + <Function id="_92" name="__builtin_acosf" returns="_133" context="_1" location="f1:25" file="f1" line="25" extern="1"> + <Argument type="_133" location="f1:25" file="f1" line="25"/> + </Function> + <Function id="_93" name="__builtin_acos" returns="_132" context="_1" location="f1:24" file="f1" line="24" extern="1"> + <Argument type="_132" location="f1:24" file="f1" line="24"/> + </Function> + <Function id="_94" name="__builtin_expect" returns="_130" context="_1" location="f1:16" file="f1" line="16" extern="1"> + <Argument name="EXP" type="_130" location="f1:16" file="f1" line="16"/> + <Argument name="C" type="_130" location="f1:16" file="f1" line="16"/> + </Function> + <Function id="_95" name="__builtin_prefetch" returns="_137" context="_1" location="f1:17" file="f1" line="17" extern="1"> + <Argument name="ADDR" type="_138" location="f1:17" file="f1" line="17"/> + <Ellipsis/> + </Function> + <Function id="_96" name="__builtin_return" returns="_137" context="_1" location="f1:13" file="f1" line="13" extern="1" attributes="nothrow noreturn"> + <Argument name="RESULT" type="_139" location="f1:13" file="f1" line="13"/> + </Function> + <Function id="_97" name="__builtin_return_address" returns="_139" context="_1" location="f1:14" file="f1" line="14" extern="1"> + <Argument name="LEVEL" type="_140" location="f1:14" file="f1" line="14"/> + </Function> + <Function id="_98" name="__builtin_frame_address" returns="_139" context="_1" location="f1:15" file="f1" line="15" extern="1"> + <Argument name="LEVEL" type="_140" location="f1:15" file="f1" line="15"/> + </Function> + <Function id="_99" name="__builtin_nansl" returns="_131" context="_1" mangled="nansl" demangled="__int128" location="f1:23" file="f1" line="23" extern="1" attributes="nothrow const"> + <Argument name="str" type="_141" location="f1:23" file="f1" line="23"/> + </Function> + <Function id="_100" name="__builtin_nansf" returns="_133" context="_1" mangled="nansf" demangled="__int128" location="f1:22" file="f1" line="22" extern="1" attributes="nothrow const"> + <Argument name="str" type="_141" location="f1:22" file="f1" line="22"/> + </Function> + <Function id="_101" name="__builtin_nans" returns="_132" context="_1" mangled="nans" demangled="__int128" location="f1:21" file="f1" line="21" extern="1" attributes="nothrow const"> + <Argument name="str" type="_141" location="f1:21" file="f1" line="21"/> + </Function> + <Function id="_102" name="__builtin_infl" returns="_131" context="_1" location="f1:20" file="f1" line="20" extern="1" attributes="nothrow const"/> + <Function id="_103" name="__builtin_inff" returns="_133" context="_1" location="f1:19" file="f1" line="19" extern="1" attributes="nothrow const"/> + <Function id="_104" name="__builtin_inf" returns="_132" context="_1" location="f1:18" file="f1" line="18" extern="1" attributes="nothrow const"/> + <Function id="_105" name="__builtin_logl" returns="_131" context="_1" mangled="logl" demangled="long" location="f1:67" file="f1" line="67" extern="1" attributes="nothrow"> + <Argument type="_131" location="f1:67" file="f1" line="67"/> + </Function> + <Function id="_106" name="__builtin_expl" returns="_131" context="_1" mangled="expl" demangled="long double" location="f1:47" file="f1" line="47" extern="1" attributes="nothrow"> + <Argument type="_131" location="f1:47" file="f1" line="47"/> + </Function> + <Function id="_107" name="__builtin_cosl" returns="_131" context="_1" mangled="cosl" demangled="char" location="f1:44" file="f1" line="44" extern="1" attributes="nothrow pure"> + <Argument type="_131" location="f1:44" file="f1" line="44"/> + </Function> + <Function id="_108" name="__builtin_sinl" returns="_131" context="_1" mangled="sinl" demangled="short" location="f1:80" file="f1" line="80" extern="1" attributes="nothrow pure"> + <Argument type="_131" location="f1:80" file="f1" line="80"/> + </Function> + <Function id="_109" name="__builtin_sqrtl" returns="_131" context="_1" mangled="sqrtl" demangled="short" location="f1:83" file="f1" line="83" extern="1" attributes="nothrow"> + <Argument type="_131" location="f1:83" file="f1" line="83"/> + </Function> + <Function id="_110" name="__builtin_logf" returns="_133" context="_1" mangled="logf" demangled="long" location="f1:66" file="f1" line="66" extern="1" attributes="nothrow"> + <Argument type="_133" location="f1:66" file="f1" line="66"/> + </Function> + <Function id="_111" name="__builtin_expf" returns="_133" context="_1" mangled="expf" demangled="long double" location="f1:46" file="f1" line="46" extern="1" attributes="nothrow"> + <Argument type="_133" location="f1:46" file="f1" line="46"/> + </Function> + <Function id="_112" name="__builtin_cosf" returns="_133" context="_1" mangled="cosf" demangled="char" location="f1:40" file="f1" line="40" extern="1" attributes="nothrow pure"> + <Argument type="_133" location="f1:40" file="f1" line="40"/> + </Function> + <Function id="_113" name="__builtin_sinf" returns="_133" context="_1" mangled="sinf" demangled="short" location="f1:76" file="f1" line="76" extern="1" attributes="nothrow pure"> + <Argument type="_133" location="f1:76" file="f1" line="76"/> + </Function> + <Function id="_114" name="__builtin_sqrtf" returns="_133" context="_1" mangled="sqrtf" demangled="short" location="f1:82" file="f1" line="82" extern="1" attributes="nothrow"> + <Argument type="_133" location="f1:82" file="f1" line="82"/> + </Function> + <Function id="_115" name="__builtin_log" returns="_132" context="_1" mangled="log" demangled="long" location="f1:62" file="f1" line="62" extern="1" attributes="nothrow"> + <Argument type="_132" location="f1:62" file="f1" line="62"/> + </Function> + <Function id="_116" name="__builtin_exp" returns="_132" context="_1" mangled="exp" demangled="long double" location="f1:45" file="f1" line="45" extern="1" attributes="nothrow"> + <Argument type="_132" location="f1:45" file="f1" line="45"/> + </Function> + <Function id="_117" name="__builtin_cos" returns="_132" context="_1" mangled="cos" demangled="char" location="f1:39" file="f1" line="39" extern="1" attributes="nothrow pure"> + <Argument type="_132" location="f1:39" file="f1" line="39"/> + </Function> + <Function id="_118" name="__builtin_sin" returns="_132" context="_1" mangled="sin" demangled="short" location="f1:75" file="f1" line="75" extern="1" attributes="nothrow pure"> + <Argument type="_132" location="f1:75" file="f1" line="75"/> + </Function> + <Function id="_119" name="__builtin_sqrt" returns="_132" context="_1" mangled="sqrt" demangled="short" location="f1:81" file="f1" line="81" extern="1" attributes="nothrow"> + <Argument type="_132" location="f1:81" file="f1" line="81"/> + </Function> + <Function id="_120" name="__builtin_fabsl" returns="_131" context="_1" location="f1:50" file="f1" line="50" extern="1" attributes="nothrow const"> + <Argument type="_131" location="f1:50" file="f1" line="50"/> + </Function> + <Function id="_121" name="__builtin_fabsf" returns="_133" context="_1" location="f1:49" file="f1" line="49" extern="1" attributes="nothrow const"> + <Argument type="_133" location="f1:49" file="f1" line="49"/> + </Function> + <Function id="_122" name="__builtin_fabs" returns="_132" context="_1" location="f1:48" file="f1" line="48" extern="1" attributes="nothrow const"> + <Argument type="_132" location="f1:48" file="f1" line="48"/> + </Function> + <FundamentalType id="_123" name="long unsigned int" size="32" align="32"/> + <CvQualifiedType id="_123c" type="_123" const="1"/> + <FundamentalType id="_125" name="complex long double" size="192" align="32"/> + <FundamentalType id="_126" name="complex double" size="128" align="64"/> + <FundamentalType id="_127" name="complex float" size="64" align="32"/> + <FundamentalType id="_128" name="int" size="32" align="32"/> + <FundamentalType id="_129" name="long long int" size="64" align="64"/> + <FundamentalType id="_130" name="long int" size="32" align="32"/> + <FundamentalType id="_131" name="long double" size="96" align="32"/> + <FundamentalType id="_132" name="double" size="64" align="64"/> + <FundamentalType id="_133" name="float" size="32" align="32"/> + <PointerType id="_134" type="_131" size="32" align="32"/> + <PointerType id="_135" type="_133" size="32" align="32"/> + <PointerType id="_136" type="_128" size="32" align="32"/> + <FundamentalType id="_137" name="void" align="8"/> + <PointerType id="_138" type="_137c" size="32" align="32"/> + <PointerType id="_139" type="_137" size="32" align="32"/> + <FundamentalType id="_140" name="unsigned int" size="32" align="32"/> + <PointerType id="_141" type="_143c" size="32" align="32"/> + <FundamentalType id="_143" name="char" size="8" align="8"/> + <CvQualifiedType id="_143c" type="_143" const="1"/> + <CvQualifiedType id="_137c" type="_137" const="1"/> + <File id="f0" name="const_variables.h"/> + <File id="f1" name="/home/roman/gccxml/share/gccxml-0.7/GCC/4.1/gccxml_builtins.h"/> +</GCC_XML> Added: pygccxml_dev/gccxml-0.9-upgrade/const_variables.9.xml =================================================================== --- pygccxml_dev/gccxml-0.9-upgrade/const_variables.9.xml (rev 0) +++ pygccxml_dev/gccxml-0.9-upgrade/const_variables.9.xml 2007-11-03 21:15:57 UTC (rev 1118) @@ -0,0 +1,405 @@ +<?xml version="1.0"?> +<GCC_XML cvs_revision="1.117"> + <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _2 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 _123 " mangled="_Z2::" demangled="::"/> + <Namespace id="_2" name="std" context="_1" members="" mangled="_Z3std" demangled="std"/> + <Function id="_3" name="__builtin_nans" returns="_124" context="_1" location="f0:21" file="f0" line="21" extern="1" attributes="nothrow const nonnull"> + <Argument name="str" type="_125" location="f0:21" file="f0" line="21"/> + </Function> + <Function id="_4" name="__builtin_acosf" returns="_126" context="_1" mangled="acosf" location="f0:25" file="f0" line="25" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:25" file="f0" line="25"/> + </Function> + <Function id="_5" name="__builtin_acosl" returns="_127" context="_1" mangled="acosl" location="f0:26" file="f0" line="26" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:26" file="f0" line="26"/> + </Function> + <Function id="_6" name="__builtin_log10" returns="_124" context="_1" mangled="log10" location="f0:63" file="f0" line="63" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:63" file="f0" line="63"/> + </Function> + <Function id="_7" name="__builtin_popcountll" returns="_128" context="_1" location="f0:101" file="f0" line="101" extern="1" attributes="nothrow const"> + <Argument type="_129" location="f0:101" file="f0" line="101"/> + </Function> + <Function id="_8" name="__builtin_clogf" returns="_130" context="_1" mangled="clogf" location="f0:111" file="f0" line="111" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:111" file="f0" line="111"/> + </Function> + <Function id="_9" name="__builtin_clogl" returns="_131" context="_1" mangled="clogl" location="f0:113" file="f0" line="113" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:113" file="f0" line="113"/> + </Function> + <Function id="_10" name="__builtin_cexpf" returns="_130" context="_1" mangled="cexpf" location="f0:108" file="f0" line="108" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:108" file="f0" line="108"/> + </Function> + <Function id="_11" name="__builtin_cexpl" returns="_131" context="_1" mangled="cexpl" location="f0:110" file="f0" line="110" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:110" file="f0" line="110"/> + </Function> + <Function id="_12" name="__builtin_asinf" returns="_126" context="_1" mangled="asinf" location="f0:28" file="f0" line="28" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:28" file="f0" line="28"/> + </Function> + <Function id="_13" name="__builtin_asinl" returns="_127" context="_1" mangled="asinl" location="f0:29" file="f0" line="29" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:29" file="f0" line="29"/> + </Function> + <Function id="_14" name="__builtin_popcount" returns="_128" context="_1" location="f0:99" file="f0" line="99" extern="1" attributes="nothrow const"> + <Argument type="_128" location="f0:99" file="f0" line="99"/> + </Function> + <Function id="_15" name="__builtin_nansf" returns="_126" context="_1" location="f0:22" file="f0" line="22" extern="1" attributes="nothrow const nonnull"> + <Argument name="str" type="_125" location="f0:22" file="f0" line="22"/> + </Function> + <Function id="_16" name="__builtin_nansl" returns="_127" context="_1" location="f0:23" file="f0" line="23" extern="1" attributes="nothrow const nonnull"> + <Argument name="str" type="_125" location="f0:23" file="f0" line="23"/> + </Function> + <Function id="_17" name="__builtin_floorf" returns="_126" context="_1" mangled="floorf" location="f0:52" file="f0" line="52" extern="1" attributes="nothrow const"> + <Argument type="_126" location="f0:52" file="f0" line="52"/> + </Function> + <Function id="_18" name="__builtin_floorl" returns="_127" context="_1" mangled="floorl" location="f0:53" file="f0" line="53" extern="1" attributes="nothrow const"> + <Argument type="_127" location="f0:53" file="f0" line="53"/> + </Function> + <Function id="_19" name="__builtin_ctanf" returns="_130" context="_1" mangled="ctanf" location="f0:123" file="f0" line="123" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:123" file="f0" line="123"/> + </Function> + <Function id="_20" name="__builtin_ctanh" returns="_132" context="_1" mangled="ctanh" location="f0:127" file="f0" line="127" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:127" file="f0" line="127"/> + </Function> + <Function id="_21" name="__builtin_ctanl" returns="_131" context="_1" mangled="ctanl" location="f0:125" file="f0" line="125" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:125" file="f0" line="125"/> + </Function> + <Function id="_22" name="__builtin_carg" returns="_124" context="_1" mangled="carg" location="f0:94" file="f0" line="94" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:94" file="f0" line="94"/> + </Function> + <Function id="_23" name="__builtin_clog" returns="_132" context="_1" mangled="clog" location="f0:112" file="f0" line="112" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:112" file="f0" line="112"/> + </Function> + <Function id="_24" name="__builtin_logf" returns="_126" context="_1" mangled="logf" location="f0:66" file="f0" line="66" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:66" file="f0" line="66"/> + </Function> + <Function id="_25" name="__builtin_logl" returns="_127" context="_1" mangled="logl" location="f0:67" file="f0" line="67" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:67" file="f0" line="67"/> + </Function> + <Function id="_26" name="__builtin_fabs" returns="_124" context="_1" mangled="fabs" location="f0:48" file="f0" line="48" extern="1" attributes="nothrow const"> + <Argument type="_124" location="f0:48" file="f0" line="48"/> + </Function> + <Function id="_27" name="__builtin_expf" returns="_126" context="_1" mangled="expf" location="f0:46" file="f0" line="46" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:46" file="f0" line="46"/> + </Function> + <Function id="_28" name="__builtin_expl" returns="_127" context="_1" mangled="expl" location="f0:47" file="f0" line="47" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:47" file="f0" line="47"/> + </Function> + <Function id="_29" name="__builtin_csqrt" returns="_132" context="_1" mangled="csqrt" location="f0:121" file="f0" line="121" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:121" file="f0" line="121"/> + </Function> + <Function id="_30" name="__builtin_sin" returns="_124" context="_1" mangled="sin" location="f0:75" file="f0" line="75" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:75" file="f0" line="75"/> + </Function> + <Function id="_31" name="__builtin_ldexpf" returns="_126" context="_1" mangled="ldexpf" location="f0:60" file="f0" line="60" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:60" file="f0" line="60"/> + <Argument type="_128" location="f0:60" file="f0" line="60"/> + </Function> + <Function id="_32" name="__builtin_ldexpl" returns="_127" context="_1" mangled="ldexpl" location="f0:61" file="f0" line="61" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:61" file="f0" line="61"/> + <Argument type="_128" location="f0:61" file="f0" line="61"/> + </Function> + <Function id="_33" name="__builtin_tanf" returns="_126" context="_1" mangled="tanf" location="f0:85" file="f0" line="85" extern="1" attributes="nothrow pure no vops"> + <Argument type="_126" location="f0:85" file="f0" line="85"/> + </Function> + <Function id="_34" name="__builtin_tanh" returns="_124" context="_1" mangled="tanh" location="f0:86" file="f0" line="86" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:86" file="f0" line="86"/> + </Function> + <Function id="_35" name="__builtin_tanl" returns="_127" context="_1" mangled="tanl" location="f0:89" file="f0" line="89" extern="1" attributes="nothrow pure no vops"> + <Argument type="_127" location="f0:89" file="f0" line="89"/> + </Function> + <Function id="_36" name="__builtin_ceil" returns="_124" context="_1" mangled="ceil" location="f0:36" file="f0" line="36" extern="1" attributes="nothrow const"> + <Argument type="_124" location="f0:36" file="f0" line="36"/> + </Function> + <Function id="_37" name="__builtin_fmodf" returns="_126" context="_1" mangled="fmodf" location="f0:54" file="f0" line="54" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:54" file="f0" line="54"/> + <Argument type="_126" location="f0:54" file="f0" line="54"/> + </Function> + <Function id="_38" name="__builtin_fmodl" returns="_127" context="_1" mangled="fmodl" location="f0:55" file="f0" line="55" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:55" file="f0" line="55"/> + <Argument type="_127" location="f0:55" file="f0" line="55"/> + </Function> + <Function id="_39" name="__builtin_return" returns="_133" context="_1" location="f0:13" file="f0" line="13" extern="1" attributes="nothrow noreturn"> + <Argument name="RESULT" type="_134" location="f0:13" file="f0" line="13"/> + </Function> + <Function id="_40" name="__builtin_sqrt" returns="_124" context="_1" mangled="sqrt" location="f0:81" file="f0" line="81" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:81" file="f0" line="81"/> + </Function> + <Function id="_41" name="__builtin_cpow" returns="_132" context="_1" mangled="cpow" location="f0:130" file="f0" line="130" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:130" file="f0" line="130"/> + <Argument type="_132" location="f0:130" file="f0" line="130"/> + </Function> + <Function id="_42" name="__builtin_coshf" returns="_126" context="_1" mangled="coshf" location="f0:42" file="f0" line="42" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:42" file="f0" line="42"/> + </Function> + <Function id="_43" name="__builtin_coshl" returns="_127" context="_1" mangled="coshl" location="f0:43" file="f0" line="43" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:43" file="f0" line="43"/> + </Function> + <Function id="_44" name="__builtin_cexp" returns="_132" context="_1" mangled="cexp" location="f0:109" file="f0" line="109" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:109" file="f0" line="109"/> + </Function> + <Function id="_45" name="__builtin_atan2" returns="_124" context="_1" mangled="atan2" location="f0:31" file="f0" line="31" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:31" file="f0" line="31"/> + <Argument type="_124" location="f0:31" file="f0" line="31"/> + </Function> + <Function id="_46" name="__builtin_atanf" returns="_126" context="_1" mangled="atanf" location="f0:34" file="f0" line="34" extern="1" attributes="nothrow pure no vops"> + <Argument type="_126" location="f0:34" file="f0" line="34"/> + </Function> + <Function id="_47" name="__builtin_atanl" returns="_127" context="_1" mangled="atanl" location="f0:35" file="f0" line="35" extern="1" attributes="nothrow pure no vops"> + <Argument type="_127" location="f0:35" file="f0" line="35"/> + </Function> + <Function id="_48" name="__builtin_ctan" returns="_132" context="_1" mangled="ctan" location="f0:124" file="f0" line="124" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:124" file="f0" line="124"/> + </Function> + <Function id="_49" name="__builtin_log" returns="_124" context="_1" mangled="log" location="f0:62" file="f0" line="62" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:62" file="f0" line="62"/> + </Function> + <Function id="_50" name="__builtin_asin" returns="_124" context="_1" mangled="asin" location="f0:27" file="f0" line="27" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:27" file="f0" line="27"/> + </Function> + <Function id="_51" name="__builtin_frexp" returns="_124" context="_1" mangled="frexp" location="f0:56" file="f0" line="56" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:56" file="f0" line="56"/> + <Argument type="_135" location="f0:56" file="f0" line="56"/> + </Function> + <Function id="_52" name="__builtin_log10f" returns="_126" context="_1" mangled="log10f" location="f0:64" file="f0" line="64" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:64" file="f0" line="64"/> + </Function> + <Function id="_53" name="__builtin_log10l" returns="_127" context="_1" mangled="log10l" location="f0:65" file="f0" line="65" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:65" file="f0" line="65"/> + </Function> + <Function id="_54" name="__builtin_ctzl" returns="_128" context="_1" location="f0:97" file="f0" line="97" extern="1" attributes="nothrow const"> + <Argument type="_136" location="f0:97" file="f0" line="97"/> + </Function> + <Function id="_55" name="__builtin_powif" returns="_126" context="_1" location="f0:73" file="f0" line="73" extern="1" attributes="nothrow pure no vops"> + <Argument type="_126" location="f0:73" file="f0" line="73"/> + <Argument type="_128" location="f0:73" file="f0" line="73"/> + </Function> + <Function id="_56" name="__builtin_powil" returns="_127" context="_1" location="f0:74" file="f0" line="74" extern="1" attributes="nothrow pure no vops"> + <Argument type="_127" location="f0:74" file="f0" line="74"/> + <Argument type="_128" location="f0:74" file="f0" line="74"/> + </Function> + <Function id="_57" name="__builtin_modff" returns="_126" context="_1" mangled="modff" location="f0:68" file="f0" line="68" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:68" file="f0" line="68"/> + <Argument type="_137" location="f0:68" file="f0" line="68"/> + </Function> + <Function id="_58" name="__builtin_exp" returns="_124" context="_1" mangled="exp" location="f0:45" file="f0" line="45" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:45" file="f0" line="45"/> + </Function> + <Function id="_59" name="__builtin_modfl" returns="_127" context="_1" mangled="modfl" location="f0:69" file="f0" line="69" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:69" file="f0" line="69"/> + <Argument type="_138" location="f0:69" file="f0" line="69"/> + </Function> + <Function id="_60" name="__builtin_prefetch" returns="_133" context="_1" location="f0:17" file="f0" line="17" extern="1" attributes="no vops"> + <Argument name="ADDR" type="_139" location="f0:17" file="f0" line="17"/> + <Ellipsis/> + </Function> + <Function id="_61" name="__builtin_tan" returns="_124" context="_1" mangled="tan" location="f0:84" file="f0" line="84" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:84" file="f0" line="84"/> + </Function> + <Function id="_62" name="__builtin_fabsf" returns="_126" context="_1" mangled="fabsf" location="f0:49" file="f0" line="49" extern="1" attributes="nothrow const"> + <Argument type="_126" location="f0:49" file="f0" line="49"/> + </Function> + <Function id="_63" name="__builtin_fabsl" returns="_127" context="_1" mangled="fabsl" location="f0:50" file="f0" line="50" extern="1" attributes="nothrow const"> + <Argument type="_127" location="f0:50" file="f0" line="50"/> + </Function> + <Function id="_64" name="__builtin_inf" returns="_124" context="_1" location="f0:18" file="f0" line="18" extern="1" attributes="nothrow const"/> + <Namespace id="_65" name="__cxxabiv1" context="_1" members="" mangled="_Z10__cxxabiv1" demangled="__cxxabiv1"/> + <Function id="_66" name="__builtin_frame_address" returns="_134" context="_1" location="f0:15" file="f0" line="15" extern="1"> + <Argument name="LEVEL" type="_140" location="f0:15" file="f0" line="15"/> + </Function> + <Function id="_67" name="__builtin_cabs" returns="_124" context="_1" mangled="cabs" location="f0:91" file="f0" line="91" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:91" file="f0" line="91"/> + </Function> + <Function id="_68" name="__builtin_atan2f" returns="_126" context="_1" mangled="atan2f" location="f0:32" file="f0" line="32" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:32" file="f0" line="32"/> + <Argument type="_126" location="f0:32" file="f0" line="32"/> + </Function> + <Function id="_69" name="__builtin_atan2l" returns="_127" context="_1" mangled="atan2l" location="f0:33" file="f0" line="33" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:33" file="f0" line="33"/> + <Argument type="_127" location="f0:33" file="f0" line="33"/> + </Function> + <Function id="_70" name="__builtin_ccoshf" returns="_130" context="_1" mangled="ccoshf" location="f0:105" file="f0" line="105" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:105" file="f0" line="105"/> + </Function> + <Function id="_71" name="__builtin_ccoshl" returns="_131" context="_1" mangled="ccoshl" location="f0:107" file="f0" line="107" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:107" file="f0" line="107"/> + </Function> + <Function id="_72" name="__builtin_atan" returns="_124" context="_1" mangled="atan" location="f0:30" file="f0" line="30" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:30" file="f0" line="30"/> + </Function> + <Function id="_73" name="__builtin_sinhf" returns="_126" context="_1" mangled="sinhf" location="f0:78" file="f0" line="78" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:78" file="f0" line="78"/> + </Function> + <Function id="_74" name="__builtin_sinhl" returns="_127" context="_1" mangled="sinhl" location="f0:79" file="f0" line="79" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:79" file="f0" line="79"/> + </Function> + <Function id="_75" name="__builtin_sqrtf" returns="_126" context="_1" mangled="sqrtf" location="f0:82" file="f0" line="82" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:82" file="f0" line="82"/> + </Function> + <Function id="_76" name="__builtin_sqrtl" returns="_127" context="_1" mangled="sqrtl" location="f0:83" file="f0" line="83" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:83" file="f0" line="83"/> + </Function> + <Function id="_77" name="__builtin_frexpf" returns="_126" context="_1" mangled="frexpf" location="f0:57" file="f0" line="57" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:57" file="f0" line="57"/> + <Argument type="_135" location="f0:57" file="f0" line="57"/> + </Function> + <Function id="_78" name="__builtin_frexpl" returns="_127" context="_1" mangled="frexpl" location="f0:58" file="f0" line="58" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:58" file="f0" line="58"/> + <Argument type="_135" location="f0:58" file="f0" line="58"/> + </Function> + <Function id="_79" name="__builtin_cpowf" returns="_130" context="_1" mangled="cpowf" location="f0:129" file="f0" line="129" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:129" file="f0" line="129"/> + <Argument type="_130" location="f0:129" file="f0" line="129"/> + </Function> + <Function id="_80" name="__builtin_cpowl" returns="_131" context="_1" mangled="cpowl" location="f0:131" file="f0" line="131" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:131" file="f0" line="131"/> + <Argument type="_131" location="f0:131" file="f0" line="131"/> + </Function> + <Function id="_81" name="__builtin_tanhf" returns="_126" context="_1" mangled="tanhf" location="f0:87" file="f0" line="87" extern="1" attributes="nothrow pure no vops"> + <Argument type="_126" location="f0:87" file="f0" line="87"/> + </Function> + <Function id="_82" name="__builtin_tanhl" returns="_127" context="_1" mangled="tanhl" location="f0:88" file="f0" line="88" extern="1" attributes="nothrow pure no vops"> + <Argument type="_127" location="f0:88" file="f0" line="88"/> + </Function> + <Function id="_83" name="__builtin_cabsf" returns="_126" context="_1" mangled="cabsf" location="f0:90" file="f0" line="90" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:90" file="f0" line="90"/> + </Function> + <Function id="_84" name="__builtin_cabsl" returns="_127" context="_1" mangled="cabsl" location="f0:92" file="f0" line="92" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:92" file="f0" line="92"/> + </Function> + <Function id="_85" name="__builtin_powf" returns="_126" context="_1" mangled="powf" location="f0:70" file="f0" line="70" extern="1" attributes="nothrow"> + <Argument type="_126" location="f0:70" file="f0" line="70"/> + <Argument type="_126" location="f0:70" file="f0" line="70"/> + </Function> + <Function id="_86" name="__builtin_powi" returns="_124" context="_1" location="f0:72" file="f0" line="72" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:72" file="f0" line="72"/> + <Argument type="_128" location="f0:72" file="f0" line="72"/> + </Function> + <Function id="_87" name="__builtin_powl" returns="_127" context="_1" mangled="powl" location="f0:71" file="f0" line="71" extern="1" attributes="nothrow"> + <Argument type="_127" location="f0:71" file="f0" line="71"/> + <Argument type="_127" location="f0:71" file="f0" line="71"/> + </Function> + <Variable id="_88" name="initialized" type="_141c" init="10122004ul" context="_1" location="f1:6" file="f1" line="6"/> + <Function id="_89" name="__builtin_ccos" returns="_132" context="_1" mangled="ccos" location="f0:103" file="f0" line="103" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:103" file="f0" line="103"/> + </Function> + <Function id="_90" name="__builtin_expect" returns="_136" context="_1" location="f0:16" file="f0" line="16" extern="1" attributes="nothrow const"> + <Argument name="EXP" type="_136" location="f0:16" file="f0" line="16"/> + <Argument name="C" type="_136" location="f0:16" file="f0" line="16"/> + </Function> + <Function id="_91" name="__builtin_popcountl" returns="_128" context="_1" location="f0:100" file="f0" line="100" extern="1" attributes="nothrow const"> + <Argument type="_136" location="f0:100" file="f0" line="100"/> + </Function> + <Function id="_92" name="__builtin_inff" returns="_126" context="_1" location="f0:19" file="f0" line="19" extern="1" attributes="nothrow const"/> + <Function id="_93" name="__builtin_infl" returns="_127" context="_1" location="f0:20" file="f0" line="20" extern="1" attributes="nothrow const"/> + <Function id="_94" name="__builtin_cos" returns="_124" context="_1" mangled="cos" location="f0:39" file="f0" line="39" extern="1" attributes="nothrow pure no vops"> + <Argument type="_124" location="f0:39" file="f0" line="39"/> + </Function> + <Function id="_95" name="__builtin_ctz" returns="_128" context="_1" location="f0:96" file="f0" line="96" extern="1" attributes="nothrow const"> + <Argument type="_128" location="f0:96" file="f0" line="96"/> + </Function> + <Function id="_96" name="__builtin_return_address" returns="_134" context="_1" location="f0:14" file="f0" line="14" extern="1"> + <Argument name="LEVEL" type="_140" location="f0:14" file="f0" line="14"/> + </Function> + <Function id="_97" name="__builtin_csinhf" returns="_130" context="_1" mangled="csinhf" location="f0:117" file="f0" line="117" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:117" file="f0" line="117"/> + </Function> + <Function id="_98" name="__builtin_csinhl" returns="_131" context="_1" mangled="csinhl" location="f0:119" file="f0" line="119" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:119" file="f0" line="119"/> + </Function> + <Function id="_99" name="__builtin_csqrtf" returns="_130" context="_1" mangled="csqrtf" location="f0:120" file="f0" line="120" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:120" file="f0" line="120"/> + </Function> + <Function id="_100" name="__builtin_csqrtl" returns="_131" context="_1" mangled="csqrtl" location="f0:122" file="f0" line="122" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:122" file="f0" line="122"/> + </Function> + <Function id="_101" name="__builtin_floor" returns="_124" context="_1" mangled="floor" location="f0:51" file="f0" line="51" extern="1" attributes="nothrow const"> + <Argument type="_124" location="f0:51" file="f0" line="51"/> + </Function> + <Function id="_102" name="__builtin_ldexp" returns="_124" context="_1" mangled="ldexp" location="f0:59" file="f0" line="59" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:59" file="f0" line="59"/> + <Argument type="_128" location="f0:59" file="f0" line="59"/> + </Function> + <Function id="_103" name="__builtin_ccosf" returns="_130" context="_1" mangled="ccosf" location="f0:102" file="f0" line="102" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:102" file="f0" line="102"/> + </Function> + <Function id="_104" name="__builtin_ccosh" returns="_132" context="_1" mangled="ccosh" location="f0:106" file="f0" line="106" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:106" file="f0" line="106"/> + </Function> + <Function id="_105" name="__builtin_ccosl" returns="_131" context="_1" mangled="ccosl" location="f0:104" file="f0" line="104" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:104" file="f0" line="104"/> + </Function> + <Function id="_106" name="__builtin_ctanhf" returns="_130" context="_1" mangled="ctanhf" location="f0:126" file="f0" line="126" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:126" file="f0" line="126"/> + </Function> + <Function id="_107" name="__builtin_ctanhl" returns="_131" context="_1" mangled="ctanhl" location="f0:128" file="f0" line="128" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:128" file="f0" line="128"/> + </Function> + <Function id="_108" name="__builtin_ceilf" returns="_126" context="_1" mangled="ceilf" location="f0:37" file="f0" line="37" extern="1" attributes="nothrow const"> + <Argument type="_126" location="f0:37" file="f0" line="37"/> + </Function> + <Function id="_109" name="__builtin_ceill" returns="_127" context="_1" mangled="ceill" location="f0:38" file="f0" line="38" extern="1" attributes="nothrow const"> + <Argument type="_127" location="f0:38" file="f0" line="38"/> + </Function> + <Function id="_110" name="__builtin_csinf" returns="_130" context="_1" mangled="csinf" location="f0:114" file="f0" line="114" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:114" file="f0" line="114"/> + </Function> + <Function id="_111" name="__builtin_csinh" returns="_132" context="_1" mangled="csinh" location="f0:118" file="f0" line="118" extern="1" attributes="nothrow pure no vops"> + <Argument type="_132" location="f0:118" file="f0" line="118"/> + </Function> + <Function id="_112" name="__builtin_csinl" returns="_131" context="_1" mangled="csinl" location="f0:116" file="f0" line="116" extern="1" attributes="nothrow pure no vops"> + <Argument type="_131" location="f0:116" file="f0" line="116"/> + </Function> + <Function id="_113" name="__builtin_acos" returns="_124" context="_1" mangled="acos" location="f0:24" file="f0" line="24" extern="1" attributes="nothrow"> + <Argument type="_124" location="f0:24" file="f0" line="24"/> + </Function> + <Function id="_114" name="__builtin_ctzll" returns="_128" context="_1" location="f0:98" file="f0" line="98" extern="1" attributes="nothrow const"> + <Argument type="_129" location="f0:98" file="f0" line="98"/> + </Function> + <Function id="_115" name="__builtin_cargf" returns="_126" context="_1" mangled="cargf" location="f0:93" file="f0" line="93" extern="1" attributes="nothrow pure no vops"> + <Argument type="_130" location="f0:93" file="f0" line="93"/> + </Function> + <Function id="_116" name="__builtin_cargl" returns="_... [truncated message content] |
From: <rom...@us...> - 2007-11-05 16:48:07
|
Revision: 1121 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1121&view=rev Author: roman_yakovenko Date: 2007-11-05 08:48:02 -0800 (Mon, 05 Nov 2007) Log Message: ----------- adding info about compiler Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/declaration.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/core_tester.py Modified: pygccxml_dev/pygccxml/declarations/declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/declaration.py 2007-11-04 20:30:29 UTC (rev 1120) +++ pygccxml_dev/pygccxml/declarations/declaration.py 2007-11-05 16:48:02 UTC (rev 1121) @@ -66,7 +66,8 @@ self._attributes = attributes self._parent = None self._cache = algorithms_cache.declaration_algs_cache_t() - + self._compiler = None + def __str__(self): """Default __str__ method. @@ -229,7 +230,6 @@ """ ) - def _create_decl_string(self): return algorithm.full_name( self ) @@ -251,3 +251,11 @@ """return list of all types and declarations the declaration depends on""" print self raise NotImplementedError() + + def _get_compiler( self ): + return self._compiler + def _set_compiler( self, compiler ): + self._compiler = compiler + compiler = property( _get_compiler, _set_compiler + , doc="""compiler name + version + @type: str""" ) Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-11-04 20:30:29 UTC (rev 1120) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-11-05 16:48:02 UTC (rev 1121) @@ -25,6 +25,7 @@ XML_AN_BITS = "bits" XML_AN_CONST = "const" XML_AN_CONTEXT = "context" +XML_AN_CVS_REVISION = "cvs_revision" XML_AN_DEFAULT = "default" XML_AN_DEMANGLED = "demangled" XML_AN_EXTERN = "extern" @@ -61,6 +62,7 @@ XML_NN_FUNCTION_TYPE = "FunctionType" XML_NN_FUNDAMENTAL_TYPE = "FundamentalType" XML_NN_FREE_OPERATOR = "OperatorFunction" +XML_NN_GCC_XML = "GCC_XML" XML_NN_MEMBER_OPERATOR = "OperatorMethod" XML_NN_METHOD = "Method" XML_NN_METHOD_TYPE = "MethodType" @@ -109,6 +111,7 @@ , XML_NN_FREE_OPERATOR : self.__read_free_operator , XML_NN_MEMBER_OPERATOR : self.__read_member_operator , XML_NN_METHOD : self.__read_method + , XML_NN_GCC_XML : self.__read_version } self.deep_declarations = [ XML_NN_CASTING_OPERATOR @@ -143,6 +146,8 @@ self.__inst = None #mapping from id to members self.__members = {} + + self.__compiler = None def read( self ): xml.sax.parse( self.gccxml_file, self ) @@ -197,6 +202,7 @@ self.__read_access( attrs ) element_id = attrs.get(XML_AN_ID, None) if isinstance( obj, declaration_t ): + obj.compiler = self.__compiler self.__update_membership( attrs ) self.__declarations[ element_id ] = obj if not isinstance( obj, namespace_t ): @@ -469,3 +475,13 @@ else: operator.name = 'operator' + operator.name return operator + + def __read_version(self, attrs): + version = float( attrs.get(XML_AN_CVS_REVISION, None) ) + if version is None: + version = "0.6" + elif version <= 1.114: + version = "0.7" + else: + version = "0.9" + self.__compiler = "GCC-XML " + version Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2007-11-04 20:30:29 UTC (rev 1120) +++ pygccxml_dev/unittests/autoconfig.py 2007-11-05 16:48:02 UTC (rev 1121) @@ -18,7 +18,7 @@ if 'roman' in getpass.getuser(): if sys.platform == 'win32': compiler = 'msvc71' - gccxml_path = r'd:/dev/gccxml_cvs/gccxml-bin/bin/release/gccxml.exe' + gccxml_path = r'D:/dev/gccxml/gccxml.exe' else: gccxml_path = '/home/roman/gccxml/bin/gccxml' Modified: pygccxml_dev/unittests/core_tester.py =================================================================== --- pygccxml_dev/unittests/core_tester.py 2007-11-04 20:30:29 UTC (rev 1120) +++ pygccxml_dev/unittests/core_tester.py 2007-11-05 16:48:02 UTC (rev 1121) @@ -294,6 +294,9 @@ implementation = ns.class_( 'implementation' ) self.failUnless( not implementation.is_abstract, "class 'implementation' should not be abstract" ) + def test_versioning(self): + for d in self.global_ns.decls(): + self.failUnless( d.compiler ) class core_all_at_once_t( core_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-10 22:30:12
|
Revision: 1132 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1132&view=rev Author: roman_yakovenko Date: 2007-11-10 14:29:29 -0800 (Sat, 10 Nov 2007) Log Message: ----------- adding is_trivial_constructor functionality Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/calldef.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/data/type_traits.hpp Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2007-11-08 23:28:48 UTC (rev 1131) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2007-11-10 22:29:29 UTC (rev 1132) @@ -469,7 +469,9 @@ cls = 'copy ' + cls return "%s [%s]"%(res, cls) - def _get_is_copy_constructor(self): + @property + def is_copy_constructor(self): + """returns True if described declaration is copy constructor, otherwise False""" args = self.arguments if 1 != len( args ): return False @@ -483,8 +485,11 @@ if not isinstance( unaliased.base, cpptypes.declarated_t ): return False return id(unaliased.base.declaration) == id(self.parent) - is_copy_constructor = property(_get_is_copy_constructor - , doc="returns True if described declaration is copy constructor, otherwise False") + + @property + def is_trivial_constructor(self): + return not bool( self.arguments ) + class destructor_t( member_calldef_t ): """describes deconstructor declaration""" Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-08 23:28:48 UTC (rev 1131) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-10 22:29:29 UTC (rev 1132) @@ -344,22 +344,79 @@ def find_trivial_constructor( type ): """returns reference to trivial constructor or None""" assert isinstance( type, class_declaration.class_t ) - constructors = filter( lambda x: isinstance( x, calldef.constructor_t ) \ - and 0 == len( x.arguments ) \ - , type.public_members ) - if constructors: - return constructors[0] + trivial = type.constructors( lambda x: x.is_trivial_constructor and x.access_type == 'public' + , recursive=False + , allow_empty=True ) + if trivial: + return trivial[0] else: return None def has_trivial_constructor( type ): - """returns True, if class has trivial constructor, False otherwise""" - return None != find_trivial_constructor( type ) + """returns True, if class has public trivial constructor, False otherwise""" + if '0.9' in type.compiler: + trivial = type.constructors( lambda x: x.is_trivial_constructor + , recursive=False + , allow_empty=True ) + if trivial: + if trivial[0].access_type == 'public': + return True + else: + return False + else: + #there is no trivial constructor, so I should find out whether other constructors exist + if type.constructors( recursive=False, allow_empty=True ): + return False + else: + return True + else: + if None != find_trivial_constructor( type ): + return True + return False +""" +Question: Do I have to define a copy constructor and assignment operator? + +Answer: + C++ implicitly declares a copy constructor and an assignment operator + for every class, struct and union unless the user declared them explicitly. + A copy constructor isnot implicitly declared if the class has any user-declared + constructor(s). Implicitly defined copy constructor and assignment operator + are said to be trivial if: + + * their class has no virtual functions and no virtual base class(es) + * all direct base classes and nonstatic data members of their class have trivial constructors + + Otherwise, the copy constructor and the assignment operator are non-trivial. + Implicitly-declared non-trivial copy constructor and assignment operator are + implicitly-defined. + +The assignment operator is called "copy assignment operator" in the standard. +This verbosity doesnot convey any new or hidden meanings. Perhaps it's meant to +differentiate between the assignment operator of fundamental types and the +assignment operator member function of class types. In this series I will stick +to the term assignment operator. +""" + def has_trivial_copy( type): - """returns True, if class has copy constructor, False otherwise""" + """returns True, if class has public copy constructor, False otherwise""" assert isinstance( type, class_declaration.class_t ) - constructors = filter( lambda x: isinstance( x, calldef.constructor_t ) \ + if '0.9' in type.compiler: + copy_ = type.constructors( lambda x: x.is_copy_constructor + , recursive=False + , allow_empty=True ) + if copy_: + if copy_[0].access_type == 'public': + return True + else: + return False + else: + if type.constructors( recursive=False, allow_empty=True ): + return False + else: + return True + else: + constructors = filter( lambda x: isinstance( x, calldef.constructor_t ) \ and x.is_copy_constructor , type.public_members ) return bool( constructors ) @@ -378,7 +435,7 @@ , type=calldef.constructor_t , recursive=False ) constructors = filter( lambda decl: not decl.is_copy_constructor, decls ) - return bool( constructors ) + return bool( constructors ) or has_trivial_constructor( type ) def has_public_assign(type): """returns True, if class has public assign operator, False otherwise""" @@ -396,7 +453,6 @@ , type=calldef.destructor_t , recursive=False ) ) - def is_base_and_derived( based, derived ): """returns True, if there is "base and derived" relationship between classes, False otherwise""" assert isinstance( based, class_declaration.class_t ) @@ -420,7 +476,7 @@ constructors = filter( lambda x: isinstance( x, calldef.constructor_t ) \ and not x.is_copy_constructor , type.public_members ) - return bool( constructors ) + return bool( constructors ) or has_trivial_constructor( type ) def has_public_binary_operator( type, operator_symbol ): """returns True, if type has public binary operator, otherwise False""" @@ -860,6 +916,20 @@ if class_.is_abstract: return True + #~ if '0.9' in class_.compiler: + #~ #class will be mark as noncopyable if it has private operator assign and + #~ #copy constructor + #~ #select all non-public members that are copy constructor and operator assign + #~ is_noncopyable_query = \ + #~ matchers.not_matcher_t( matchers.access_type_matcher_t( 'public' ) )\ + #~ & \ + #~ ( matchers.custom_matcher_t( lambda decl: isinstance( decl, calldef.constructor_t ) \ + #~ and decl.is_copy_constructor ) + #~ | matchers.operator_matcher_t( symbol='=' ) ) + #~ result = class_.decls( is_noncopyable_query, recursive=False, allow_empty=True ) + #~ if result: + #~ return True + #~ else: elif not has_trivial_copy( class_ ): return True elif not has_public_constructor( class_ ): Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2007-11-08 23:28:48 UTC (rev 1131) +++ pygccxml_dev/unittests/autoconfig.py 2007-11-10 22:29:29 UTC (rev 1132) @@ -20,8 +20,13 @@ gccxml_09_path = os.path.join( this_module_dir_path, '..', '..', 'gccxml_bin', 'v09', sys.platform, 'bin' ) gccxml_path = gccxml_09_path -gccxml_version = '__GCCXML_09__' +gccxml_version = '__GCCXML_07__' +if '09' in gccxml_path: + gccxml_version = '__GCCXML_09__' + +print 'compiler: ', gccxml_version + if sys.platform == 'win32': compiler = 'msvc71' Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2007-11-08 23:28:48 UTC (rev 1131) +++ pygccxml_dev/unittests/data/core_cache.hpp 2007-11-10 22:29:29 UTC (rev 1132) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-11-08 23:28:48 UTC (rev 1131) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-11-10 22:29:29 UTC (rev 1132) @@ -79,17 +79,11 @@ } namespace yes{ - typedef detail::x x; -#ifdef __GCCXML_09__ - typedef detail::y_type y_type; -#endif//__GCCXML_09__ - + typedef detail::x x; } namespace no{ typedef std::string string_type; -#ifdef __GCCXML_07__ typedef detail::y_type y_type; -#endif//__GCCXML_07__ } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-13 20:57:24
|
Revision: 1148 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1148&view=rev Author: roman_yakovenko Date: 2007-11-13 12:57:25 -0800 (Tue, 13 Nov 2007) Log Message: ----------- fixing noncopyable bug Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp Added Paths: ----------- pygccxml_dev/unittests/data/noncopyable.hpp Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-11-13 07:24:34 UTC (rev 1147) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-11-13 20:57:25 UTC (rev 1148) @@ -393,4 +393,18 @@ self._container_traits = container_traits.find_container_traits( self ) return self._container_traits + def find_copy_constructor( self ): + copy_ = self.constructors( lambda x: x.is_copy_constructor, recursive=False, allow_empty=True ) + if copy_: + return copy_[0] + else: + return None + + def find_trivial_constructor( self ): + trivial = self.constructors( lambda x: x.is_trivial_constructor, recursive=False, allow_empty=True ) + if trivial: + return trivial[0] + else: + return None + class_types = ( class_t, class_declaration_t ) Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-13 07:24:34 UTC (rev 1147) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-13 20:57:25 UTC (rev 1148) @@ -402,11 +402,9 @@ """returns True, if class has public copy constructor, False otherwise""" assert isinstance( type, class_declaration.class_t ) if '0.9' in type.compiler: - copy_ = type.constructors( lambda x: x.is_copy_constructor - , recursive=False - , allow_empty=True ) + copy_ = type.find_copy_constructor() if copy_: - if copy_[0].access_type == 'public': + if copy_.access_type == 'public': return True else: return False @@ -900,8 +898,18 @@ if class_.class_type == class_declaration.CLASS_TYPES.UNION: return False + + if class_.is_abstract: + return True + + #if class has public, user defined copy constructor, than this class is + #copyable + copy_ = class_.find_copy_constructor() + if copy_ and copy_.access_type == 'public' and not copy_.is_artificial: + return False + for base_desc in class_.recursive_bases: - assert isinstance( base_desc, class_declaration.hierarchy_info_t ) + assert isinstance( base_desc, class_declaration.hierarchy_info_t ) if base_desc.related_class.decl_string in ('::boost::noncopyable', '::boost::noncopyable_::noncopyable' ): return True if not has_trivial_copy( base_desc.related_class ): @@ -910,28 +918,11 @@ , base_desc.related_class.protected_members ) if not protected_ctrs: return True - if __is_noncopyable_single( base_desc.related_class ): return True - - if class_.is_abstract: + + if not has_trivial_copy( class_ ): return True - #~ if '0.9' in class_.compiler: - #~ #class will be mark as noncopyable if it has private operator assign and - #~ #copy constructor - #~ #select all non-public members that are copy constructor and operator assign - #~ is_noncopyable_query = \ - #~ matchers.not_matcher_t( matchers.access_type_matcher_t( 'public' ) )\ - #~ & \ - #~ ( matchers.custom_matcher_t( lambda decl: isinstance( decl, calldef.constructor_t ) \ - #~ and decl.is_copy_constructor ) - #~ | matchers.operator_matcher_t( symbol='=' ) ) - #~ result = class_.decls( is_noncopyable_query, recursive=False, allow_empty=True ) - #~ if result: - #~ return True - #~ else: - elif not has_trivial_copy( class_ ): - return True elif not has_public_constructor( class_ ): return True elif has_destructor( class_ ) and not has_public_destructor( class_ ): @@ -939,7 +930,6 @@ else: return __is_noncopyable_single( class_ ) - def is_defined_in_xxx( xxx, cls ): """small helper function, that checks whether class ( C{cls} ) is defined under C{::xxx} namespace""" Added: pygccxml_dev/unittests/data/noncopyable.hpp =================================================================== --- pygccxml_dev/unittests/data/noncopyable.hpp (rev 0) +++ pygccxml_dev/unittests/data/noncopyable.hpp 2007-11-13 20:57:25 UTC (rev 1148) @@ -0,0 +1,36 @@ +// Boost noncopyable.hpp header file --------------------------------------// + +// (C) Copyright Beman Dawes 1999-2003. 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) + +// See http://www.boost.org/libs/utility for documentation. + +#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED +#define BOOST_NONCOPYABLE_HPP_INCLUDED + +namespace boost { + +// Private copy constructor and copy assignment ensure classes derived from +// class noncopyable cannot be copied. + +// Contributed by Dave Abrahams + +namespace noncopyable_ // protection from unintended ADL +{ + class noncopyable + { + protected: + noncopyable() {} + ~noncopyable() {} + private: // emphasize the following members are private + noncopyable( const noncopyable& ); + const noncopyable& operator=( const noncopyable& ); + }; +} + +typedef noncopyable_::noncopyable noncopyable; + +} // namespace boost + +#endif // BOOST_NONCOPYABLE_HPP_INCLUDED Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-11-13 07:24:34 UTC (rev 1147) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-11-13 20:57:25 UTC (rev 1148) @@ -9,6 +9,8 @@ #include <string> #include <iostream> +#include <vector> +#include "noncopyable.hpp" #define TYPE_PERMUTATION( BASE, NAME ) \ typedef BASE NAME##_t; \ @@ -76,14 +78,93 @@ static const y_type zero; }; + + struct instantiate_vector{ + instantiate_vector() + : v() + {} + + std::vector< int > v; + }; + + + class a_t{ + public: + + static char get_a(){ return 'a'; } + + private: + a_t(){}; + ~a_t(){}; + }; + + class b_t{ + ~b_t(){} + public: + + static char get_b(){ return 'b'; } + + }; + + class c_t : public boost::noncopyable{ + public: + static char get_c(){ return 'c'; } + + }; + + class d_t{ + private: + d_t( const d_t& ); + public: + d_t(){} + ~d_t(){} + static char get_d(){ return 'd'; } + + }; + + class dd_t : public d_t{ + public: + dd_t(){} + ~dd_t(){} + static char get_dd(){ return 'D'; } + }; + + struct e_t{ + virtual void do_smth() = 0; + private: + c_t c; + }; + + struct f_t{ + f_t() : i(0){} + virtual void do_smth() = 0; + private: + const int i; + }; + + struct g_t{ + enum E{e}; + g_t() : e_(e){} + virtual void do_smth() = 0; + private: + const E e_; + }; } namespace yes{ typedef detail::x x; + typedef detail::a_t a_t; + typedef detail::b_t b_t; + typedef detail::c_t c_t; + typedef detail::d_t d_t; + typedef detail::dd_t dd_t; + typedef detail::f_t f_t; + typedef detail::g_t g_t; } namespace no{ typedef std::string string_type; typedef detail::y_type y_type; + typedef std::vector< int > vector_of_int_type; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-14 07:14:02
|
Revision: 1151 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1151&view=rev Author: roman_yakovenko Date: 2007-11-13 23:14:07 -0800 (Tue, 13 Nov 2007) Log Message: ----------- changing treatment of file path for new gccxml Modified Paths: -------------- pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/unittests/decl_printer_tester.py pygccxml_dev/unittests/start_with_declarations_tester.py Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-11-14 07:09:40 UTC (rev 1150) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-11-14 07:14:07 UTC (rev 1151) @@ -485,7 +485,7 @@ return operator def __read_version(self, attrs): - version = float( attrs.get(XML_AN_CVS_REVISION, None) ) + version = float( attrs.get(XML_AN_CVS_REVISION, 0.6) ) if version is None: version = "0.6" elif version < 1.117: Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2007-11-14 07:09:40 UTC (rev 1150) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2007-11-14 07:14:07 UTC (rev 1151) @@ -278,6 +278,8 @@ raise RuntimeError( "pygccxml error: file '%s' does not exist" % file ) def __produce_full_file( self, file_path ): + if 'win' in sys.platform or 'linux' in sys.platform: + file_path = file_path.replace( r'\/', os.path.sep ) if os.path.isabs( file_path ): return file_path try: Modified: pygccxml_dev/unittests/decl_printer_tester.py =================================================================== --- pygccxml_dev/unittests/decl_printer_tester.py 2007-11-14 07:09:40 UTC (rev 1150) +++ pygccxml_dev/unittests/decl_printer_tester.py 2007-11-14 07:14:07 UTC (rev 1151) @@ -3,18 +3,19 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import os import unittest import autoconfig import parser_test_case from pygccxml import parser -from pygccxml import declarations +from pygccxml import declarations class tester_t( parser_test_case.parser_test_case_t ): def __init__(self, *args): parser_test_case.parser_test_case_t.__init__(self, *args) self.__files = [ - 'core_ns_join_1.hpp' + 'core_ns_join_1.hpp' , 'core_ns_join_2.hpp' , 'core_ns_join_3.hpp' , 'core_membership.hpp' @@ -28,6 +29,11 @@ , 'core_overloads_2.hpp' , 'typedefs_base.hpp' ] + + #~ for i, f in enumerate(self.__files): + #~ f = parser.create_cached_source_fc( os.path.join( autoconfig.data_directory, f) + #~ , os.path.join( autoconfig.data_directory, f + '.xml') ) + #~ self.__files[i] = f prj_reader = parser.project_reader_t( self.config ) self.decls = prj_reader.read_files( self.__files , compilation_mode=parser.COMPILATION_MODE.FILE_BY_FILE ) @@ -36,19 +42,19 @@ writer = lambda decl: None declarations.print_declarations( self.decls, writer=writer ) #declarations.print_declarations( self.decls ) - + def test__str__(self): decls = declarations.make_flatten(self.decls) for decl in decls: str(decl) - + def create_suite(): - suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(tester_t)) + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Modified: pygccxml_dev/unittests/start_with_declarations_tester.py =================================================================== --- pygccxml_dev/unittests/start_with_declarations_tester.py 2007-11-14 07:09:40 UTC (rev 1150) +++ pygccxml_dev/unittests/start_with_declarations_tester.py 2007-11-14 07:14:07 UTC (rev 1151) @@ -16,9 +16,8 @@ def __init__(self, *args ): parser_test_case.parser_test_case_t.__init__( self, *args ) self.header = 'core_ns_join_1.hpp' - self.config = config.config_t( gccxml_path=autoconfig.gccxml_path - , working_directory=autoconfig.data_directory - , start_with_declarations=[ 'E11', 'ns::ns12::E13' ] ) + self.config = autoconfig.cxx_parsers_cfg.gccxml.clone() + self.config.start_with_declarations.extend([ 'E11', 'ns::ns12::E13' ] ) def __check_result(self, decls): E11 = find_declaration( decls, fullname='::E11' ) @@ -53,4 +52,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-15 15:23:30
|
Revision: 1156 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1156&view=rev Author: roman_yakovenko Date: 2007-11-15 07:23:34 -0800 (Thu, 15 Nov 2007) Log Message: ----------- even more improving to is_noncopyable and has_trivial_constructor algorithms Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-15 06:57:30 UTC (rev 1155) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-15 15:23:34 UTC (rev 1156) @@ -15,6 +15,7 @@ within this module works on L{type_t} class hierarchy and\\or L{class_t}. """ +import os import types import matchers import typedef @@ -26,6 +27,7 @@ import templates import enumeration import class_declaration +from pygccxml import utils import types as build_in_types def __remove_alias(type_): @@ -344,31 +346,37 @@ def find_trivial_constructor( type ): """returns reference to trivial constructor or None""" assert isinstance( type, class_declaration.class_t ) - trivial = type.constructors( lambda x: x.is_trivial_constructor and x.access_type == 'public' - , recursive=False - , allow_empty=True ) - if trivial: - return trivial[0] - else: - return None + return type.find_trivial_constructor() def has_trivial_constructor( type ): """returns True, if class has public trivial constructor, False otherwise""" + logger = utils.loggers.cxx_parser + true_header = "has_trivial_constructor(TRUE)- %s - " % type.decl_string + false_header = "has_trivial_constructor(false)- %s - " % type.decl_string + if '0.9' in type.compiler: trivial = type.constructors( lambda x: x.is_trivial_constructor , recursive=False , allow_empty=True ) if trivial: if trivial[0].access_type == 'public': + logger.debug( true_header + "there is user defined public trivial constructor" ) return True else: + logger.debug( false_header + "there is user defined non-public trivial constructor" ) return False else: #there is no trivial constructor, so I should find out whether other constructors exist if type.constructors( recursive=False, allow_empty=True ): + logger.debug( false_header + "there are other user defined constructors" ) return False else: - return True + if __contains_noncopyable_mem_var( type ): + logger.debug( false_header + "class doesn't have any user defined constructor and BUT it is NOT copyable" ) + return False + else: + logger.debug( true_header + "class doesn't have any user defined constructor and it is copyable" ) + return True else: if None != find_trivial_constructor( type ): return True @@ -862,48 +870,70 @@ """returns True, if source could be converted to target, otherwise False""" return __is_convertible_t( source, target ).is_convertible() -def __is_noncopyable_single( class_ ): +def __contains_noncopyable_mem_var( class_ ): """implementation details""" - #It is not enough to check base classes, we should also to check - #member variables. - - if has_trivial_copy( class_ ) \ - and has_public_constructor( class_ ) \ - and has_public_assign( class_ ) \ - and has_public_destructor( class_ ): - return False - - mvars = filter( lambda x: isinstance( x, variable.variable_t ) - , class_.declarations ) + logger = utils.loggers.cxx_parser + mvars = class_.vars( lambda v: not v.type_qualifiers.has_static, recursive=False, allow_empty=True ) for mvar in mvars: - if mvar.type_qualifiers.has_static: - continue type_ = remove_alias( mvar.type ) type_ = remove_reference( type_ ) if is_const( type_ ): no_const = remove_const( type_ ) if is_fundamental( no_const ) or is_enum( no_const): - #~ print "__is_noncopyable_single - %s - containes const member variable - fundamental or enum" % class_.decl_string + logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - fundamental or enum" % class_.decl_string ) return True if is_class( no_const ): - #~ print "__is_noncopyable_single - %s - containes const member variable - class" % class_.decl_string + logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - class" % class_.decl_string ) return True + if is_array( no_const ): + logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes const member variable - array" % class_.decl_string ) + return True if is_class( type_ ): cls = type_.declaration if is_noncopyable( cls ): - #~ print "__is_noncopyable_single - %s - containes member variable - class that is not copyable" % class_.decl_string + logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes member variable - class that is not copyable" % class_.decl_string ) return True - return False + logger.debug( "__contains_noncopyable_mem_var - %s - false - doesn't contains noncopyable members" % class_.decl_string ) +def __is_noncopyable_single( class_ ): + """implementation details""" + #It is not enough to check base classes, we should also to check + #member variables. + logger = utils.loggers.cxx_parser + + if has_trivial_copy( class_ ) \ + and has_public_constructor( class_ ) \ + and has_public_assign( class_ ) \ + and has_public_destructor( class_ ): + msg = os.linesep.join([ + "__is_noncopyable_single - %s - COPYABLE:" % class_.decl_string + , " trivial copy constructor: yes" + , " public constructor: yes" + , " public assign: yes" + , " public destructor: yes" + ]) + logger.debug( msg ) + return False + if __contains_noncopyable_mem_var( class_ ): + logger.debug( "__is_noncopyable_single(TRUE) - %s - contains noncopyable members" % class_.decl_string ) + return True + else: + logger.debug( "__is_noncopyable_single(FALSE) - %s - COPYABLE, because is doesn't contains noncopyable members" % class_.decl_string ) + return False + def is_noncopyable( class_ ): """returns True, if class is noncopyable, False otherwise""" + logger = utils.loggers.cxx_parser class_ = class_traits.get_declaration( class_ ) + true_header = "is_noncopyable(TRUE) - %s - " % class_.decl_string + false_header = "is_noncopyable(false) - %s - " % class_.decl_string + if class_.class_type == class_declaration.CLASS_TYPES.UNION: return False if class_.is_abstract: - #~ print "is_noncopyable - %s - abstract client" % class_.decl_string + logger.debug( true_header + "abstract client" ) return True #if class has public, user defined copy constructor, than this class is @@ -915,30 +945,30 @@ for base_desc in class_.recursive_bases: assert isinstance( base_desc, class_declaration.hierarchy_info_t ) if base_desc.related_class.decl_string in ('::boost::noncopyable', '::boost::noncopyable_::noncopyable' ): - #~ print "is_noncopyable - %s - derives from boost::noncopyable" % class_.decl_string + logger.debug( true_header + "derives from boost::noncopyable" ) return True if not has_trivial_copy( base_desc.related_class ): base_copy_ = base_desc.related_class.find_copy_constructor() if base_copy_: if base_copy_.access_type == 'private': - #~ print "is_noncopyable - %s - there is private copy constructor" % class_.decl_string + logger.debug( true_header + "there is private copy constructor" ) return True else: if __is_noncopyable_single( base_desc.related_class ): - #~ print "is_noncopyable - %s - __is_noncopyable_single returned True" % class_.decl_string + logger.debug( true_header + "__is_noncopyable_single returned True" ) return True if __is_noncopyable_single( base_desc.related_class ): - #~ print "is_noncopyable - %s - __is_noncopyable_single returned True" % class_.decl_string + logger.debug( true_header + "__is_noncopyable_single returned True" ) return True if not has_trivial_copy( class_ ): - #~ print "is_noncopyable - %s - does not have trival copy constructor" % class_.decl_string + logger.debug( true_header + "does not have trival copy constructor" ) return True elif not has_public_constructor( class_ ): - #~ print "is_noncopyable - %s - does not have a public constructor" % class_.decl_string + logger.debug( true_header + "does not have a public constructor" ) return True elif has_destructor( class_ ) and not has_public_destructor( class_ ): - #~ print "is_noncopyable - %s - has private destructor" % class_.decl_string + logger.debug( true_header + "has private destructor") return True else: return __is_noncopyable_single( class_ ) Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-11-15 06:57:30 UTC (rev 1155) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-11-15 15:23:34 UTC (rev 1156) @@ -152,7 +152,10 @@ const E e_; }; - + struct const_item{ const int values[10]; }; + + struct const_container{ const const_item items[10]; }; + } namespace yes{ @@ -163,7 +166,9 @@ typedef detail::d_t d_t; typedef detail::dd_t dd_t; typedef detail::f_t f_t; - typedef detail::g_t g_t; + typedef detail::g_t g_t; + typedef detail::const_item const_item_t; + typedef detail::const_container const_container_t; } namespace no{ typedef std::string string_type; @@ -499,6 +504,7 @@ } } namespace has_trivial_constructor{ + namespace yes{ struct x{ x(){} @@ -510,6 +516,10 @@ private: y(){} }; + + struct const_item{ const int values[10]; }; + struct const_container{ const const_item items[10]; }; + } } namespace has_public_constructor{ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-11-22 21:51:02
|
Revision: 1169 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1169&view=rev Author: roman_yakovenko Date: 2007-11-22 13:51:07 -0800 (Thu, 22 Nov 2007) Log Message: ----------- rename has_trivial_copy with has_copy_constructor to better reflect what function does Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/test_all.py pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-11-22 21:51:07 UTC (rev 1169) @@ -156,7 +156,8 @@ from type_traits import has_destructor from type_traits import has_public_less -from type_traits import has_trivial_copy +from type_traits import has_copy_constructor +has_trivial_copy = has_copy_constructor #backward comp mode will be removed from type_traits import has_public_equal from type_traits import has_public_assign from type_traits import has_public_destructor Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-11-22 21:51:07 UTC (rev 1169) @@ -406,25 +406,25 @@ to the term assignment operator. """ -def has_trivial_copy( type): +def has_copy_constructor( class_ ): """returns True, if class has public copy constructor, False otherwise""" - assert isinstance( type, class_declaration.class_t ) - if '0.9' in type.compiler: - copy_ = type.find_copy_constructor() + class_ = class_traits.get_declaration( class_ ) + if '0.9' in class_.compiler: + copy_ = class_.find_copy_constructor() if copy_: if copy_.access_type == 'public': return True else: return False else: - if type.constructors( recursive=False, allow_empty=True ): + if __contains_noncopyable_mem_var( class_ ): return False else: return True else: constructors = filter( lambda x: isinstance( x, calldef.constructor_t ) \ and x.is_copy_constructor - , type.public_members ) + , class_.public_members ) return bool( constructors ) def has_destructor(type): @@ -691,7 +691,7 @@ return True if isinstance( target, cpptypes.declarated_t ): assert isinstance( target.declaration, class_declaration.class_t ) - if has_trivial_copy( target.declaration ): + if has_copy_constructor( target.declaration ): return True #we have copy constructor return False @@ -704,7 +704,7 @@ return True if isinstance( target, cpptypes.declarated_t ): assert isinstance( target.declaration, class_declaration.class_t ) - if has_trivial_copy( target.declaration ): + if has_copy_constructor( target.declaration ): return True #we have copy constructor return False @@ -717,7 +717,7 @@ return True if isinstance( target, cpptypes.declarated_t ): assert isinstance( target.declaration, class_declaration.class_t ) - if has_trivial_copy( target.declaration ): + if has_copy_constructor( target.declaration ): return True #we have copy constructor return False @@ -730,7 +730,7 @@ return True if isinstance( target, cpptypes.declarated_t ): assert isinstance( target.declaration, class_declaration.class_t ) - if has_trivial_copy( target.declaration ): + if has_copy_constructor( target.declaration ): return True #we have copy constructor return False @@ -895,13 +895,13 @@ return True logger.debug( "__contains_noncopyable_mem_var - %s - false - doesn't contains noncopyable members" % class_.decl_string ) -def __is_noncopyable_single( class_ ): +def __is_noncopyable_single( class_): """implementation details""" #It is not enough to check base classes, we should also to check #member variables. logger = utils.loggers.cxx_parser - if has_trivial_copy( class_ ) \ + if has_copy_constructor( class_ ) \ and has_public_constructor( class_ ) \ and has_public_assign( class_ ) \ and has_public_destructor( class_ ): @@ -947,7 +947,7 @@ if base_desc.related_class.decl_string in ('::boost::noncopyable', '::boost::noncopyable_::noncopyable' ): logger.debug( true_header + "derives from boost::noncopyable" ) return True - if not has_trivial_copy( base_desc.related_class ): + if not has_copy_constructor( base_desc.related_class ): base_copy_ = base_desc.related_class.find_copy_constructor() if base_copy_: if base_copy_.access_type == 'private': @@ -961,7 +961,7 @@ logger.debug( true_header + "__is_noncopyable_single returned True" ) return True - if not has_trivial_copy( class_ ): + if not has_copy_constructor( class_ ): logger.debug( true_header + "does not have trival copy constructor" ) return True elif not has_public_constructor( class_ ): Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-11-22 21:51:07 UTC (rev 1169) @@ -485,11 +485,19 @@ return operator def __read_version(self, attrs): + logger = utils.loggers.cxx_parser + version = float( attrs.get(XML_AN_CVS_REVISION, 0.6) ) if version is None: + logger.info ( 'GCCXML version - 0.6' ) version = "0.6" - elif version < 1.117: + elif version <= 1.114: + logger.info ( 'GCCXML version - 0.7' ) version = "0.7" + elif version in ( 1.115, 1.116, 1.117 ): + logger.info ( 'GCCXML version - 0.9 BUGGY' ) + version = "0.9" else: + logger.info ( 'GCCXML version - 0.9' ) version = "0.9" self.__compiler = "GCC-XML " + version Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/unittests/data/core_cache.hpp 2007-11-22 21:51:07 UTC (rev 1169) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-11-22 21:51:07 UTC (rev 1169) @@ -158,6 +158,20 @@ struct const_container{ const const_item items[10]; }; + enum semantic{ position, normal, binormal }; + enum element_type{ float_, color, short_ }; + + struct vertex{ + protected: + unsigned short source; + size_t offset; + semantic sem; + element_type el_type; + public: + vertex( int x, int y, int z ); + + bool operator==( const vertex& ) const; + }; } namespace yes{ @@ -178,6 +192,7 @@ typedef std::vector< int > vector_of_int_type; typedef std::set< std::string > string_set_type; typedef std::multimap< std::string, std::string > s2s_multimap_type; + typedef detail::vertex vertex_type; } } @@ -553,11 +568,12 @@ }; } } -namespace has_trivial_copy{ +namespace has_copy_constructor{ namespace yes{ struct x{ x(const x&){} }; + typedef is_noncopyable::detail::vertex vertex_type; } namespace no{ Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/unittests/test_all.py 2007-11-22 21:51:07 UTC (rev 1169) @@ -47,6 +47,7 @@ import find_container_traits_tester import attributes_tester import type_as_exception_bug_tester +import copy_constructor_tester testers = [ decl_string_tester @@ -90,6 +91,7 @@ , find_container_traits_tester , attributes_tester , type_as_exception_bug_tester + , copy_constructor_tester ] def create_suite(): Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-11-22 21:49:28 UTC (rev 1168) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-11-22 21:51:07 UTC (rev 1169) @@ -126,8 +126,8 @@ def test_has_any_non_copyconstructor(self): self.__test_type_category( 'has_any_non_copyconstructor', declarations.has_any_non_copyconstructor) - def test_has_trivial_copy(self): - self.__test_type_category( 'has_trivial_copy', declarations.has_trivial_copy ) + def test_has_copy_constructor(self): + self.__test_type_category( 'has_copy_constructor', declarations.has_copy_constructor ) def test_is_base_and_derived(self): ns = declarations.find_declaration( self.declarations This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-12-04 20:52:34
|
Revision: 1193 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1193&view=rev Author: roman_yakovenko Date: 2007-12-04 12:52:37 -0800 (Tue, 04 Dec 2007) Log Message: ----------- adding byte_align, byte_size and byte_offset to the declarations and types Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/pygccxml/declarations/typedef.py pygccxml_dev/pygccxml/declarations/variable.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/core_tester.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/data/core_types.hpp Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -129,6 +129,8 @@ self._private_members = [] self._protected_members = [] self._aliases = [] + self._byte_size = 0 + self._byte_align = 0 self._container_traits = None self._container_traits_set = False self._recursive_bases = None @@ -274,6 +276,20 @@ aliases = property( _get_aliases, _set_aliases , doc="List of L{aliases<typedef_t>} to this instance") + def _get_byte_size(self): + return self._byte_size + def _set_byte_size( self, new_byte_size ): + self._byte_size = new_byte_size + byte_size = property( _get_byte_size, _set_byte_size + , doc="Size of this class in bytes @type: int") + + def _get_byte_align(self): + return self._byte_align + def _set_byte_align( self, new_byte_align ): + self._byte_align = new_byte_align + byte_align = property( _get_byte_align, _set_byte_align + , doc="Alignment of this class in bytes @type: int") + def _get_declarations_impl(self): return self.get_members() Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -14,6 +14,8 @@ def __init__(self): object.__init__( self ) self.cache = algorithms_cache.type_algs_cache_t() + self._byte_size = 0 + self._byte_align = 0 def __str__(self): res = self.decl_string @@ -53,6 +55,21 @@ answer = self._clone_impl() return answer + def _get_byte_size(self): + return self._byte_size + def _set_byte_size( self, new_byte_size ): + self._byte_size = new_byte_size + byte_size = property( _get_byte_size, _set_byte_size + , doc="Size of this type in bytes @type: int") + + def _get_byte_align(self): + return self._byte_align + def _set_byte_align( self, new_byte_align ): + self._byte_align = new_byte_align + byte_align = property( _get_byte_align, _set_byte_align + , doc="Alignment of this type in bytes @type: int") + + #There are cases when GCC-XML reports something like this #<Unimplemented id="_9482" tree_code="188" tree_code_name="template_type_parm" node="0xcc4d5b0"/> #In this case I will use this as type @@ -628,6 +645,16 @@ def _clone_impl( self ): return declarated_t( self._declaration ) + @property + def byte_size (self): + "Size of this type in bytes @type: int" + return self._declaration.byte_size + + @property + def byte_align (self): + "alignment of this type in bytes @type: int" + return self._declaration.byte_align + class type_qualifiers_t( object ): """contains additional information about type: mutable, static, extern""" def __init__(self, has_static=False, has_mutable=False ): Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -141,6 +141,11 @@ curr_level = self.level + 1 class_type = 'class type: ' + "'%s'" % str(self.__inst.class_type) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_type.ljust( self.JUSTIFY ) + os.linesep ) + if self.__print_details: + byte_size = 'size: %d'%(self.__inst.byte_size) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) + byte_align = 'align: %d'%(self.__inst.byte_align) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) if self.__inst.aliases: aliases = map( lambda typedef: typedef.name, self.__inst.aliases ) @@ -201,6 +206,13 @@ self.print_decl_header() curr_level = self.level + 1 self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) + os.linesep) + if self.__print_details: + byte_size = 'size: %d'%(self.__inst.type.byte_size) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) + byte_align = 'align: %d'%(self.__inst.type.byte_align) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + byte_offset = 'offset: %d'%(self.__inst.byte_offset) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_offset + os.linesep) def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): """ Print decl tree rooted at each of the included nodes. Modified: pygccxml_dev/pygccxml/declarations/typedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/typedef.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/declarations/typedef.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -36,3 +36,13 @@ def i_depend_on_them( self, recursive=True ): return [ dependencies.dependency_info_t( self, self.type ) ] + + @property + def byte_size (self): + "Size of this type in bytes @type: int" + return self._type.byte_size + + @property + def byte_align (self): + "alignment of this type in bytes @type: int" + return self._type.byte_align Modified: pygccxml_dev/pygccxml/declarations/variable.py =================================================================== --- pygccxml_dev/pygccxml/declarations/variable.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/declarations/variable.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -21,7 +21,8 @@ self._type_qualifiers = type_qualifiers self._value = value self._bits = bits - + self._byte_offset = 0 + def _get__cmp__items( self ): """implementation details""" return [ self.type, self.type_qualifiers, self.value ] @@ -63,6 +64,14 @@ bits = property( _get_bits, _set_bits , doc="integer, that contains information about how many bit takes bit field") + def _get_byte_offset(self): + return self._byte_offset + def _set_byte_offset(self, byte_offset): + self._byte_offset = byte_offset + byte_offset = property( _get_byte_offset, _set_byte_offset + , doc="integer, offset of the field from the beginning of class.") + + @property def access_type(self): if not isinstance( self.parent, class_declaration.class_t ): Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -18,6 +18,7 @@ #also those constants are sorted for easy searching. XML_AN_ABSTRACT = "abstract" XML_AN_ACCESS = "access" +XML_AN_ALIGN = "align" XML_AN_ARTIFICIAL = "artificial" XML_AN_ATTRIBUTES = "attributes" XML_AN_BASE_TYPE = "basetype" @@ -39,9 +40,11 @@ XML_AN_MEMBERS = "members" XML_AN_MUTABLE = "mutable" XML_AN_NAME = "name" +XML_AN_OFFSET = "offset" XML_AN_PURE_VIRTUAL = "pure_virtual" XML_AN_RESTRICT = "restrict" XML_AN_RETURNS = "returns" +XML_AN_SIZE = "size" XML_AN_STATIC = "static" XML_AN_THROW = "throw" XML_AN_TYPE = "type" @@ -210,9 +213,12 @@ self.__read_artificial(obj, attrs) self.__read_mangled( obj, attrs) self.__read_demangled( obj, attrs) - self.__read_attributes(obj, attrs) + self.__read_attributes(obj, attrs) + elif isinstance( obj, type_t ): self.__types[ element_id ] = obj + self.__read_byte_size(obj, attrs) + self.__read_byte_align(obj, attrs) elif isinstance( obj, types.StringTypes ): self.__files[ element_id ] = obj else: @@ -260,6 +266,21 @@ def __read_access( self, attrs ): self.__access[ attrs[XML_AN_ID] ] = attrs.get( XML_AN_ACCESS, ACCESS_TYPES.PUBLIC ) + def __read_byte_size (self, decl, attrs): + "Using duck typing to set the size instead of in constructor" + size = attrs.get(XML_AN_SIZE, 0) + decl.byte_size = int(size)/8 # Make sure the size is in bytes instead of bits + + def __read_byte_offset (self, decl, attrs): + "Using duck typing to set the offset instead of in constructor" + offset = attrs.get(XML_AN_OFFSET, 0) + decl.byte_offset = int(offset)/8 # Make sure the size is in bytes instead of bits + + def __read_byte_align (self, decl, attrs): + "Using duck typing to set the alignment" + align = attrs.get(XML_AN_ALIGN, 0) + decl.byte_align = int(align)/8 # Make sure the size is in bytes instead of bits + def __read_root(self, attrs): pass @@ -408,12 +429,14 @@ bits = attrs.get( XML_AN_BITS, None ) if bits: bits = int( bits ) - return self.__decl_factory.create_variable( name=attrs.get( XML_AN_NAME, '' ) - , type=attrs[XML_AN_TYPE] - , type_qualifiers=type_qualifiers - , value=attrs.get( XML_AN_INIT, None ) - , bits=bits) - + decl = self.__decl_factory.create_variable( name=attrs.get( XML_AN_NAME, '' ) + , type=attrs[XML_AN_TYPE] + , type_qualifiers=type_qualifiers + , value=attrs.get( XML_AN_INIT, None ) + , bits=bits) + self.__read_byte_offset(decl, attrs) + return decl + __read_field = __read_variable #just a synonim def __read_class_impl(self, class_type, attrs): @@ -429,6 +452,8 @@ decl.is_abstract = True else: decl.is_abstract = False + self.__read_byte_size(decl, attrs) + self.__read_byte_align(decl, attrs) return decl def __read_class( self, attrs ): Modified: pygccxml_dev/unittests/core_tester.py =================================================================== --- pygccxml_dev/unittests/core_tester.py 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/unittests/core_tester.py 2007-12-04 20:52:37 UTC (rev 1193) @@ -297,7 +297,20 @@ def test_versioning(self): for d in self.global_ns.decls(): self.failUnless( d.compiler ) + + def test_byte_size( self ): + mptrs = self.global_ns.class_( 'members_pointers_t' ) + self.failUnless( mptrs.byte_size != 0 ) + + def test_byte_align( self ): + mptrs = self.global_ns.class_( 'members_pointers_t' ) + self.failUnless( mptrs.byte_align != 0 ) + def test_byte_offset( self ): + mptrs = self.global_ns.class_( 'members_pointers_t' ) + self.failUnless( mptrs.var( 'xxx' ).byte_offset != 0 ) + + class core_all_at_once_t( core_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE INIT_OPTIMIZER = True Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/unittests/data/core_cache.hpp 2007-12-04 20:52:37 UTC (rev 1193) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pygccxml_dev/unittests/data/core_types.hpp =================================================================== --- pygccxml_dev/unittests/data/core_types.hpp 2007-12-04 18:44:14 UTC (rev 1192) +++ pygccxml_dev/unittests/data/core_types.hpp 2007-12-04 20:52:37 UTC (rev 1193) @@ -46,6 +46,7 @@ struct members_pointers_t{ int some_function( double ) const throw( exception ); int m_some_const_member; + int xxx; }; typedef int (members_pointers_t::*member_function_ptr_t)( double )const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-12-10 17:06:40
|
Revision: 1200 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1200&view=rev Author: roman_yakovenko Date: 2007-12-10 09:06:45 -0800 (Mon, 10 Dec 2007) Log Message: ----------- improving example Modified Paths: -------------- pygccxml_dev/docs/example/example.hpp.xml pygccxml_dev/docs/example/output.txt pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/unittests/data/remove_template_defaults.hpp pygccxml_dev/unittests/find_container_traits_tester.py Modified: pygccxml_dev/docs/example/example.hpp.xml =================================================================== --- pygccxml_dev/docs/example/example.hpp.xml 2007-12-05 20:52:52 UTC (rev 1199) +++ pygccxml_dev/docs/example/example.hpp.xml 2007-12-10 17:06:45 UTC (rev 1200) @@ -1,97 +1,6888 @@ <?xml version="1.0"?> -<GCC_XML cvs_revision="1.112"> - <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 " mangled="_Z2::" demangled="::"/> - <Namespace id="_2" name="std" context="_1" members="" mangled="_Z3std" demangled="std"/> - <Variable id="_3" name="_ZTIN4core15class_hierarchy15multi_derived_tE" type="_9c" context="_1" location="f0:30" file="f0" line="30" extern="1" artificial="1"/> - <Variable id="_4" name="_ZTIN4core15class_hierarchy17derived_private_tE" type="_11c" context="_1" location="f0:27" file="f0" line="27" extern="1" artificial="1"/> - <Variable id="_5" name="_ZTIN4core15class_hierarchy19derived_protected_tE" type="_11c" context="_1" location="f0:24" file="f0" line="24" extern="1" artificial="1"/> - <Variable id="_6" name="_ZTIN4core15class_hierarchy16derived_public_tE" type="_13c" context="_1" location="f0:21" file="f0" line="21" extern="1" artificial="1"/> - <Variable id="_7" name="_ZTIN4core15class_hierarchy6base_tE" type="_15c" context="_1" location="f0:13" file="f0" line="13" extern="1" artificial="1"/> - <Namespace id="_8" name="core" context="_1" members="_17 " mangled="_Z4core" demangled="core"/> - <Struct id="_9" name="__vmi_class_type_info_pseudo3" context="_1" mangled="29__vmi_class_type_info_pseudo3" demangled="__vmi_class_type_info_pseudo3" location="f0:30" file="f0" line="30" size="384" align="32" members="_18 _19 _20 _21 " bases=""/> - <CvQualifiedType id="_9c" type="_9" const="1"/> - <Struct id="_11" name="__vmi_class_type_info_pseudo1" context="_1" mangled="29__vmi_class_type_info_pseudo1" demangled="__vmi_class_type_info_pseudo1" location="f0:24" file="f0" line="24" size="256" align="32" members="_22 _23 _24 _25 " bases=""/> - <CvQualifiedType id="_11c" type="_11" const="1"/> - <Struct id="_13" name="__si_class_type_info_pseudo" context="_1" mangled="27__si_class_type_info_pseudo" demangled="__si_class_type_info_pseudo" location="f1:0" file="f1" line="0" size="96" align="32" members="" bases=""/> - <CvQualifiedType id="_13c" type="_13" const="1"/> - <Struct id="_15" name="__class_type_info_pseudo" context="_1" mangled="24__class_type_info_pseudo" demangled="__class_type_info_pseudo" location="f1:0" file="f1" line="0" size="64" align="32" members="" bases=""/> - <CvQualifiedType id="_15c" type="_15" const="1"/> - <Namespace id="_17" name="class_hierarchy" context="_8" members="_26 _27 _28 _29 _30 _31 " mangled="_ZN4core15class_hierarchyE" demangled="core::class_hierarchy"/> - <Field id="_18" name="" type="_32" offset="0" context="_9" access="public" location="f0:30" file="f0" line="30"/> - <Field id="_19" name="" type="_33" offset="64" context="_9" access="public" location="f0:30" file="f0" line="30"/> - <Field id="_20" name="" type="_33" offset="96" context="_9" access="public" location="f0:30" file="f0" line="30"/> - <Field id="_21" name="" type="_34" offset="128" context="_9" access="public" location="f0:30" file="f0" line="30"/> - <Field id="_22" name="" type="_32" offset="0" context="_11" access="public" location="f0:24" file="f0" line="24"/> - <Field id="_23" name="" type="_33" offset="64" context="_11" access="public" location="f0:24" file="f0" line="24"/> - <Field id="_24" name="" type="_33" offset="96" context="_11" access="public" location="f0:24" file="f0" line="24"/> - <Field id="_25" name="" type="_35" offset="128" context="_11" access="public" location="f0:24" file="f0" line="24"/> - <Class id="_26" name="multi_derived_t" context="_17" mangled="N4core15class_hierarchy15multi_derived_tE" demangled="core::class_hierarchy::multi_derived_t" location="f0:30" file="f0" line="30" artificial="1" size="64" align="32" members="_36 _37 _38 " bases="private:_27 protected:_31 private:_30 "> - <Base type="_27" access="private" virtual="0" offset="0"/> - <Base type="_31" access="protected" virtual="0" offset="4"/> - <Base type="_30" access="private" virtual="0" offset="0"/> +<GCC_XML cvs_revision="1.118"> + <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _116 _117 _118 _119 _120 _121 _122 _123 _124 _126 _127 _128 _129 _130 _131 _132 _133 _134 _135 _136 _137 _139 _140 _141 _142 _143 _144 _145 _146 _148 _149 _150 _151 _152 _153 _155 _156 _157 _158 _159 _160 _161 _162 _163 _164 _165 _166 _167 _168 _169 _170 _171 _172 _173 _174 _175 _176 _177 _178 _179 _180 _181 _182 _183 _184 _185 _186 _187 _188 _189 _190 _191 _192 _193 _194 _195 _196 _197 _198 _199 _200 _201 _202 _203 _204 _205 _206 _207 _208 _209 _210 _211 _212 _213 _214 _218 _219 _221 _220 _222 _223 _224 _225 _226 _227 _228 _229 _230 _231 _233 _234 _235 _236 _237 _238 _239 _240 _241 _242 _243 _244 _245 _246 _247 _248 _249 _250 _251 _252 _253 _254 _255 _256 _257 _258 _259 _260 _261 _262 _263 _264 _265 _266 _267 _268 _269 _270 _271 _272 _273 _276 _277 _278 _279 _280 _281 _282 _284 _283 _285 _286 _287 _288 _289 _290 _291 _292 _293 _294 _295 _296 _297 _298 _299 _300 _301 _302 _303 _304 _305 _306 _308 _309 _310 _311 _312 _313 _314 _315 _316 _317 _318 _319 _320 _321 _322 _324 _325 _326 _328 _329 _330 _331 _332 _333 _334 _335 _336 _337 _338 _339 _2 _343 _344 _345 _346 _347 _348 _349 _353 _354 _355 _356 _357 _358 _359 _360 _361 _362 _363 _364 _365 _366 _367 _368 _369 _370 _371 _372 _373 _374 _375 _376 _377 _378 _379 _380 _381 _382 _383 _384 _385 _386 _387 _388 _389 _390 _391 _232 _392 _393 _394 _395 _396 _397 _398 _399 _400 _401 _402 _406 _407 _408 _409 _410 _411 _412 _413 _414 _415 _416 _417 _418 _419 _420 _421 _423 _424 _425 _426 _427 _428 _429 _430 _431 _432 _433 _434 _437 _438 _439 _440 _441 _442 _443 _444 _445 _446 _447 _448 _450 _449 _451 _452 _453 _454 _455 _456 _457 _458 _459 _460 _461 _462 _463 _464 _465 _466 _467 _468 _469 _470 _471 _472 _473 _474 _475 _476 _477 _478 _479 _480 _481 _482 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _500 _501 _502 _503 _504 _505 _506 _507 _508 _509 _510 _511 _512 _513 _514 _515 _516 _517 _518 _519 _520 _521 _522 _523 _524 _525 _526 _527 _528 _529 _530 _531 _532 _533 _534 _535 _536 _537 _538 _539 _540 _541 _542 _543 _544 _545 _546 _547 _548 _549 _551 _552 _553 _554 _555 _556 _557 _558 _559 _560 _561 _562 _563 _564 _565 _566 _567 _568 _569 _570 _571 _572 _573 _574 _575 _576 _577 _578 _579 _580 _581 _582 _583 _584 " mangled="_Z2::" demangled="::"/> + <Namespace id="_2" name="std" context="_1" members="_585 _4 _617 _620 _621 _625 _626 _628 _629 _631 _632 _640 _641 _642 _62 _643 _644 _647 _648 _670 _674 _124 _677 _678 _680 _683 _684 _685 _686 _688 _689 _693 _697 _698 _700 _701 _702 _202 _703 _707 _708 _711 _716 _233 _717 _718 _720 _726 _728 _729 _730 _731 _733 _750 _299 _751 _755 _756 _757 _308 _758 _760 _764 _320 _325 _767 _768 _769 _774 _775 _776 _359 _777 _778 _385 _782 _784 _785 _792 _400 _794 _797 _418 _798 _421 _799 _800 _802 _804 _455 _461 _807 _808 _810 _811 _815 _816 _817 _818 _819 _820 _827 _503 _833 _834 _835 _839 _539 _847 _848 _850 _851 _852 _854 _855 _856 _858 _859 _864 " mangled="_Z3std" demangled="std"/> + <Function id="_3" name="_wcsset" returns="_865" context="_1" location="f0:191" file="f0" line="191" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f0:191" file="f0" line="191"/> + <Argument type="_550" location="f0:191" file="f0" line="191"/> + </Function> + <Struct id="_4" name="tm" context="_1" mangled="2tm" demangled="tm" location="f1:721" file="f1" line="721" artificial="1" size="288" align="32" members="_866 _867 _868 _869 _870 _871 _872 _873 _874 " bases=""/> + <Function id="_5" name="wcsrtombs" returns="_385" context="_1" location="f1:764" file="f1" line="764" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f1:764" file="f1" line="764"/> + <Argument type="_875" location="f1:764" file="f1" line="764"/> + <Argument type="_385" location="f1:764" file="f1" line="764"/> + <Argument type="_876" location="f1:764" file="f1" line="764"/> + </Function> + <Variable id="_6" name="_pwctype" type="_877" context="_1" location="f2:67" file="f2" line="67" extern="1"/> + <Function id="_7" name="tmpfile" returns="_878" context="_1" location="f3:320" file="f3" line="320" extern="1" attributes="__cdecl__"/> + <Function id="_8" name="_strset" returns="_138" context="_1" location="f0:103" file="f0" line="103" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f0:103" file="f0" line="103"/> + <Argument type="_307" location="f0:103" file="f0" line="103"/> + </Function> + <Function id="_9" name="wcrtomb" returns="_385" context="_1" location="f1:763" file="f1" line="763" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f1:763" file="f1" line="763"/> + <Argument type="_550" location="f1:763" file="f1" line="763"/> + <Argument type="_876" location="f1:763" file="f1" line="763"/> + </Function> + <Function id="_10" name="vprintf" returns="_307" context="_1" location="f3:325" file="f3" line="325" extern="1" attributes="nothrow __cdecl__ nonnull() format(,,)"> + <Argument type="_115" location="f3:325" file="f3" line="325"/> + <Argument type="_139" location="f3:325" file="f3" line="325"/> + </Function> + <Function id="_11" name="swscanf" returns="_307" context="_1" location="f3:380" file="f3" line="380" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:380" file="f3" line="380"/> + <Argument type="_879" location="f3:380" file="f3" line="380"/> + <Ellipsis/> + </Function> + <Function id="_12" name="remove" returns="_307" context="_1" location="f3:306" file="f3" line="306" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f3:306" file="f3" line="306"/> + </Function> + <Function id="_13" name="_strcmpi" returns="_307" context="_1" location="f0:121" file="f0" line="121" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f0:121" file="f0" line="121"/> + <Argument type="_115" location="f0:121" file="f0" line="121"/> + </Function> + <Function id="_14" name="_wcsicmp" returns="_307" context="_1" location="f0:187" file="f0" line="187" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f0:187" file="f0" line="187"/> + <Argument type="_879" location="f0:187" file="f0" line="187"/> + </Function> + <Function id="_15" name="_set_se_translator" returns="_31" context="_1" mangled="_Z18_set_se_translatorPFvjP19_EXCEPTION_POINTERSE" demangled="_set_se_translator(void (*)(unsigned int, _EXCEPTION_POINTERS*))" location="f4:63" file="f4" line="63" extern="1" attributes="__cdecl__"> + <Argument type="_31" location="f4:63" file="f4" line="63"/> + </Function> + <Function id="_16" name="_wpopen" returns="_878" context="_1" location="f3:393" file="f3" line="393" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:393" file="f3" line="393"/> + <Argument type="_879" location="f3:393" file="f3" line="393"/> + </Function> + <Variable id="_17" name="_fmode" type="_307" context="_1" location="f5:239" file="f5" line="239" extern="1"/> + <Function id="_18" name="_fdopen" returns="_878" context="_1" location="f3:263" file="f3" line="263" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f3:263" file="f3" line="263"/> + <Argument type="_115" location="f3:263" file="f3" line="263"/> + </Function> + <FundamentalType id="_19" name="short unsigned int" size="16" align="16"/> + <Typedef id="_20" name="wctype_t" type="_19" context="_1" location="f3:84" file="f3" line="84"/> + <Struct id="_21" name="_iobuf" context="_1" mangled="6_iobuf" demangled="_iobuf" location="f3:125" file="f3" line="125" artificial="1" size="256" align="32" members="_880 _881 _882 _883 _884 _885 _886 _887 " bases=""/> + <Function id="_22" name="wscanf" returns="_307" context="_1" location="f3:382" file="f3" line="382" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:382" file="f3" line="382"/> + <Ellipsis/> + </Function> + <Function id="_23" name="iswascii" returns="_307" context="_1" location="f1:377" file="f1" line="377" endline="377" inline="1" attributes="__cdecl__"> + <Argument name="_C" type="_503" location="f1:377" file="f1" line="377"/> + </Function> + <Variable id="_24" name="_wctype" type="_888c" context="_1" location="f2:65" file="f2" line="65" extern="1"/> + <Function id="_25" name="setbuf" returns="_890" context="_1" location="f3:311" file="f3" line="311" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:311" file="f3" line="311"/> + <Argument type="_138" location="f3:311" file="f3" line="311"/> + </Function> + <Function id="_26" name="gcvt" returns="_138" context="_1" location="f5:434" file="f5" line="434" extern="1" attributes="__cdecl__"> + <Argument type="_891" location="f5:434" file="f5" line="434"/> + <Argument type="_307" location="f5:434" file="f5" line="434"/> + <Argument type="_138" location="f5:434" file="f5" line="434"/> + </Function> + <Function id="_27" name="set_unexpected" returns="_96" context="_1" mangled="_Z14set_unexpectedPFvvE" demangled="set_unexpected(void (*)())" location="f4:62" file="f4" line="62" extern="1" attributes="__cdecl__"> + <Argument type="_96" location="f4:62" file="f4" line="62"/> + </Function> + <Function id="_28" name="_wmktemp" returns="_865" context="_1" location="f1:296" file="f1" line="296" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f1:296" file="f1" line="296"/> + </Function> + <Function id="_29" name="iswupper" returns="_307" context="_1" location="f1:365" file="f1" line="365" endline="365" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:365" file="f1" line="365"/> + </Function> + <PointerType id="_30" type="_892" size="32" align="32"/> + <Typedef id="_31" name="_se_translator_function" type="_30" context="_1" location="f4:51" file="f4" line="51"/> + <Function id="_32" name="iscntrl" returns="_307" context="_1" location="f2:104" file="f2" line="104" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_307" location="f2:104" file="f2" line="104"/> + </Function> + <Function id="_33" name="_wfreopen" returns="_878" context="_1" location="f3:391" file="f3" line="391" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:391" file="f3" line="391"/> + <Argument type="_879" location="f3:391" file="f3" line="391"/> + <Argument type="_878" location="f3:391" file="f3" line="391"/> + </Function> + <Function id="_34" name="_strlwr" returns="_138" context="_1" location="f0:131" file="f0" line="131" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f0:131" file="f0" line="131"/> + </Function> + <Function id="_35" name="fflush" returns="_307" context="_1" location="f3:268" file="f3" line="268" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:268" file="f3" line="268"/> + </Function> + <Function id="_36" name="_wfindnexti64" returns="_307" context="_1" location="f1:301" file="f1" line="301" extern="1" attributes="__cdecl__"> + <Argument type="_383" location="f1:301" file="f1" line="301"/> + <Argument type="_893" location="f1:301" file="f1" line="301"/> + </Function> + <Variable id="_37" name="_ZTISt9bad_alloc" type="_894c" context="_1" location="f6:17" file="f6" line="17" extern="1" artificial="1"/> + <Function id="_38" name="mbrtowc" returns="_385" context="_1" location="f1:760" file="f1" line="760" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f1:760" file="f1" line="760"/> + <Argument type="_115" location="f1:760" file="f1" line="760"/> + <Argument type="_385" location="f1:760" file="f1" line="760"/> + <Argument type="_876" location="f1:760" file="f1" line="760"/> + </Function> + <Function id="_39" name="_makepath" returns="_890" context="_1" location="f5:366" file="f5" line="366" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f5:366" file="f5" line="366"/> + <Argument type="_115" location="f5:366" file="f5" line="366"/> + <Argument type="_115" location="f5:366" file="f5" line="366"/> + <Argument type="_115" location="f5:366" file="f5" line="366"/> + <Argument type="_115" location="f5:366" file="f5" line="366"/> + </Function> + <Function id="_40" name="_putw" returns="_307" context="_1" location="f3:305" file="f3" line="305" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f3:305" file="f3" line="305"/> + <Argument type="_878" location="f3:305" file="f3" line="305"/> + </Function> + <Function id="_41" name="_wstat64" returns="_307" context="_1" location="f1:496" file="f1" line="496" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:496" file="f1" line="496"/> + <Argument type="_896" location="f1:496" file="f1" line="496"/> + </Function> + <Function id="_42" name="strtok" returns="_138" context="_1" location="f0:142" file="f0" line="142" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f0:142" file="f0" line="142"/> + <Argument type="_115" location="f0:142" file="f0" line="142"/> + </Function> + <Function id="_43" name="iswspace" returns="_307" context="_1" location="f1:369" file="f1" line="369" endline="369" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:369" file="f1" line="369"/> + </Function> + <Function id="_44" name="_wfdopen" returns="_878" context="_1" location="f3:389" file="f3" line="389" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f3:389" file="f3" line="389"/> + <Argument type="_879" location="f3:389" file="f3" line="389"/> + </Function> + <Function id="_45" name="towupper" returns="_550" context="_1" location="f1:258" file="f1" line="258" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_550" location="f1:258" file="f1" line="258"/> + </Function> + <Function id="_46" name="_wfullpath" returns="_865" context="_1" location="f1:628" file="f1" line="628" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f1:628" file="f1" line="628"/> + <Argument type="_879" location="f1:628" file="f1" line="628"/> + <Argument type="_385" location="f1:628" file="f1" line="628"/> + </Function> + <Function id="_47" name="__iscsymf" returns="_307" context="_1" location="f2:111" file="f2" line="111" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f2:111" file="f2" line="111"/> + </Function> + <FundamentalType id="_48" name="long int" size="32" align="32"/> + <Typedef id="_49" name="time_t" type="_48" context="_1" location="f1:89" file="f1" line="89"/> + <Struct id="_50" name="_ldiv_t" context="_1" mangled="7_ldiv_t" demangled="_ldiv_t" location="f5:119" file="f5" line="119" artificial="1" size="64" align="32" members="_897 _898 " bases=""/> + <Variable id="_51" name="__argc" type="_307" context="_1" location="f5:222" file="f5" line="222" extern="1"/> + <Variable id="_52" name="__argv" type="_899" context="_1" location="f5:223" file="f5" line="223" extern="1"/> + <Function id="_53" name="strcmpi" returns="_307" context="_1" location="f0:152" file="f0" line="152" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f0:152" file="f0" line="152"/> + <Argument type="_115" location="f0:152" file="f0" line="152"/> + </Function> + <Function id="_54" name="iswalpha" returns="_307" context="_1" location="f1:364" file="f1" line="364" endline="364" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:364" file="f1" line="364"/> + </Function> + <Function id="_55" name="mblen" returns="_307" context="_1" location="f5:297" file="f5" line="297" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:297" file="f5" line="297"/> + <Argument type="_385" location="f5:297" file="f5" line="297"/> + </Function> + <Function id="_56" name="atof" returns="_891" context="_1" location="f5:269" file="f5" line="269" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:269" file="f5" line="269"/> + </Function> + <Function id="_57" name="atoi" returns="_307" context="_1" location="f5:270" file="f5" line="270" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:270" file="f5" line="270"/> + </Function> + <Function id="_58" name="___mb_cur_max_func" returns="_307" context="_1" location="f5:140" file="f5" line="140" extern="1" attributes="__cdecl__"/> + <Function id="_59" name="terminate" returns="_890" context="_1" mangled="_Z9terminatev" demangled="terminate()" location="f4:54" file="f4" line="54" extern="1" attributes="noreturn __cdecl__"/> + <Function id="_60" name="_Getdays" returns="_138" context="_1" location="f7:73" file="f7" line="73" extern="1" attributes="__cdecl__"/> + <PointerType id="_61" type="_900" size="32" align="32"/> + <Typedef id="_62" name="unexpected_handler" type="_61" context="_1" location="f4:48" file="f4" line="48"/> + <Variable id="_63" name="_ZTIN9unittests10test_suiteE" type="_894c" context="_1" location="f8:45" file="f8" line="45" extern="1" artificial="1"/> + <Function id="_64" name="wctomb" returns="_307" context="_1" location="f5:316" file="f5" line="316" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f5:316" file="f5" line="316"/> + <Argument type="_550" location="f5:316" file="f5" line="316"/> + </Function> + <Variable id="_65" name="_ZTISt16invalid_argument" type="_894c" context="_1" location="f9:68" file="f9" line="68" extern="1" artificial="1"/> + <Variable id="_66" name="_ZTISt9type_info" type="_901c" context="_1" location="f10:41" file="f10" line="41" extern="1" artificial="1"/> + <Function id="_67" name="fwprintf" returns="_307" context="_1" location="f3:359" file="f3" line="359" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:359" file="f3" line="359"/> + <Argument type="_879" location="f3:359" file="f3" line="359"/> + <Ellipsis/> + </Function> + <Function id="_68" name="_fullpath" returns="_138" context="_1" location="f5:361" file="f5" line="361" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f5:361" file="f5" line="361"/> + <Argument type="_115" location="f5:361" file="f5" line="361"/> + <Argument type="_385" location="f5:361" file="f5" line="361"/> + </Function> + <Function id="_69" name="wmemmove" returns="_865" context="_1" location="f1:795" file="f1" line="795" endline="797" inline="1"> + <Argument name="_S1" type="_865" location="f1:795" file="f1" line="795"/> + <Argument name="_S2" type="_879" location="f1:795" file="f1" line="795"/> + <Argument name="_N" type="_385" location="f1:795" file="f1" line="795"/> + </Function> + <Function id="_70" name="_cgetws" returns="_865" context="_1" location="f1:507" file="f1" line="507" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f1:507" file="f1" line="507"/> + </Function> + <Variable id="_71" name="_pgmptr" type="_138" context="_1" location="f5:233" file="f5" line="233" extern="1"/> + <Function id="_72" name="wmemchr" returns="_865" context="_1" mangled="_Z7wmemchrPwwj" demangled="wmemchr(wchar_t*, wchar_t, unsigned int)" location="f1:807" file="f1" line="807" endline="808" inline="1"> + <Argument name="_S" type="_865" location="f1:807" file="f1" line="807"/> + <Argument name="_C" type="_550" location="f1:807" file="f1" line="807"/> + <Argument name="_N" type="_385" location="f1:807" file="f1" line="807"/> + </Function> + <Function id="_73" name="wmemchr" returns="_879" context="_1" location="f1:781" file="f1" line="781" endline="785" inline="1"> + <Argument name="_S" type="_879" location="f1:781" file="f1" line="781"/> + <Argument name="_C" type="_550" location="f1:781" file="f1" line="781"/> + <Argument name="_N" type="_385" location="f1:781" file="f1" line="781"/> + </Function> + <Typedef id="_74" name="off_t" type="_48" context="_1" location="f1:414" file="f1" line="414"/> + <Function id="_75" name="wcstod" returns="_891" context="_1" location="f1:602" file="f1" line="602" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:602" file="f1" line="602"/> + <Argument type="_903" location="f1:602" file="f1" line="602"/> + </Function> + <Function id="_76" name="wcstok" returns="_865" context="_1" location="f0:182" file="f0" line="182" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f0:182" file="f0" line="182"/> + <Argument type="_879" location="f0:182" file="f0" line="182"/> + </Function> + <Function id="_77" name="wcstol" returns="_48" context="_1" location="f1:603" file="f1" line="603" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:603" file="f1" line="603"/> + <Argument type="_903" location="f1:603" file="f1" line="603"/> + <Argument type="_307" location="f1:603" file="f1" line="603"/> + </Function> + <Function id="_78" name="__iscsym" returns="_307" context="_1" location="f2:112" file="f2" line="112" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f2:112" file="f2" line="112"/> + </Function> + <Function id="_79" name="_Getdateorder" returns="_307" context="_1" location="f7:72" file="f7" line="72" extern="1" attributes="__cdecl__"/> + <Function id="_80" name="_rotl" returns="_125" context="_1" location="f5:370" file="f5" line="370" extern="1" attributes="__cdecl__"> + <Argument type="_125" location="f5:370" file="f5" line="370"/> + <Argument type="_307" location="f5:370" file="f5" line="370"/> + </Function> + <Function id="_81" name="_rotr" returns="_125" context="_1" location="f5:372" file="f5" line="372" extern="1" attributes="__cdecl__"> + <Argument type="_125" location="f5:372" file="f5" line="372"/> + <Argument type="_307" location="f5:372" file="f5" line="372"/> + </Function> + <Function id="_82" name="_Tolower" returns="_307" context="_1" location="f7:88" file="f7" line="88" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f7:88" file="f7" line="88"/> + <Argument type="_904" location="f7:88" file="f7" line="88"/> + </Function> + <Function id="_83" name="sprintf" returns="_307" context="_1" location="f3:315" file="f3" line="315" extern="1" attributes="nothrow __cdecl__ nonnull() format(,,)"> + <Argument type="_138" location="f3:315" file="f3" line="315"/> + <Argument type="_115" location="f3:315" file="f3" line="315"/> + <Ellipsis/> + </Function> + <Function id="_84" name="strtod" returns="_891" context="_1" location="f5:311" file="f5" line="311" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:311" file="f5" line="311"/> + <Argument type="_899" location="f5:311" file="f5" line="311"/> + </Function> + <Function id="_85" name="strtol" returns="_48" context="_1" location="f5:312" file="f5" line="312" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:312" file="f5" line="312"/> + <Argument type="_899" location="f5:312" file="f5" line="312"/> + <Argument type="_307" location="f5:312" file="f5" line="312"/> + </Function> + <Function id="_86" name="putchar" returns="_307" context="_1" location="f3:303" file="f3" line="303" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f3:303" file="f3" line="303"/> + </Function> + <Function id="_87" name="wcstombs" returns="_385" context="_1" location="f5:317" file="f5" line="317" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f5:317" file="f5" line="317"/> + <Argument type="_879" location="f5:317" file="f5" line="317"/> + <Argument type="_385" location="f5:317" file="f5" line="317"/> + </Function> + <Function id="_88" name="wmemcmp" returns="_307" context="_1" location="f1:786" file="f1" line="786" endline="790" inline="1"> + <Argument name="_S1" type="_879" location="f1:786" file="f1" line="786"/> + <Argument name="_S2" type="_879" location="f1:786" file="f1" line="786"/> + <Argument name="_N" type="_385" location="f1:786" file="f1" line="786"/> + </Function> + <Function id="_89" name="getc" returns="_307" context="_1" location="f3:293" file="f3" line="293" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:293" file="f3" line="293"/> + </Function> + <Function id="_90" name="gets" returns="_138" context="_1" location="f3:296" file="f3" line="296" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f3:296" file="f3" line="296"/> + </Function> + <Function id="_91" name="getw" returns="_307" context="_1" location="f3:442" file="f3" line="442" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:442" file="f3" line="442"/> + </Function> + <Function id="_92" name="_vscprintf" returns="_307" context="_1" location="f3:328" file="f3" line="328" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f3:328" file="f3" line="328"/> + <Argument type="_139" location="f3:328" file="f3" line="328"/> + </Function> + <Function id="_93" name="_wcsnset" returns="_865" context="_1" location="f0:189" file="f0" line="189" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f0:189" file="f0" line="189"/> + <Argument type="_550" location="f0:189" file="f0" line="189"/> + <Argument type="_385" location="f0:189" file="f0" line="189"/> + </Function> + <Function id="_94" name="_wcslwr" returns="_865" context="_1" location="f0:193" file="f0" line="193" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f0:193" file="f0" line="193"/> + </Function> + <Function id="_95" name="fputchar" returns="_307" context="_1" location="f3:441" file="f3" line="441" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f3:441" file="f3" line="441"/> + </Function> + <Typedef id="_96" name="unexpected_function" type="_61" context="_1" location="f4:46" file="f4" line="46"/> + <Function id="_97" name="wmemcpy" returns="_865" context="_1" location="f1:791" file="f1" line="791" endline="793" inline="1"> + <Argument name="_S1" type="_865" location="f1:791" file="f1" line="791"/> + <Argument name="_S2" type="_879" location="f1:791" file="f1" line="791"/> + <Argument name="_N" type="_385" location="f1:791" file="f1" line="791"/> + </Function> + <Function id="_98" name="printf" returns="_307" context="_1" location="f3:301" file="f3" line="301" extern="1" attributes="nothrow __cdecl__ nonnull() format(,,)"> + <Argument type="_115" location="f3:301" file="f3" line="301"/> + <Ellipsis/> + </Function> + <Namespace id="_99" name="unittests" context="_1" members="_905 _906 _907 " mangled="_Z9unittests" demangled="unittests"/> + <Variable id="_100" name="_environ" type="_899" context="_1" location="f5:229" file="f5" line="229" extern="1"/> + <Function id="_101" name="qsort" returns="_890" context="_1" location="f5:302" file="f5" line="302" extern="1" attributes="__cdecl__"> + <Argument type="_908" location="f5:302" file="f5" line="302"/> + <Argument type="_385" location="f5:302" file="f5" line="302"/> + <Argument type="_385" location="f5:302" file="f5" line="302"/> + <Argument type="_909" location="f5:302" file="f5" line="302"/> + </Function> + <Variable id="_102" name="_ZTISt7codecvtIwciE" type="_894c" context="_1" location="f11:655" file="f11" line="655" extern="1" artificial="1"/> + <Function id="_103" name="_cputws" returns="_307" context="_1" location="f1:512" file="f1" line="512" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:512" file="f1" line="512"/> + </Function> + <Variable id="_104" name="_wpgmptr" type="_865" context="_1" location="f5:234" file="f5" line="234" extern="1"/> + <Function id="_105" name="__cxa_end_catch" returns="_890" context="_1" location="f12:592" file="f12" line="592" extern="1"/> + <Function id="_106" name="fseek" returns="_307" context="_1" location="f3:290" file="f3" line="290" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:290" file="f3" line="290"/> + <Argument type="_48" location="f3:290" file="f3" line="290"/> + <Argument type="_307" location="f3:290" file="f3" line="290"/> + </Function> + <Function id="_107" name="flushall" returns="_307" context="_1" location="f3:440" file="f3" line="440" extern="1" attributes="__cdecl__"/> + <Variable id="_108" name="_ZTISt9basic_iosItSt11char_traitsItEE" type="_894c" context="_1" location="f13:16" file="f13" line="16" extern="1" artificial="1"/> + <Function id="_109" name="vwprintf" returns="_307" context="_1" location="f3:370" file="f3" line="370" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:370" file="f3" line="370"/> + <Argument type="_139" location="f3:370" file="f3" line="370"/> + </Function> + <Function id="_110" name="__isascii" returns="_307" context="_1" location="f2:109" file="f2" line="109" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f2:109" file="f2" line="109"/> + </Function> + <Function id="_111" name="__toascii" returns="_307" context="_1" location="f2:110" file="f2" line="110" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f2:110" file="f2" line="110"/> + </Function> + <Function id="_112" name="getchar" returns="_307" context="_1" location="f3:294" file="f3" line="294" extern="1" attributes="__cdecl__"/> + <Function id="_113" name="memchr" returns="_908" context="_1" location="f0:110" file="f0" line="110" extern="1" attributes="__cdecl__"> + <Argument type="_910" location="f0:110" file="f0" line="110"/> + <Argument type="_307" location="f0:110" file="f0" line="110"/> + <Argument type="_385" location="f0:110" file="f0" line="110"/> + </Function> + <Function id="_114" name="clearerr" returns="_890" context="_1" location="f3:256" file="f3" line="256" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:256" file="f3" line="256"/> + </Function> + <PointerType id="_115" type="_911c" size="32" align="32"/> + <Typedef id="_116" name="__exString" type="_115" context="_1" location="f14:36" file="f14" line="36"/> + <Variable id="_117" name="_ZTISt14overflow_error" type="_894c" context="_1" location="f9:167" file="f9" line="167" extern="1" artificial="1"/> + <Function id="_118" name="fgetchar" returns="_307" context="_1" location="f3:438" file="f3" line="438" extern="1" attributes="__cdecl__"/> + <Variable id="_119" name="_ZTIN9unittests9test_caseE" type="_901c" context="_1" location="f8:29" file="f8" line="29" extern="1" artificial="1"/> + <Function id="_120" name="setvbuf" returns="_307" context="_1" location="f3:313" file="f3" line="313" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:313" file="f3" line="313"/> + <Argument type="_138" location="f3:313" file="f3" line="313"/> + <Argument type="_307" location="f3:313" file="f3" line="313"/> + <Argument type="_385" location="f3:313" file="f3" line="313"/> + </Function> + <Function id="_121" name="memmove" returns="_908" context="_1" location="f1:773" file="f1" line="773" extern="1" attributes="nothrow __cdecl__ nonnull"> + <Argument type="_908" location="f0:116" file="f0" line="116"/> + <Argument type="_910" location="f0:116" file="f0" line="116"/> + <Argument type="_385" location="f0:116" file="f0" line="116"/> + </Function> + <Function id="_122" name="_ecvt" returns="_138" context="_1" location="f5:354" file="f5" line="354" extern="1" attributes="__cdecl__"> + <Argument type="_891" location="f5:354" file="f5" line="354"/> + <Argument type="_307" location="f5:354" file="f5" line="354"/> + <Argument type="_913" location="f5:354" file="f5" line="354"/> + <Argument type="_913" location="f5:354" file="f5" line="354"/> + </Function> + <Function id="_123" name="_strncoll" returns="_307" context="_1" location="f0:125" file="f0" line="125" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f0:125" file="f0" line="125"/> + <Argument type="_115" location="f0:125" file="f0" line="125"/> + <Argument type="_385" location="f0:125" file="f0" line="125"/> + </Function> + <Typedef id="_124" name="new_handler" type="_61" context="_2" location="f6:40" file="f6" line="40"/> + <FundamentalType id="_125" name="unsigned int" size="32" align="32"/> + <Typedef id="_126" name="_dev_t" type="_125" context="_1" location="f1:402" file="f1" line="402"/> + <Function id="_127" name="memcpy" returns="_908" context="_1" location="f1:775" file="f1" line="775" extern="1" attributes="nothrow __cdecl__ nonnull"> + <Argument type="_908" location="f0:100" file="f0" line="100"/> + <Argument type="_910" location="f0:100" file="f0" line="100"/> + <Argument type="_385" location="f0:100" file="f0" line="100"/> + </Function> + <Function id="_128" name="strncat" returns="_138" context="_1" location="f0:132" file="f0" line="132" extern="1" attributes="nothrow __cdecl__ nonnull"> + <Argument type="_138" location="f0:132" file="f0" line="132"/> + <Argument type="_115" location="f0:132" file="f0" line="132"/> + <Argument type="_385" location="f0:132" file="f0" line="132"/> + </Function> + <Function id="_129" name="_wcsnicoll" returns="_307" context="_1" location="f0:199" file="f0" line="199" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f0:199" file="f0" line="199"/> + <Argument type="_879" location="f0:199" file="f0" line="199"/> + <Argument type="_385" location="f0:199" file="f0" line="199"/> + </Function> + <Function id="_130" name="ultoa" returns="_138" context="_1" location="f5:440" file="f5" line="440" extern="1" attributes="__cdecl__"> + <Argument type="_323" location="f5:440" file="f5" line="440"/> + <Argument type="_138" location="f5:440" file="f5" line="440"/> + <Argument type="_307" location="f5:440" file="f5" line="440"/> + </Function> + <Function id="_131" name="_wfindfirst64" returns="_383" context="_1" location="f1:300" file="f1" line="300" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f1:300" file="f1" line="300"/> + <Argument type="_914" location="f1:300" file="f1" line="300"/> + </Function> + <Function id="_132" name="_wspawnve" returns="_383" context="_1" location="f1:335" file="f1" line="335" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f1:335" file="f1" line="335"/> + <Argument type="_879" location="f1:335" file="f1" line="335"/> + <Argument type="_915" location="f1:335" file="f1" line="335"/> + <Argument type="_915" location="f1:335" file="f1" line="335"/> + </Function> + <Function id="_133" name="fgetwc" returns="_503" context="_1" location="f3:344" file="f3" line="344" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:344" file="f3" line="344"/> + </Function> + <Function id="_134" name="bsearch" returns="_908" context="_1" location="f5:273" file="f5" line="273" extern="1" attributes="__cdecl__"> + <Argument type="_910" location="f5:273" file="f5" line="273"/> + <Argument type="_910" location="f5:273" file="f5" line="273"/> + <Argument type="_385" location="f5:273" file="f5" line="273"/> + <Argument type="_385" location="f5:273" file="f5" line="273"/> + <Argument type="_909" location="f5:273" file="f5" line="273"/> + </Function> + <Function id="_135" name="fgetws" returns="_865" context="_1" location="f3:354" file="f3" line="354" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f3:354" file="f3" line="354"/> + <Argument type="_307" location="f3:354" file="f3" line="354"/> + <Argument type="_878" location="f3:354" file="f3" line="354"/> + </Function> + <Function id="_136" name="vsprintf" returns="_307" context="_1" location="f3:327" file="f3" line="327" extern="1" attributes="nothrow __cdecl__ nonnull() format(,,)"> + <Argument type="_138" location="f3:327" file="f3" line="327"/> + <Argument type="_115" location="f3:327" file="f3" line="327"/> + <Argument type="_139" location="f3:327" file="f3" line="327"/> + </Function> + <Function id="_137" name="mbstowcs" returns="_385" context="_1" location="f5:300" file="f5" line="300" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f5:300" file="f5" line="300"/> + <Argument type="_115" location="f5:300" file="f5" line="300"/> + <Argument type="_385" location="f5:300" file="f5" line="300"/> + </Function> + <PointerType id="_138" type="_911" size="32" align="32"/> + <Typedef id="_139" name="va_list" type="_138" context="_1" location="f3:96" file="f3" line="96"/> + <Function id="_140" name="_Strcoll" returns="_307" context="_1" location="f7:83" file="f7" line="83" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f7:83" file="f7" line="83"/> + <Argument type="_115" location="f7:83" file="f7" line="83"/> + <Argument type="_115" location="f7:83" file="f7" line="83"/> + <Argument type="_115" location="f7:83" file="f7" line="83"/> + <Argument type="_916" location="f7:83" file="f7" line="83"/> + </Function> + <Function id="_141" name="_Getcvt" returns="_450" context="_1" location="f7:70" file="f7" line="70" extern="1" attributes="__cdecl__"/> + <Function id="_142" name="_wremove" returns="_307" context="_1" location="f3:394" file="f3" line="394" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:394" file="f3" line="394"/> + </Function> + <Function id="_143" name="iswprint" returns="_307" context="_1" location="f1:372" file="f1" line="372" endline="373" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:372" file="f1" line="372"/> + </Function> + <Variable id="_144" name="_ZTI10bad_typeid" type="_894c" context="_1" location="f10:68" file="f10" line="68" extern="1" artificial="1"/> + <Variable id="_145" name="_ZTISt11range_error" type="_894c" context="_1" location="f9:213" file="f9" line="213" extern="1" artificial="1"/> + <Function id="_146" name="_Getwctypes" returns="_879" context="_1" location="f7:99" file="f7" line="99" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f7:99" file="f7" line="99"/> + <Argument type="_879" location="f7:99" file="f7" line="99"/> + <Argument type="_917" location="f7:99" file="f7" line="99"/> + <Argument type="_904" location="f7:99" file="f7" line="99"/> + </Function> + <PointerType id="_147" type="_918" size="32" align="32"/> + <Typedef id="_148" name="_secerr_handler_func" type="_147" context="_1" location="f5:172" file="f5" line="172"/> + <Function id="_149" name="strnset" returns="_138" context="_1" location="f0:157" file="f0" line="157" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f0:157" file="f0" line="157"/> + <Argument type="_307" location="f0:157" file="f0" line="157"/> + <Argument type="_385" location="f0:157" file="f0" line="157"/> + </Function> + <Function id="_150" name="wcsicoll" returns="_307" context="_1" location="f0:215" file="f0" line="215" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f0:215" file="f0" line="215"/> + <Argument type="_879" location="f0:215" file="f0" line="215"/> + </Function> + <Function id="_151" name="fcvt" returns="_138" context="_1" location="f5:433" file="f5" line="433" extern="1" attributes="__cdecl__"> + <Argument type="_891" location="f5:433" file="f5" line="433"/> + <Argument type="_307" location="f5:433" file="f5" line="433"/> + <Argument type="_913" location="f5:433" file="f5" line="433"/> + <Argument type="_913" location="f5:433" file="f5" line="433"/> + </Function> + <Function id="_152" name="_Mbrtowc" returns="_307" context="_1" location="f7:78" file="f7" line="78" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f7:78" file="f7" line="78"/> + <Argument type="_115" location="f7:78" file="f7" line="78"/> + <Argument type="_385" location="f7:78" file="f7" line="78"/> + <Argument type="_876" location="f7:78" file="f7" line="78"/> + <Argument type="_919" location="f7:78" file="f7" line="78"/> + </Function> + <Function id="_153" name="mbtowc" returns="_307" context="_1" location="f5:299" file="f5" line="299" extern="1" attributes="__cdecl__"> + <Argument type="_865" location="f5:299" file="f5" line="299"/> + <Argument type="_115" location="f5:299" file="f5" line="299"/> + <Argument type="_385" location="f5:299" file="f5" line="299"/> + </Function> + <FundamentalType id="_154" name="long long int" size="64" align="64"/> + <Typedef id="_155" name="__time64_t" type="_154" context="_1" location="f1:96" file="f1" line="96"/> + <Function id="_156" name="_cwprintf" returns="_307" context="_1" location="f1:513" file="f1" line="513" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:513" file="f1" line="513"/> + <Ellipsis/> + </Function> + <Function id="_157" name="abort" returns="_890" context="_1" location="f5:255" file="f5" line="255" extern="1" attributes="nothrow noreturn __cdecl__"/> + <Function id="_158" name="onexit" returns="_423" context="_1" location="f5:437" file="f5" line="437" extern="1" attributes="__cdecl__"> + <Argument type="_423" location="f5:437" file="f5" line="437"/> + </Function> + <Function id="_159" name="iswlower" returns="_307" context="_1" location="f1:366" file="f1" line="366" endline="366" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:366" file="f1" line="366"/> + </Function> + <Variable id="_160" name="_ZTISt12length_error" type="_894c" context="_1" location="f9:91" file="f9" line="91" extern="1" artificial="1"/> + <Function id="_161" name="getwchar" returns="_503" context="_1" location="f3:349" file="f3" line="349" extern="1" attributes="__cdecl__"/> + <Function id="_162" name="_wtof" returns="_891" context="_1" location="f1:607" file="f1" line="607" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:607" file="f1" line="607"/> + </Function> + <Function id="_163" name="_itoa" returns="_138" context="_1" location="f5:281" file="f5" line="281" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f5:281" file="f5" line="281"/> + <Argument type="_138" location="f5:281" file="f5" line="281"/> + <Argument type="_307" location="f5:281" file="f5" line="281"/> + </Function> + <Function id="_164" name="_wtoi" returns="_307" context="_1" location="f1:608" file="f1" line="608" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:608" file="f1" line="608"/> + </Function> + <Function id="_165" name="_wtol" returns="_48" context="_1" location="f1:609" file="f1" line="609" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:609" file="f1" line="609"/> + </Function> + <Function id="_166" name="strncmp" returns="_307" context="_1" location="f0:133" file="f0" line="133" extern="1" attributes="nothrow pure __cdecl__ nonnull"> + <Argument type="_115" location="f0:133" file="f0" line="133"/> + <Argument type="_115" location="f0:133" file="f0" line="133"/> + <Argument type="_385" location="f0:133" file="f0" line="133"/> + </Function> + <Function id="_167" name="_itow" returns="_865" context="_1" location="f1:599" file="f1" line="599" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f1:599" file="f1" line="599"/> + <Argument type="_865" location="f1:599" file="f1" line="599"/> + <Argument type="_307" location="f1:599" file="f1" line="599"/> + </Function> + <Variable id="_168" name="_osplatform" type="_125" context="_1" location="f5:245" file="f5" line="245" extern="1"/> + <Function id="_169" name="fputwc" returns="_503" context="_1" location="f3:346" file="f3" line="346" extern="1" attributes="__cdecl__"> + <Argument type="_550" location="f3:346" file="f3" line="346"/> + <Argument type="_878" location="f3:346" file="f3" line="346"/> + </Function> + <Function id="_170" name="_getwche" returns="_503" context="_1" location="f1:509" file="f1" line="509" extern="1" attributes="__cdecl__"/> + <Function id="_171" name="fputws" returns="_307" context="_1" location="f3:355" file="f3" line="355" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f3:355" file="f3" line="355"/> + <Argument type="_878" location="f3:355" file="f3" line="355"/> + </Function> + <Function id="_172" name="strncpy" returns="_138" context="_1" location="f0:135" file="f0" line="135" extern="1" attributes="nothrow __cdecl__ nonnull"> + <Argument type="_138" location="f0:135" file="f0" line="135"/> + <Argument type="_115" location="f0:135" file="f0" line="135"/> + <Argument type="_385" location="f0:135" file="f0" line="135"/> + </Function> + <Function id="_173" name="_wstat" returns="_307" context="_1" location="f1:492" file="f1" line="492" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:492" file="f1" line="492"/> + <Argument type="_920" location="f1:492" file="f1" line="492"/> + </Function> + <Function id="_174" name="rand" returns="_307" context="_1" location="f5:303" file="f5" line="303" extern="1" attributes="__cdecl__"/> + <Function id="_175" name="swab" returns="_890" context="_1" location="f5:439" file="f5" line="439" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f5:439" file="f5" line="439"/> + <Argument type="_138" location="f5:439" file="f5" line="439"/> + <Argument type="_307" location="f5:439" file="f5" line="439"/> + </Function> + <Function id="_176" name="getwc" returns="_503" context="_1" location="f3:348" file="f3" line="348" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:348" file="f3" line="348"/> + </Function> + <Function id="_177" name="_popen" returns="_878" context="_1" location="f3:300" file="f3" line="300" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f3:300" file="f3" line="300"/> + <Argument type="_115" location="f3:300" file="f3" line="300"/> + </Function> + <Function id="_178" name="free" returns="_890" context="_1" location="f5:279" file="f5" line="279" extern="1" attributes="__cdecl__"> + <Argument type="_908" location="f5:279" file="f5" line="279"/> + </Function> + <Function id="_179" name="towlower" returns="_550" context="_1" location="f1:259" file="f1" line="259" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_550" location="f1:259" file="f1" line="259"/> + </Function> + <Function id="_180" name="isupper" returns="_307" context="_1" location="f2:95" file="f2" line="95" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_307" location="f2:95" file="f2" line="95"/> + </Function> + <Function id="_181" name="toupper" returns="_307" context="_1" location="f2:105" file="f2" line="105" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_307" location="f5:411" file="f5" line="411"/> + </Function> + <Function id="_182" name="rmtmp" returns="_307" context="_1" location="f3:444" file="f3" line="444" extern="1" attributes="__cdecl__"/> + <Function id="_183" name="_Strxfrm" returns="_385" context="_1" location="f7:87" file="f7" line="87" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f7:87" file="f7" line="87"/> + <Argument type="_138" location="f7:87" file="f7" line="87"/> + <Argument type="_115" location="f7:87" file="f7" line="87"/> + <Argument type="_115" location="f7:87" file="f7" line="87"/> + <Argument type="_916" location="f7:87" file="f7" line="87"/> + </Function> + <Function id="_184" name="_strerror" returns="_138" context="_1" location="f0:129" file="f0" line="129" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f0:129" file="f0" line="129"/> + </Function> + <Function id="_185" name="iswctype" returns="_307" context="_1" location="f1:261" file="f1" line="261" extern="1" attributes="__cdecl__"> + <Argument type="_503" location="f1:261" file="f1" line="261"/> + <Argument type="_20" location="f1:261" file="f1" line="261"/> + </Function> + <Function id="_186" name="fgetpos" returns="_307" context="_1" location="f3:271" file="f3" line="271" extern="1" attributes="__cdecl__"> + <Argument type="_878" location="f3:271" file="f3" line="271"/> + <Argument type="_921" location="f3:271" file="f3" line="271"/> + </Function> + <Variable id="_187" name="_sys_nerr" type="_307" context="_1" location="f5:194" file="f5" line="194" extern="1"/> + <Struct id="_188" name="__stat64" context="_1" mangled="8__stat64" demangled="__stat64" location="f1:468" file="f1" line="468" artificial="1" size="448" align="64" members="_922 _923 _924 _925 _926 _927 _928 _929 _930 _931 _932 " bases=""/> + <Function id="_189" name="_strnicmp" returns="_307" context="_1" location="f0:134" file="f0" line="134" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f0:134" file="f0" line="134"/> + <Argument type="_115" location="f0:134" file="f0" line="134"/> + <Argument type="_385" location="f0:134" file="f0" line="134"/> + </Function> + <Function id="_190" name="_seterrormode" returns="_890" context="_1" location="f5:395" file="f5" line="395" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f5:395" file="f5" line="395"/> + </Function> + <Function id="_191" name="_wmkdir" returns="_307" context="_1" location="f1:277" file="f1" line="277" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:277" file="f1" line="277"/> + </Function> + <Variable id="_192" name="_ZTINSt6locale7_LocimpE" type="_894c" context="_1" location="f11:145" file="f11" line="145" extern="1" artificial="1"/> + <Function id="_193" name="_Strftime" returns="_385" context="_1" location="f7:85" file="f7" line="85" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f7:85" file="f7" line="85"/> + <Argument type="_385" location="f7:85" file="f7" line="85"/> + <Argument type="_115" location="f7:85" file="f7" line="85"/> + <Argument type="_933" location="f7:85" file="f7" line="85"/> + <Argument type="_908" location="f7:85" file="f7" line="85"/> + </Function> + <Function id="_194" name="_wsystem" returns="_307" context="_1" location="f1:606" file="f1" line="606" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f1:339" file="f1" line="339"/> + </Function> + <Function id="_195" name="isspace" returns="_307" context="_1" location="f2:99" file="f2" line="99" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_307" location="f2:99" file="f2" line="99"/> + </Function> + <Function id="_196" name="memccpy" returns="_908" context="_1" location="f0:150" file="f0" line="150" extern="1" attributes="__cdecl__"> + <Argument type="_908" location="f0:150" file="f0" line="150"/> + <Argument type="_910" location="f0:150" file="f0" line="150"/> + <Argument type="_307" location="f0:150" file="f0" line="150"/> + <Argument type="_385" location="f0:150" file="f0" line="150"/> + </Function> + <Function id="_197" name="realloc" returns="_908" context="_1" location="f5:304" file="f5" line="304" extern="1" attributes="__cdecl__"> + <Argument type="_908" location="f5:304" file="f5" line="304"/> + <Argument type="_385" location="f5:304" file="f5" line="304"/> + </Function> + <Function id="_198" name="tmpnam" returns="_138" context="_1" location="f3:321" file="f3" line="321" extern="1" attributes="__cdecl__"> + <Argument type="_138" location="f3:321" file="f3" line="321"/> + </Function> + <Typedef id="_199" name="_purecall_handler" type="_61" context="_1" location="f5:176" file="f5" line="176"/> + <Function id="_200" name="_ltoa" returns="_138" context="_1" location="f5:295" file="f5" line="295" extern="1" attributes="__cdecl__"> + <Argument type="_48" location="f5:295" file="f5" line="295"/> + <Argument type="_138" location="f5:295" file="f5" line="295"/> + <Argument type="_307" location="f5:295" file="f5" line="295"/> + </Function> + <Function id="_201" name="_wcserror" returns="_865" context="_1" location="f0:183" file="f0" line="183" extern="1" attributes="__cdecl__"> + <Argument type="_307" location="f0:183" file="f0" line="183"/> + </Function> + <Class id="_202" name="__non_rtti_object" context="_1" mangled="17__non_rtti_object" demangled="__non_rtti_object" location="f10:75" file="f10" line="75" artificial="1" size="96" align="32" members="_934 _935 _936 " bases="_455 "> + <Base type="_455" access="public" virtual="0" offset="0"/> </Class> - <Class id="_27" name="derived_private_t" context="_17" mangled="N4core15class_hierarchy17derived_private_tE" demangled="core::class_hierarchy::derived_private_t" location="f0:27" file="f0" line="27" artificial="1" size="32" align="32" members="_39 _40 _41 " bases="private:_31 "> - <Base type="_31" access="private" virtual="0" offset="0"/> + <Function id="_203" name="_ltow" returns="_865" context="_1" location="f1:600" file="f1" line="600" extern="1" attributes="__cdecl__"> + <Argument type="_48" location="f1:600" file="f1" line="600"/> + <Argument type="_865" location="f1:600" file="f1" line="600"/> + <Argument type="_307" location="f1:600" file="f1" line="600"/> + </Function> + <Function id="_204" name="iswdigit" returns="_307" context="_1" location="f1:367" file="f1" line="367" endline="367" inline="1" attributes="nothrow pure __cdecl__"> + <Argument name="_C" type="_503" location="f1:367" file="f1" line="367"/> + </Function> + <Function id="_205" name="putwc" returns="_503" context="_1" location="f3:350" file="f3" line="350" extern="1" attributes="__cdecl__"> + <Argument type="_550" location="f3:350" file="f3" line="350"/> + <Argument type="_878" location="f3:350" file="f3" line="350"/> + </Function> + <Function id="_206" name="isalpha" returns="_307" context="_1" location="f2:94" file="f2" line="94" extern="1" attributes="nothrow pure __cdecl__"> + <Argument type="_307" location="f2:94" file="f2" line="94"/> + </Function> + <Function id="_207" name="_strtoui64" returns="_327" context="_1" location="f5:287" file="f5" line="287" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f5:287" file="f5" line="287"/> + <Argument type="_899" location="f5:287" file="f5" line="287"/> + <Argument type="_307" location="f5:287" file="f5" line="287"/> + </Function> + <Function id="_208" name="_wcsnicmp" returns="_307" context="_1" location="f0:188" file="f0" line="188" extern="1" attributes="__cdecl__"> + <Argument type="_879" location="f0:188" file="f0" line="188"/> + <Argument type="_879" location="f0:188" file="f0" line="188"/> + <Argument type="_385" location="f0:188" file="f0" line="188"/> + </Function> + <Function id="_209" name="tempnam" returns="_138" context="_1" location="f3:445" file="f3" line="445" extern="1" attributes="__cdecl__"> + <Argument type="_115" location="f3:445" file="f3" line="445"/> + <Argument type="_115" location="f3:445" file="f3" line="445"/> + </Function> + <Function id="_210" name="_set_error_mode" returns="_307" context="_1" location="f5:305" file="f5" line="305" extern="1" attributes="__cdecl__"> + <Argument type="_307" locatio... [truncated message content] |
From: <rom...@us...> - 2007-12-10 21:29:16
|
Revision: 1201 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1201&view=rev Author: roman_yakovenko Date: 2007-12-10 13:29:19 -0800 (Mon, 10 Dec 2007) Log Message: ----------- improving partial name implementation Modified Paths: -------------- pygccxml_dev/docs/pygccxml.rest pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/pygccxml/declarations/enumeration.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/core_tester.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/data/remove_template_defaults.hpp pygccxml_dev/unittests/find_container_traits_tester.py Modified: pygccxml_dev/docs/pygccxml.rest =================================================================== --- pygccxml_dev/docs/pygccxml.rest 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/docs/pygccxml.rest 2007-12-10 21:29:19 UTC (rev 1201) @@ -128,7 +128,7 @@ `pygccxml`_ comes with comprehensive unit tests. It is running on Windows XP and `Ubuntu`_. I am using `Python`_ 2.4\\2.5 and `GCC-XML`_ CVS. `pygccxml`_ has -more then 170 tests. They test almost every piece of code. It also has performance +more then 215 tests. They test almost every piece of code. It also has performance tests. Most of the time I am using "white box" testing strategy. .. _`WSDL`: http://www.w3.org/TR/wsdl Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -40,8 +40,6 @@ elif templates.is_instantiation( name ): tmpl_name, args = templates.split( name ) for i, arg_name in enumerate( args ): - print i, ' : ', get_partial_name( arg_name.strip() ) - print args[i] = get_partial_name( arg_name.strip() ) return templates.join( tmpl_name, args ) else: @@ -125,10 +123,7 @@ return self._container_traits def _get_partial_name_impl( self ): - #~ return get_partial_name( self.name ) - if not self.container_traits: - return self.name - return self.container_traits.remove_defaults( self ) + return get_partial_name( self.name ) class class_t( scopedef.scopedef_t ): """describes class definition""" @@ -447,9 +442,6 @@ return None def _get_partial_name_impl( self ): - #~ return get_partial_name( self.name ) - if not self.container_traits: - return self.name - return self.container_traits.remove_defaults( self ) + return get_partial_name( self.name ) class_types = ( class_t, class_declaration_t ) Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -406,6 +406,8 @@ if not templates.is_instantiation( cls_or_string ): return None name = templates.name( cls_or_string ) + if name.startswith( 'std::' ): + name = name[ len( 'std::' ): ] for cls_traits in container_traits: if cls_traits.name() == name: return cls_traits Modified: pygccxml_dev/pygccxml/declarations/enumeration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/enumeration.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/pygccxml/declarations/enumeration.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -36,6 +36,8 @@ # Initialize values via property access self.values = values + self._byte_size = 0 + self._byte_align = 0 def __eq__(self, other): if not declaration.declaration_t.__eq__( self, other ): @@ -116,3 +118,18 @@ def i_depend_on_them( self, recursive=True ): return [] + + def _get_byte_size(self): + return self._byte_size + def _set_byte_size( self, new_byte_size ): + self._byte_size = new_byte_size + byte_size = property( _get_byte_size, _set_byte_size + , doc="Size of this class in bytes @type: int") + + def _get_byte_align(self): + return self._byte_align + def _set_byte_align( self, new_byte_align ): + self._byte_align = new_byte_align + byte_align = property( _get_byte_align, _set_byte_align + , doc="Alignment of this class in bytes @type: int") + Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -302,6 +302,8 @@ #it means that this is unnamed enum. in c++ enum{ x }; enum_name = '' decl = self.__decl_factory.create_enumeration( name=enum_name ) + self.__read_byte_size(decl, attrs) + self.__read_byte_align(decl, attrs) self.__enums.append( decl ) return decl Modified: pygccxml_dev/unittests/core_tester.py =================================================================== --- pygccxml_dev/unittests/core_tester.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/unittests/core_tester.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -282,8 +282,16 @@ % ( 4, len(do_nothings) ) ) for index, do_nothing in enumerate(do_nothings): others = do_nothings[:index] + do_nothings[index+1:] + if set( do_nothing.overloads ) != set( others ): + print '\nexisting: ' + for x in do_nothing.overloads: + print str(x) + print '\nexpected: ' + for x in others: + print str(x) + self.failUnless( set( do_nothing.overloads ) == set( others ) - , "there is a difference between expected function overloads and existing ones." ) + , "there is a difference between expected function overloads and existing ones." ) def test_abstract_classes(self): ns = self.global_ns.namespace( 'abstract_classes' ) Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/unittests/data/core_cache.hpp 2007-12-10 21:29:19 UTC (rev 1201) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pygccxml_dev/unittests/data/remove_template_defaults.hpp =================================================================== --- pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-12-10 21:29:19 UTC (rev 1201) @@ -102,7 +102,7 @@ typedef HASH_XXX_NS::hash_multimap< std::vector< int > const, hmm_wstr2d const > hmm_v_i2mm_wstr2d; } -inline void do_nothing1( type< sets::s_v_int > ){ +inline void f1( type< sets::s_v_int > ){ } } Modified: pygccxml_dev/unittests/find_container_traits_tester.py =================================================================== --- pygccxml_dev/unittests/find_container_traits_tester.py 2007-12-10 17:06:45 UTC (rev 1200) +++ pygccxml_dev/unittests/find_container_traits_tester.py 2007-12-10 21:29:19 UTC (rev 1201) @@ -57,10 +57,9 @@ print m.partial_name def test_recursive_partial_name( self ): - f = self.global_ns.free_fun( 'do_nothing1' ) - t1 = declarations.class_traits.get_declaration( f.arguments[0].type ) - print t1.name - print t1.partial_name + f1 = self.global_ns.free_fun( 'f1' ) + t1 = declarations.class_traits.get_declaration( f1.arguments[0].type ) + self.failUnless( 'type< std::set< std::vector< int > > >' == t1.partial_name ) def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-12-21 21:29:09
|
Revision: 1205 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1205&view=rev Author: roman_yakovenko Date: 2007-12-21 13:29:10 -0800 (Fri, 21 Dec 2007) Log Message: ----------- has_trivial_constructor - small buf was fixed - only public constructors are taken into account Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/find_container_traits_tester.py pygccxml_dev/unittests/templates_tester.py Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-12-14 20:29:44 UTC (rev 1204) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-12-21 21:29:10 UTC (rev 1205) @@ -378,9 +378,8 @@ logger.debug( true_header + "class doesn't have any user defined constructor and it is copyable" ) return True else: - if None != find_trivial_constructor( type ): - return True - return False + cons = find_trivial_constructor( type ) + return cons and cons.access_type == 'public' """ Question: Do I have to define a copy constructor and assignment operator? Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-12-14 20:29:44 UTC (rev 1204) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-12-21 21:29:10 UTC (rev 1205) @@ -538,6 +538,17 @@ struct const_item{ const int values[10]; }; struct const_container{ const const_item items[10]; }; + class singleton_t + { + private: + static singleton_t *m_instance; + + singleton_t () {} + ~singleton_t () {} + + public: + static singleton_t* instance(); + }; } } namespace has_public_constructor{ Modified: pygccxml_dev/unittests/find_container_traits_tester.py =================================================================== --- pygccxml_dev/unittests/find_container_traits_tester.py 2007-12-14 20:29:44 UTC (rev 1204) +++ pygccxml_dev/unittests/find_container_traits_tester.py 2007-12-21 21:29:10 UTC (rev 1205) @@ -61,6 +61,11 @@ t1 = declarations.class_traits.get_declaration( f1.arguments[0].type ) self.failUnless( 'type< std::set< std::vector< int > > >' == t1.partial_name ) + def test_from_ogre( self ): + x = 'map<std::string, bool (*)(std::string&, Ogre::MaterialScriptContext&), std::less<std::string>, std::allocator<std::pair<std::string const, bool (*)(std::string&, Ogre::MaterialScriptContext&)> > >' + ct = declarations.find_container_traits( x ) + y = ct.remove_defaults( x ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) Modified: pygccxml_dev/unittests/templates_tester.py =================================================================== --- pygccxml_dev/unittests/templates_tester.py 2007-12-14 20:29:44 UTC (rev 1204) +++ pygccxml_dev/unittests/templates_tester.py 2007-12-21 21:29:10 UTC (rev 1205) @@ -59,6 +59,11 @@ def test_bug_is_tmpl_inst(self): self.failUnless( False == declarations.templates.is_instantiation( "::FX::QMemArray<unsigned char>::setRawData" ) ) + def test_split_bug_fptr(self): + x = 'map<std::string, bool (*)(std::string&, Ogre::MaterialScriptContext&), std::less<std::string>, std::allocator<std::pair<std::string const, bool (*)(std::string&, Ogre::MaterialScriptContext&)> > >' + name, args = declarations.templates.split( x ) + self.failUnless( len(x) == 4 ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-02-07 07:47:22
|
Revision: 1235 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1235&view=rev Author: roman_yakovenko Date: 2008-02-06 23:47:26 -0800 (Wed, 06 Feb 2008) Log Message: ----------- removing synopsis parser Modified Paths: -------------- pygccxml_dev/pygccxml/parser/config.py pygccxml_dev/pygccxml/parser/etree_scanner.py pygccxml_dev/pygccxml/parser/pdb_reader.py pygccxml_dev/pygccxml/parser/project_reader.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/unittests/data/core_cache.hpp Removed Paths: ------------- pygccxml_dev/pygccxml/parser/synopsis_reader.py pygccxml_dev/pygccxml/parser/synopsis_scanner.py Modified: pygccxml_dev/pygccxml/parser/config.py =================================================================== --- pygccxml_dev/pygccxml/parser/config.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/config.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -14,13 +14,13 @@ """Configuration object to collect parameters for invoking C++ parser This class serves as a base class for the parameters that can be used - to customize the call to C++ parser. This class also allows users to work with + to customize the call to C++ parser. This class also allows users to work with relative files paths. In this case files are searched in the following order: - + 1. current directory - + 2. working directory - + 3. additional include paths specified by the user """ @@ -31,7 +31,7 @@ , undefine_symbols=None , cflags="" , compiler=None): - """Constructor. + """Constructor. """ object.__init__( self ) self.__working_directory = working_directory @@ -49,23 +49,23 @@ self.__undefine_symbols = undefine_symbols self.__cflags = cflags - + self.__compiler = compiler - + def clone(self): raise NotImplementedError( self.__class__.__name__ ) - + def __get_working_directory(self): return self.__working_directory def __set_working_directory(self, working_dir): self.__working_directory=working_dir working_directory = property( __get_working_directory, __set_working_directory ) - + @property def include_paths(self): """list of include paths to look for header files""" return self.__include_paths - + @property def define_symbols(self): """list of "define" directives """ @@ -77,7 +77,7 @@ return self.__undefine_symbols @property - def compiler(self): + def compiler(self): """compiler name to simulate""" return self.__compiler @@ -90,7 +90,7 @@ def __ensure_dir_exists( self, dir_path, meaning ): if os.path.isdir( dir_path ): - return + return msg = None if os.path.exists( self.working_directory ): raise RuntimeError( '%s("%s") does not exist!' % ( meaning, dir_path ) ) @@ -98,18 +98,18 @@ raise RuntimeError( '%s("%s") should be "directory", not a file.' % ( meaning, dir_path ) ) - def raise_on_wrong_settings( self ): + def raise_on_wrong_settings( self ): """validates the configuration settings and raises RuntimeError on error""" self.__ensure_dir_exists( self.working_directory, 'working directory' ) map( lambda idir: self.__ensure_dir_exists( idir, 'include directory' ) , self.include_paths ) - + class gccxml_configuration_t(parser_configuration_t): """Configuration object to collect parameters for invoking gccxml. This class serves as a container for the parameters that can be used - to customize the call to gccxml. + to customize the call to gccxml. """ def __init__( self , gccxml_path='' @@ -121,7 +121,7 @@ , ignore_gccxml_output=False , cflags="" , compiler=None): - """Constructor. + """Constructor. """ parser_configuration_t.__init__( self , working_directory=working_directory @@ -130,7 +130,7 @@ , undefine_symbols=undefine_symbols , cflags=cflags , compiler=compiler) - + self.__gccxml_path = gccxml_path if not start_with_declarations: @@ -138,10 +138,10 @@ self.__start_with_declarations = start_with_declarations self.__ignore_gccxml_output = ignore_gccxml_output - + def clone(self): return copy.deepcopy( self ) - + def __get_gccxml_path(self): return self.__gccxml_path def __set_gccxml_path(self, new_path ): @@ -151,9 +151,9 @@ @property def start_with_declarations(self): - """list of declarations gccxml should start with, when it dumps declaration tree""" + """list of declarations gccxml should start with, when it dumps declaration tree""" return self.__start_with_declarations - + def __get_ignore_gccxml_output(self): return self.__ignore_gccxml_output def __set_ignore_gccxml_output(self, val=True): @@ -161,11 +161,11 @@ ignore_gccxml_output = property( __get_ignore_gccxml_output, __set_ignore_gccxml_output , doc="set this property to True, if you want pygccxml to ignore any error\\warning that comes from gccxml" ) - - def raise_on_wrong_settings( self ): + + def raise_on_wrong_settings( self ): super( gccxml_configuration_t, self ).raise_on_wrong_settings() if os.path.isfile( self.gccxml_path ): - return + return if sys.platform == 'win32': gccxml_name = 'gccxml' + '.exe' environment_var_delimiter = ';' @@ -187,31 +187,5 @@ msg = 'gccxml_path("%s") should exists or to be a valid file name.' \ % self.gccxml_path raise RuntimeError( msg ) - -config_t = gccxml_configuration_t #backward computability -class synopsis_configuration_t(parser_configuration_t): - """Configuration object to collect parameters for invoking gccxml. - - This class serves as a container for the parameters that can be used - to customize the call to synopsis. - """ - def __init__( self - , working_directory='.' - , include_paths=None - , define_symbols=None - , undefine_symbols=None - , cflags="" - , compiler=None): - """Constructor. - """ - parser_configuration_t.__init__( self - , working_directory=working_directory - , include_paths=include_paths - , define_symbols=define_symbols - , undefine_symbols=undefine_symbols - , cflags=cflags - , compiler=compiler) - - def clone(self): - return copy.deepcopy( self ) +config_t = gccxml_configuration_t #backward computability Modified: pygccxml_dev/pygccxml/parser/etree_scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/etree_scanner.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/etree_scanner.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -5,12 +5,12 @@ import scanner import xml.etree.cElementTree as ElementTree - + class etree_saxifier_t(object): def __init__(self, etree, handler): self.__root_elem = etree.getroot() - self.__handler = handler - + self.__handler = handler + def saxify(self): self.__handler.startDocument() self.__recursive_saxify( self.__root_elem ) @@ -18,31 +18,23 @@ def __recursive_saxify(self, element ): self.__handler.startElement( element.tag, element.attrib ) - - #~ if element.text: - #~ self.__handler.characters(element.text) - map( self.__recursive_saxify, element ) - self.__handler.endElement( element.tag ) - #~ if element.tail: - #~ self.__handler.characters(element.tail) - class etree_scanner_t( scanner.scanner_t ): def __init__(self, gccxml_file, decl_factory, *args ): scanner.scanner_t.__init__( self, gccxml_file, decl_factory, *args ) - - def read( self ): + + def read( self ): tree = ElementTree.parse( self.gccxml_file ) saxifier = etree_saxifier_t( tree, self ) - saxifier.saxify() + saxifier.saxify() class ietree_scanner_t( scanner.scanner_t ): def __init__(self, gccxml_file, decl_factory, *args ): scanner.scanner_t.__init__( self, gccxml_file, decl_factory, *args ) - - def read( self ): + + def read( self ): context = ElementTree.iterparse(self.gccxml_file, events=("start", "end")) for event, elem in context: if event == 'start': @@ -51,5 +43,5 @@ self.endElement( elem.tag ) elem.clear() self.endDocument() - + etree_scanner_t = ietree_scanner_t Modified: pygccxml_dev/pygccxml/parser/pdb_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/pdb_reader.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/pdb_reader.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -1,8 +1,12 @@ import os import sys +import comtypes import comtypes.client from sets import Set as set +comtypes.client.gen_dir = r'D:\dev\language-binding\sources\pygccxml_dev\pygccxml\parser\gen' +print comtypes.client.GetModule( r'D:\Program Files\Microsoft Visual Studio .NET 2003\Visual Studio SDKs\DIA SDK\bin\msdia71.dll' ) + #~ MODULE_IDENTIFIER = ('{106173A0-0173-4e5c-84E7-E915422BE997}', 0, 2, 0) #~ MODULE_PATH = r'Lib\site-packages\win32com\gen_py\106173A0-0173-4e5c-84E7-E915422BE997x0x2x0.py' @@ -17,8 +21,9 @@ #~ msdia = win32com.client.gencache.EnsureModule( *MODULE_IDENTIFIER ) -ds = comtypes.client.CreateObject( "{e60afbee-502d-46ae-858f-8272a09bd707}" ) -ds.loadDataFromPdb( 'xxx.pdb' ) +#ds = comtypes.client.CreateObject( "{e60afbee-502d-46ae-858f-8272a09bd707}" ) +#print dir( ds ) +#ds.loadDataFromPdb( 'xxx.pdb' ) #~ ds = msdia.DiaSource() #~ ds.loadDataFromPdb( 'xxx.pdb' ) Modified: pygccxml_dev/pygccxml/parser/project_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/project_reader.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/project_reader.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -71,21 +71,21 @@ and self.__content_type == self.CONTENT_TYPE.CACHED_SOURCE_FILE: self.__cached_source_file = self.__data + '.xml' - def __get_data(self): + @property + def data(self): return self.__data - data = property( __get_data ) - def __get_start_with_declarations(self): + @property + def start_with_declarations(self): return self.__start_with_declarations - start_with_declarations = property( __get_start_with_declarations ) - def __get_content_type(self): + @property + def content_type(self): return self.__content_type - content_type = property( __get_content_type ) - def __get_cached_source_file(self): + @property + def cached_source_file(self): return self.__cached_source_file - cached_source_file = property( __get_cached_source_file ) def create_text_fc( text ): """ @@ -427,7 +427,7 @@ for decl_wrapper_type in declarated_types: #it is possible, that cache contains reference to dropped class #We need to clear it - decl_wrapper_type.cache.reset() + decl_wrapper_type.cache.reset() if isinstance( decl_wrapper_type.declaration, pygccxml.declarations.class_t ): key = create_key(decl_wrapper_type.declaration) if leaved_classes.has_key( key ): Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -10,29 +10,28 @@ import patcher import pygccxml.utils -try: #select faster xml parser +try: #select the faster xml parser from etree_scanner import etree_scanner_t as scanner_t except: from scanner import scanner_t import declarations_cache -from pygccxml import utils +from pygccxml import utils from pygccxml.declarations import * class gccxml_runtime_error_t( RuntimeError ): def __init__( self, msg ): RuntimeError.__init__( self, msg ) - def bind_aliases( decls ): """ - This function binds between class and it's typedefs. + This function binds between class and it's typedefs. @param decls: list of all declarations @type all_classes: list of L{declaration_t} items @return: None - """ + """ visited = set() typedefs = filter( lambda decl: isinstance( decl, typedef_t ), decls ) for decl in typedefs: @@ -50,31 +49,31 @@ class source_reader_t: """ This class reads C++ source code and returns declarations tree. - - This class is the only class that have an intime knowledge about GCC-XML. + + This class is the only class that have an intime knowledge about GCC-XML. It has only one responsibility: it calls GCC-XML with a source file specified by user and creates declarations tree. The implementation of this class is split - to 2 classes: - - 1. L{scanner_t} - this class scans the "XML" file, generated by GCC-XML and - creates `pygccxml`_ declarations and types classes. After the xml file has - been processed declarations and type class instances keeps references to - each other using GCC-XML generated id's. + to 2 classes: - 2. L{linker_t} - this class contains logic for replacing GCC-XML generated + 1. L{scanner_t} - this class scans the "XML" file, generated by GCC-XML and + creates `pygccxml`_ declarations and types classes. After the xml file has + been processed declarations and type class instances keeps references to + each other using GCC-XML generated id's. + + 2. L{linker_t} - this class contains logic for replacing GCC-XML generated ids with references to declarations or type class instances. """ def __init__( self, config, cache=None, decl_factory=None ): """ - @param config: instance of L{config_t} class, that contains GCC-XML + @param config: instance of L{config_t} class, that contains GCC-XML configuration @type config: L{config_t} - - @param cache: reference to cache object, that will be updated after + + @param cache: reference to cache object, that will be updated after file has been parsed. @param cache: instance of class, that derives from {cache_base_t} - - @param decl_factory: declarations factory, if not given default + + @param decl_factory: declarations factory, if not given default declarations factory L{decl_factory_t} will be used """ self.logger = utils.loggers.cxx_parser @@ -99,7 +98,7 @@ cmd.append( '"%s"' % os.path.normpath( self.__config.gccxml_path ) ) else: cmd.append( '%s' % os.path.normpath( self.__config.gccxml_path ) ) - + # Add all cflags passed if self.__config.cflags != "": cmd.append(" %s "%self.__config.cflags) @@ -116,7 +115,7 @@ cmd.append( '-fxml-start="%s"' % ','.join( self.__config.start_with_declarations ) ) # Specify compiler if asked to if self.__config.compiler: - cmd.append( " --gccxml-compiler %s" % self.__config.compiler ) + cmd.append( " --gccxml-compiler %s" % self.__config.compiler ) cmd_line = ' '.join(cmd) if 'win32' in sys.platform : cmd_line = '"%s"' % cmd_line @@ -126,16 +125,16 @@ def create_xml_file( self, header, destination=None ): """ This function will return the file name of the file, created by GCC-XML - for "header" file. If destination_file_path is not None, then this file + for "header" file. If destination_file_path is not None, then this file path will be used and returned. @param header: path to source file, that should be parsed @type header: str - - @param destination: if given, will be used as target file/path for + + @param destination: if given, will be used as target file/path for GCC-XML generated file. @type destination: str - + @return: path to GCC-XML generated file """ gccxml_file = destination @@ -173,13 +172,13 @@ def create_xml_file_from_string( self, content, destination=None ): """ Creates XML file from text. - + @param content: C++ source code @type content: str - + @param destination: file name for GCC-XML generated file @type destination: str - + @return: returns file name of GCC-XML generated file """ header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) @@ -198,11 +197,11 @@ return self.read_gccxml_file( source_file ) else: return self.read_synopsis_file( source_file ) - + def read_gccxml_file(self, source_file): """ Reads C++ source file and returns declarations tree - + @param source_file: path to C++ source file @type source_file: str """ @@ -230,10 +229,10 @@ def read_xml_file(self, gccxml_created_file): """ Reads GCC-XML generated XML file. - + @param gccxml_created_file: path to GCC-XML generated file @type gccxml_created_file: str - + @return: declarations tree """ assert(self.__config!=None) @@ -289,7 +288,7 @@ return file_path except Exception: return file_path - + def __parse_gccxml_created_file( self, gccxml_file ): scanner_ = scanner_t( gccxml_file, self.__decl_factory ) scanner_.read() @@ -314,20 +313,20 @@ #some times gccxml report typedefs defined in no namespace #it happens for example in next situation #template< typename X> - #void ddd(){ typedef typename X::Y YY;} + #void ddd(){ typedef typename X::Y YY;} #if I will fail on this bug next time, the right way to fix it may be different patcher.fix_calldef_decls( scanner_.calldefs(), scanner_.enums() ) decls = filter( lambda inst: isinstance( inst, namespace_t ) and not inst.parent , decls.itervalues() ) return ( decls, files.values() ) - + def read_synopsis_file( self, source_file ): import synopsis_scanner from Synopsis import AST from Synopsis.Parsers import Cxx ffname = self.__file_full_name(source_file) - + cppflags = [] map( lambda dpath: cppflags.append( '-I %s' % dpath ) , self.__config.include_paths ) @@ -335,7 +334,7 @@ , self.__config.define_symbols ) map( lambda define: cppflags.append( '-U %s' % define ) , self.__config.undefine_symbols ) - + cxx = Cxx.Parser( preprocess=True, cppflags=cppflags ) ast = AST.AST() cxx.process( ast, input=[source_file] ) @@ -344,4 +343,4 @@ declarations = [scanner.global_ns] self.__dcache.update( ffname, self.__config, declarations, [] ) return declarations - + Deleted: pygccxml_dev/pygccxml/parser/synopsis_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/synopsis_reader.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/synopsis_reader.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -1,36 +0,0 @@ -import os -import sys - -from Synopsis import AST -from Synopsis.Parsers import Cxx - -headers_dir = '/home/roman/language-binding/sources/pygccxml_dev/unittests/data' - -offset = 0 -def print_decls( d ): - global offset - print offset * ' ', d.name(), d.__class__.__name__ - if hasattr( d, 'declarations' ): - offset += 1 - for d1 in d.declarations(): - print_decls( d1 ) - offset -= 1 - -def parse( f ): - global offset, headers_dir - print 'file ', f - cxx = Cxx.Parser( - preprocess=True - , cppflags=['-I %s' % headers_dir ] ) - - ast = AST.AST() - cxx.process( ast, input=[os.path.join(headers_dir, f )] ) - - offset = 0 - for d in ast.declarations(): - print_decls( d ) - -parse( 'declarations_enums.hpp' ) -#for x in os.listdir( headers_dir ): - #if x.endswith( 'hpp' ): - #parse( x ) Deleted: pygccxml_dev/pygccxml/parser/synopsis_scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/synopsis_scanner.py 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/pygccxml/parser/synopsis_scanner.py 2008-02-07 07:47:26 UTC (rev 1235) @@ -1,46 +0,0 @@ -# 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) - -import os -import types -import pprint -import warnings -from Synopsis import AST -from pygccxml import utils -from pygccxml.declarations import * - -class scanner_t( AST.Visitor, object ): - def __init__(self, ast, decl_factory ): - self.logger = utils.loggers.cxx_parser - self.ast = ast - - assert isinstance( decl_factory, decl_factory_t ) - self.__decl_factory = decl_factory - - #mapping from id -> decl - self.__decl = self.__decl_factory.create_namespace( name='::' ) - self.global_ns = self.__decl - - - def read_deaclaration( self, node, decl ): - #this function should not be called for namespace - decl.name = node.name() - decl.location = location_t( file_name=node.file(), line=node.line() ) - - def visitModule( self, node ): - ns = self.__decl_factory.create_namespace( name=node.name() ) - self.__decl.adopt_declaration( ns ) - self.__decl = ns - super( scanner_t, self ).visitModule( node ) - - def visitEnum( self, node ): - values = [] - for enumerator in node.enumerators(): - print enumerator.name(), ':', enumerator.value() - values.append( ( enumerator.name(), enumerator.value() ) ) - enum = self.__decl_factory.create_enumeration( values=values ) - self.read_deaclaration( node, enum ) - self.__decl.adopt_declaration( enum ) - super( scanner_t, self ).visitEnum( node ) Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2008-02-06 10:07:10 UTC (rev 1234) +++ pygccxml_dev/unittests/data/core_cache.hpp 2008-02-07 07:47:26 UTC (rev 1235) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-02-17 19:49:48
|
Revision: 1243 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1243&view=rev Author: roman_yakovenko Date: 2008-02-17 11:49:54 -0800 (Sun, 17 Feb 2008) Log Message: ----------- adding treatment to ellipsis ("...") in function definitions Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/calldef.py pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/declarations/namespace.py pygccxml_dev/pygccxml/parser/linker.py pygccxml_dev/pygccxml/parser/project_reader.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/data/declarations_calldef.hpp pygccxml_dev/unittests/data/plain_c.c pygccxml_dev/unittests/decl_string_tester.py pygccxml_dev/unittests/declarations_tester.py pygccxml_dev/unittests/filters_tester.py pygccxml_dev/unittests/plain_c_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -25,6 +25,7 @@ from cpptypes import type_t from cpptypes import dummy_type_t from cpptypes import unknown_t +from cpptypes import ellipsis_t from cpptypes import fundamental_t from cpptypes import void_t from cpptypes import char_t Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -39,7 +39,7 @@ class, that describes argument of "callable" declaration """ - def __init__( self, name='', type=None, default_value=None, attributes=None ): + def __init__( self, name='', type=None, default_value=None, attributes=None): object.__init__(self) self._name = name self._default_value = default_value @@ -52,6 +52,8 @@ return argument_t( name=keywd.get( 'name', self.name ) , type=keywd.get( 'type', self.type ) , default_value=keywd.get( 'default_value', self.default_value ) + , attributes=keywd.get( 'attributes', self.attributes ) ) + """ return argument_t( name=keywd.get( 'name', self.name ) , type=keywd.get( 'type', self.type ) @@ -59,10 +61,13 @@ , attributes=keywd.get( 'attributes', self.attributes ) ) def __str__(self): - if self.default_value==None: - return "%s %s"%(self.type, self.name) + if self.ellipsis: + return "..." else: - return "%s %s=%s"%(self.type, self.name, self.default_value) + if self.default_value==None: + return "%s %s"%(self.type, self.name) + else: + return "%s %s=%s"%(self.type, self.name, self.default_value) def __eq__(self, other): if not isinstance( other, self.__class__ ): @@ -89,6 +94,11 @@ , doc="""Argument name. @type: str""" ) + @property + def ellipsis(self): + """bool, if True argument represents ellipsis ( "..." ) in function definition""" + return isinstance( self.type, cpptypes.ellipsis_t ) + def _get_default_value(self): return self._default_value def _set_default_value(self, default_value): @@ -163,6 +173,10 @@ @type: list of L{argument_t}""") @property + def has_ellipsis( self ): + return self.arguments and self.arguments[-1].ellipsis + + @property def argument_types( self ): """list of all argument types""" return [ arg.type for arg in self.arguments ] @@ -209,21 +223,20 @@ , doc='''The type of the return value of the "callable" or None (constructors). @type: L{type_t} ''') - - def _get_overloads(self): + @property + def overloads(self): + """A list of overloaded "callables" (i.e. other callables with the same name within the same scope. + + @type: list of L{calldef_t} + """ if not self.parent: return [] # finding all functions with the same name - return self.parent.calldefs( - name=self.name - , function=lambda decl: not (decl is self ) - , allow_empty=True - , recursive=False ) + return self.parent.calldefs( name=self.name + , function=lambda decl: not (decl is self ) + , allow_empty=True + , recursive=False ) - overloads = property( _get_overloads - , doc="""A list of overloaded "callables" (i.e. other callables with the same name within the same scope. - @type: list of L{calldef_t}""" ) - def _get_has_extern(self): return self._has_extern def _set_has_extern(self, has_extern): Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -101,6 +101,17 @@ def _clone_impl( self ): return self +class ellipsis_t( type_t ): + """type, that represents "..." in function definition""" + def __init__( self ): + type_t.__init__( self ) + + def build_decl_string(self, with_defaults=True): + return '...' + + def _clone_impl( self ): + return self + ################################################################################ ## Fundamental types: @@ -460,6 +471,11 @@ self._arguments_types = new_arguments_types arguments_types = property( _get_arguments_types, _set_arguments_types , doc="list of argument L{types<type_t>}") + + @property + def has_ellipsis( self ): + return self.arguments_types and isinstance( self.arguments_types[-1], ellipsis_t ) + class free_function_type_t( type_t, calldef_type_t ): """describes free function type""" Modified: pygccxml_dev/pygccxml/declarations/namespace.py =================================================================== --- pygccxml_dev/pygccxml/declarations/namespace.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/declarations/namespace.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -72,7 +72,8 @@ , name=name , function=function , recursive=recursive ) - + ns = namespace + def namespaces( self, name=None, function=None, recursive=None, allow_empty=None ): """returns a set of namespace declarations, that are matched defined criterias""" return self._find_multiple( scopedef.scopedef_t._impl_matchers[ namespace_t.namespace ] @@ -80,7 +81,8 @@ , function=function , recursive=recursive , allow_empty=allow_empty) - + nss = namespaces + def free_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): """returns reference to free function declaration, that is matched defined criterias""" return self._find_single( scopedef.scopedef_t._impl_matchers[ namespace_t.free_function ] Modified: pygccxml_dev/pygccxml/parser/linker.py =================================================================== --- pygccxml_dev/pygccxml/parser/linker.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/parser/linker.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -24,7 +24,7 @@ for d in self.__decls.itervalues(): self.__compiler = d.compiler break - + def _get_inst(self): return self.__inst def _set_inst(self, inst): @@ -43,6 +43,8 @@ base = declarated_t( declaration=self.__decls[ type_id ] ) self.__types[type_id] = base return base + elif '...' == type_id: + return ellipsis_t() else: return unknown_t() Modified: pygccxml_dev/pygccxml/parser/project_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/project_reader.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/parser/project_reader.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -465,7 +465,8 @@ types.extend( get_from_type( arg ) ) return types else: - assert isinstance( cpptype, pygccxml.declarations.unknown_t ) + assert isinstance( cpptype, ( pygccxml.declarations.unknown_t + , pygccxml.declarations.ellipsis_t ) ) return [] types = [] for decl in pygccxml.declarations.make_flatten( namespaces ): Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/pygccxml/parser/scanner.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -57,6 +57,7 @@ XML_NN_CONSTRUCTOR = "Constructor" XML_NN_CV_QUALIFIED_TYPE = "CvQualifiedType" XML_NN_DESTRUCTOR = "Destructor" +XML_NN_ELLIPSIS = "Ellipsis" XML_NN_ENUMERATION = "Enumeration" XML_NN_ENUMERATION_VALUE = "EnumValue" XML_NN_FIELD = "Field" @@ -113,6 +114,7 @@ , XML_NN_MEMBER_OPERATOR : self.__read_member_operator , XML_NN_METHOD : self.__read_method , XML_NN_GCC_XML : self.__read_version + , XML_NN_ELLIPSIS : self.__read_ellipsis } self.deep_declarations = [ XML_NN_CASTING_OPERATOR @@ -379,6 +381,13 @@ argument.default_value = None self.__inst.arguments.append( argument ) + def __read_ellipsis( self, attrs ): + if isinstance( self.__inst, calldef_type_t ): + self.__inst.arguments_types.append( '...' ) + else: + argument = argument_t( type='...' ) + self.__inst.arguments.append( argument ) + def __read_calldef( self, calldef, attrs, is_declaration ): #destructor for example doesn't have return type calldef.return_type = attrs.get( XML_AN_RETURNS, None ) Modified: pygccxml_dev/unittests/data/declarations_calldef.hpp =================================================================== --- pygccxml_dev/unittests/data/declarations_calldef.hpp 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/data/declarations_calldef.hpp 2008-02-17 19:49:54 UTC (rev 1243) @@ -1,65 +1,75 @@ -// 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 __declarations_calldef_hpp__ -#define __declarations_calldef_hpp__ - -namespace declarations{ namespace calldef{ - -class some_exception_t{}; - -class other_exception_t{}; - -void no_return_no_args(); - -int return_no_args(); - -void no_return_1_arg(int arg); - -int return_default_args( int arg=1, bool flag=false ); - -extern void static_call(); - -void calldef_with_throw() throw( some_exception_t, other_exception_t ); - -struct calldefs_t{ - calldefs_t(); - - calldefs_t(char); - - calldefs_t(int,double); - - calldefs_t(const calldefs_t&); - - virtual ~calldefs_t(); - - calldefs_t& operator=( const calldefs_t& ); - bool operator==( const calldefs_t& ); - operator char*() const; - virtual operator double(); - - static void static_call(); - - inline int member_inline_call(int i){ return i;} - - virtual void member_virtual_call(); - - virtual void member_pure_virtual_call() = 0; - - void member_const_call() const; - - calldefs_t* do_smth(const calldefs_t& other); -}; - -namespace std{ - class iostream; -} - -std::iostream& operator<<( std::iostream&, const calldefs_t& ); -std::iostream& operator>>( std::iostream&, calldefs_t& ); - -} } - -#endif//__declarations_calldef_hpp__ +// 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 __declarations_calldef_hpp__ +#define __declarations_calldef_hpp__ + +namespace declarations{ namespace calldef{ + +class some_exception_t{}; + +class other_exception_t{}; + +void no_return_no_args(); + +int return_no_args(); + +void no_return_1_arg(int arg); + +int return_default_args( int arg=1, bool flag=false ); + +extern void static_call(); + +void calldef_with_throw() throw( some_exception_t, other_exception_t ); + +struct calldefs_t{ + calldefs_t(); + + calldefs_t(char); + + calldefs_t(int,double); + + calldefs_t(const calldefs_t&); + + virtual ~calldefs_t(); + + calldefs_t& operator=( const calldefs_t& ); + bool operator==( const calldefs_t& ); + operator char*() const; + virtual operator double(); + + static void static_call(); + + inline int member_inline_call(int i){ return i;} + + virtual void member_virtual_call(); + + virtual void member_pure_virtual_call() = 0; + + void member_const_call() const; + + calldefs_t* do_smth(const calldefs_t& other); +}; + +namespace std{ + class iostream; +} + +std::iostream& operator<<( std::iostream&, const calldefs_t& ); +std::iostream& operator>>( std::iostream&, calldefs_t& ); + +namespace ellipsis_tester{ + +struct ellipsis{ + void do_smth( int, ... ); +}; + +void do_smth_else( int, ... ); + +}//ellipsis_tester + +} } + +#endif//__declarations_calldef_hpp__ Modified: pygccxml_dev/unittests/data/plain_c.c =================================================================== --- pygccxml_dev/unittests/data/plain_c.c 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/data/plain_c.c 2008-02-17 19:49:54 UTC (rev 1243) @@ -9,8 +9,8 @@ void hello_print(const char *message); double hello_sum(double x, double y); +void do_smth( int, ... ); - #ifdef __cplusplus } #endif Modified: pygccxml_dev/unittests/decl_string_tester.py =================================================================== --- pygccxml_dev/unittests/decl_string_tester.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/decl_string_tester.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -40,6 +40,15 @@ return_default_args = self.global_ns.free_fun( 'return_default_args' ) decls = parser.parse_string( self.template % return_default_args.decl_string, self.config ) self.failUnless( decls, "Created decl_string for global function containes mistake" ) + + def test_all_mem_and_free_funs( self ): + ns = self.global_ns.ns( '::declarations::calldef' ) + for f in ns.mem_funs(): + decls = parser.parse_string( self.template % f.decl_string, self.config ) + self.failUnless( decls, "Created decl_string for member function containes mistake" ) + for f in ns.free_funs(): + decls = parser.parse_string( self.template % f.decl_string, self.config ) + self.failUnless( decls, "Created decl_string for member function containes mistake" ) def create_suite(): suite = unittest.TestSuite() Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/declarations_tester.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -160,6 +160,16 @@ else: self.failUnless( decl.return_type.decl_string in calldefs_cast_operators, "unable to find operator symbol for operator '%s'" % decl.decl_string ) + def test_ellipsis( self ): + ns = self.global_ns.ns( 'ellipsis_tester' ) + do_smth = ns.mem_fun( 'do_smth' ) + for a in do_smth.arguments: + print str(a) + self.failUnless( do_smth.has_ellipsis ) + do_smth_else = ns.free_fun( 'do_smth_else' ) + self.failUnless( do_smth_else.has_ellipsis ) + + class all_at_once_tester_t( declarations_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE def __init__(self, *args): Modified: pygccxml_dev/unittests/filters_tester.py =================================================================== --- pygccxml_dev/unittests/filters_tester.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/filters_tester.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -34,9 +34,9 @@ public_members = declarations.matcher.find( criteria, self.declarations ) if '0.9' in public_members[0].compiler: #2 empty classes, this compiler doesn't generate constructor and copy constructor - self.failUnless( 15 == len( public_members ) ) + self.failUnless( 16 == len( public_members ) ) else: - self.failUnless( 19 == len( public_members ) ) + self.failUnless( 20 == len( public_members ) ) def test_or_matcher( self ): criteria1 = declarations.regex_matcher_t( 'oper.*' Modified: pygccxml_dev/unittests/plain_c_tester.py =================================================================== --- pygccxml_dev/unittests/plain_c_tester.py 2008-02-17 18:07:39 UTC (rev 1242) +++ pygccxml_dev/unittests/plain_c_tester.py 2008-02-17 19:49:54 UTC (rev 1243) @@ -26,7 +26,11 @@ def test( self ): self.global_ns.free_fun( 'hello_sum' ) self.global_ns.free_fun( 'hello_print' ) - + declarations.print_declarations( self.global_ns ) + f = self.global_ns.free_fun( 'do_smth' ) + for arg in f.arguments: + print arg.type.decl_string + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-03-15 19:18:31
|
Revision: 1280 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1280&view=rev Author: roman_yakovenko Date: 2008-03-15 12:18:36 -0700 (Sat, 15 Mar 2008) Log Message: ----------- Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/impl_details.py pygccxml_dev/unittests/pdb_tester.py Added Paths: ----------- pygccxml_dev/pygccxml/msvc/pdb/loader.py Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-12 21:11:19 UTC (rev 1279) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-15 19:18:36 UTC (rev 1280) @@ -19,266 +19,4 @@ finally: comtypes.client.gen_dir = comtypes_client_gen_dir - - -SymTagEnum = 12 - -def AsDiaSymbol( x ): - return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) ) - - -def print_files( session ): - files = iter( session.findFile( None, '', 0 ) ) - for f in files: - f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) - print 'File: ', f.fileName - - -class reader_t(object): - def __init__(self, pdb_file_path ): - self.logger = utils.loggers.pdb_reader - self.logger.setLevel(logging.DEBUG) - self.logger.debug( 'creating DiaSource object' ) - self.__dia_source = comtypes.client.CreateObject( msdia.DiaSource ) - self.logger.debug( 'loading pdb file: %s' % pdb_file_path ) - self.__dia_source.loadDataFromPdb(pdb_file_path) - self.logger.debug( 'opening session' ) - self.__dia_session = self.__dia_source.openSession() - self.logger.debug( 'opening session - done' ) - self.__global_ns = declarations.namespace_t( '::' ) - - self.__enums = {} - self.__classes = {} - self.__typedefs = {} - self.__namespaces = {'': self.__global_ns} - - def read(self): - self.__populate_scopes() - - @property - def dia_global_scope(self): - return self.__dia_session.globalScope - - @property - def global_ns(self): - return self.__global_ns - - def __are_symbols_equivalent( self, smbl1_id, smbl2_id ): - smbl1 = self.__dia_session.symbolById(smbl1_id) - smbl2 = self.__dia_session.symbolById(smbl2_id) - result = self.__dia_session.symsAreEquiv( smbl1, smbl2 ) - if result: - msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.' - else: - msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.' - self.logger.debug( msg, smbl1.name, smbl1_id, smbl2.name, smbl2_id ) - return result - - def __find_udt( self, name ): - self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name ) - flags = msdia.NameSearchOptions.nsfCaseSensitive - found = self.dia_global_scope.findChildren( msdia.SymTagUDT, name, flags ) - if found.Count == 1: - self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) - return AsDiaSymbol( found.Item(0) ) - elif 1 < found.Count: - raise RuntimeError( "duplicated UDTs with name '%s', were found" % name ) - #~ self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) - #~ return [AsDiaSymbol( s ) for s in iter(found)] - #~ for s in iter(found): - #~ s = - #~ print s.name - #~ print impl_details.guess_class_type(s.udtKind) - else: - self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) - return None - - def __list_main_classes( self ): - #in this context main classes, are classes that were defined within a namespace - #as opposite to the classes defined in other classes - classes = [] - dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) - for dia_class in iter( dia_classes ): - dia_class = AsDiaSymbol( dia_class ) - name_splitter = impl_details.get_name_splitter( dia_class.name ) - for index, scope in enumerate( name_splitter.scope_names ): - if scope in self.__namespaces: - continue - else: - udt = self.__find_udt( scope ) - if udt: - classes.append( udt ) - if index: - self.__namespaces[ name_splitter.scope_names[index-1] ] = None - break - else: - self.__namespaces[ scope ] = None - else: - classes.append( dia_class ) - if name_splitter.scope_names: - self.__namespaces[ name_splitter.scope_names[-1] ] = None - return classes - - def __add_inner_classes( self, parent_class ): - self.logger.debug( 'adding inner classes to "%s"' % parent_class.decl_string ) - for symbol_id in parent_class.dia_symbols: - self.logger.debug( '\tdia symbol id: %d' % symbol_id ) - dia_symbol = self.__dia_session.symbolById( symbol_id ) - found = dia_symbol.findChildren( msdia.SymTagUDT, None, 0 ) - for inner_dia_class in iter(found): - inner_dia_class = AsDiaSymbol( inner_dia_class ) - self.logger.debug( '\t\tinner UDT found - %s' % inner_dia_class.name ) - inner_name_splitter = impl_details.get_name_splitter( inner_dia_class.name ) - try: - inner_klass = parent_class.class_( inner_name_splitter.name, recursive=False ) - inner_klass.dia_symbols.add( inner_dia_class.symIndexId ) - except parent_class.declaration_not_found_t: - inner_klass = self.__create_class( inner_dia_class ) - parent_class.adopt_declaration( inner_klass - , impl_details.guess_access_type( inner_dia_class.access ) ) - self.__classes[ inner_dia_class.name ] = inner_klass - self.logger.debug( 'adding inner classes to "%s" - done' % parent_class.decl_string ) - - def __create_enum( self, enum_smbl ): - name_splitter = impl_details.get_name_splitter( enum_smbl.name ) - enum_decl = declarations.enumeration_t( name_splitter.name ) - enum_decl.dia_symbols = [ enum_smbl.symIndexId ] - enum_decl.byte_size = enum_smbl.length - values = enum_smbl.findChildren( msdia.SymTagData, None, 0 ) - for v in iter(values): - v = AsDiaSymbol(v) - if v.classParent.symIndexId != enum_smbl.symIndexId: - continue - enum_decl.append_value( v.name, v.value ) - if enum_decl.values: - return enum_decl - else: - #for some reason same enum could appear under global namespace and - #under the class, it was defined in. This is a criteria I use to distinguish - #between those cases - return None - - def __load_enums( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading enums to "%s" ' % parent_symbol.name ) - for enum_smbl in iter( parent_symbol.findChildren( SymTagEnum, None, 0 ) ): - enum_smbl = AsDiaSymbol( enum_smbl ) - enum_decl = self.__create_enum( enum_smbl ) - if enum_decl: - try: - for enum_discovered in self.__enums[ enum_smbl.name ]: - if self.__are_symbols_equivalent( enum_smbl.symIndexId, enum_discovered.dia_symbols[0] ): - continue - else: - self.__enums[ enum_smbl.name ].append( enum_decl ) - except KeyError: - self.__enums[ enum_smbl.name ] = [ enum_decl ] - self.logger.debug( '\tfound %s %s' % ( enum_smbl.name, str(enum_decl) ) ) - self.logger.debug( 'loading enums to "%s" - done' % parent_symbol.name ) - - def __create_typedef( self, typedef_smbl ): - name_splitter = impl_details.get_name_splitter( typedef_smbl.name ) - typedef_decl = declarations.typedef_t( name_splitter.name ) - typedef_decl.dia_symbols = [ typedef_smbl.symIndexId ] - return typedef_decl - - def __load_typedefs( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading typedefs to "%s" ' % parent_symbol.name ) - for typedef_smbl in iter( parent_symbol.findChildren( SymTagEnum, None, 0 ) ): - typedef_smbl = AsDiaSymbol( typedef_smbl ) - typedef_decl = self.__create_typedef( typedef_smbl ) - try: - for typedef_discovered in self.__typedefs[ typedef_smbl.name ]: - if self.__are_symbols_equivalent( typedef_smbl.symIndexId, typedef_discovered.dia_symbols[0] ): - continue - else: - self.__typedefs[ typedef_smbl.name ].append( typedef_decl ) - except KeyError: - self.__typedefs[ typedef_smbl.name ] = [ typedef_decl ] - self.logger.debug( '\tfound %s %s' % ( typedef_smbl.name, str(typedef_decl) ) ) - self.logger.debug( 'loading typedefs to "%s" - done' % parent_symbol.name ) - - def __load_classes( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading classes to "%s" ' % parent_symbol.name ) - for class_smbl in iter( parent_symbol.findChildren( msdia.SymTagUDT, None, 0 ) ): - class_smbl = AsDiaSymbol( class_smbl ) - class_decl = self.__create_class( class_smbl ) - try: - equivalent_found = False - for class_discovered in self.__classes[ class_smbl.name ]: - for smbl_discovered in class_discovered.dia_symbols: - equivalent_found = self.__are_symbols_equivalent( smbl_discovered, class_smbl.symIndexId ) - if equivalent_found: - class_discovered.dia_symbols.add( class_smbl.symIndexId ) - break - if equivalent_found: - break - if not equivalent_found: - self.__classes[ class_smbl.name ].append( class_decl ) - except KeyError: - self.__classes[ class_smbl.name ] = [ class_decl ] - self.logger.debug( '\tfound %s' % str(class_decl) ) - self.logger.debug( 'loading classes to "%s" - done' % parent_symbol.name ) - - def __create_nss( self ): - nss = self.__namespaces.keys() - nss.sort() - for ns_name in nss: - name_splitter = impl_details.get_name_splitter( ns_name ) - if not name_splitter.scope_names: - parent_ns = self.global_ns - else: - parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ] - ns_decl = declarations.namespace_t( name_splitter.name ) - parent_ns.adopt_declaration( ns_decl ) - self.__namespaces[ ns_name ] = ns_decl - - def __create_class( self, class_smbl ): - name_splitter = impl_details.get_name_splitter( class_smbl.name ) - class_decl = declarations.class_t( name_splitter.name ) - class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.dia_symbols = set([class_smbl.symIndexId]) - class_decl.byte_size = class_smbl.length - return class_decl - - def __populate_scopes(self): - self.__load_enums( self.dia_global_scope.symIndexId ) - self.__load_classes( self.dia_global_scope.symIndexId ) - self.__load_typedefs( self.dia_global_scope.symIndexId ) - #~ main_classes = self.__list_main_classes() - #~ self.__create_nss() - - #~ for dia_class in main_classes: - #~ name_splitter = impl_details.get_name_splitter( dia_class.name ) - #~ if not name_splitter.scope_names: - #~ parent_ns = self.global_ns - #~ else: - #~ parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ] - - #~ try: - #~ klass = parent_ns.class_( name_splitter.name, recursive=False ) - #~ klass.dia_symbols.add( dia_class.symIndexId ) - #~ except parent_ns.declaration_not_found_t: - #~ klass = self.__create_class( dia_class ) - #~ parent_ns.adopt_declaration( klass ) - #~ self.__classes[ dia_class.name ] = klass - - #~ map( self.__add_inner_classes, self.__classes.values() ) - - #~ self.__add_enums( self.dia_global_scope.symIndexId ) - #~ for klass in self.__classes.itervalues(): - #~ map( self.__add_enums, klass.dia_symbols ) - - #declarations.print_declarations( self.global_ns )#.namespace( 'ns1' ) ) - #declarations.print_declarations( self.global_ns.namespace( 'std' ) ) - -if __name__ == '__main__': - control_pdb = r'C:\dev\produce_pdb\Debug\produce_pdb.pdb' - control_pdb = r'xxx.pdb' - reader = scanner_t( control_pdb ) - reader.read() - f = file( 'decls.cpp', 'w+' ) - declarations.print_declarations( reader.global_ns, writer=f.write ) - f.close() +from loader import decl_loader_t \ No newline at end of file Modified: pygccxml_dev/pygccxml/msvc/pdb/impl_details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-12 21:11:19 UTC (rev 1279) +++ pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-15 19:18:36 UTC (rev 1280) @@ -41,22 +41,27 @@ return self.__identifiers def __split_scope_identifiers( self ): - result = [] - tmp = self.__full_name.split( '::' ) - tmp.reverse() - while tmp: - token = tmp.pop() - less_count = token.count( '<' ) - greater_count = token.count( '>' ) - if less_count != greater_count: - while less_count != greater_count: - next_token = tmp.pop() - token = token + '::' + next_token - less_count += next_token.count( '<' ) - greater_count += next_token.count( '>' ) - result.append( token ) - return result - + try: + result = [] + tmp = self.__full_name.split( '::' ) + tmp.reverse() + while tmp: + token = tmp.pop() + less_count = token.count( '<' ) + greater_count = token.count( '>' ) + if less_count != greater_count: + while less_count != greater_count and tmp: + next_token = tmp.pop() + token = token + '::' + next_token + less_count += next_token.count( '<' ) + greater_count += next_token.count( '>' ) + result.append( token ) + return result + except Exception, err: + msg = 'Unable to split scope for identifiers. The full scope name is: "%s". Error: %s' + msg = msg % ( self.__full_name, str(err) ) + raise RuntimeError( msg ) + __name_splitters = {} def get_name_splitter( full_name ): try: Added: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-15 19:18:36 UTC (rev 1280) @@ -0,0 +1,343 @@ +import os +import sys +import ctypes +import pprint +import logging +import comtypes +import itertools +import comtypes.client + +from . import enums +from . import impl_details + +from ... import utils +from ... import declarations +from .. import config as msvc_cfg + +msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) + +SymTagEnum = 12 +msdia.SymTagEnum = 12 + +def as_symbol( x ): + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) ) + +def as_table( x ): + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaTable ) ) + +def as_enum_symbols( x ): + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) ) + +def as_enum_variant( x ): + return ctypes.cast( x, ctypes.POINTER( comtypes.automation.IEnumVARIANT ) ) + +def print_files( session ): + files = iter( session.findFile( None, '', 0 ) ) + for f in files: + f = ctypes.cast( f, ctypes.POINTER(msdia.IDiaSourceFile) ) + print 'File: ', f.fileName + +class decl_loader_t(object): + def __init__(self, pdb_file_path ): + self.logger = utils.loggers.pdb_reader + self.logger.setLevel(logging.DEBUG) + self.logger.debug( 'creating DiaSource object' ) + self.__dia_source = comtypes.client.CreateObject( msdia.DiaSource ) + self.logger.debug( 'loading pdb file: %s' % pdb_file_path ) + self.__dia_source.loadDataFromPdb(pdb_file_path) + self.logger.debug( 'opening session' ) + self.__dia_session = self.__dia_source.openSession() + self.logger.debug( 'opening session - done' ) + self.__global_ns = declarations.namespace_t( '::' ) + + self.__enums = {} + self.__classes = {} + self.__typedefs = {} + + def __find_table(self, name): + valid_names = ( 'Symbols', 'SourceFiles', 'Sections' + , 'SegmentMap', 'InjectedSource', 'FrameData' ) + tables = self.__dia_session.getEnumTables() + for table in itertools.imap(as_table, tables): + if name == table.name: + return table + else: + return None + + @utils.cached + def symbols_table(self): + return self.__find_table( "Symbols" ) + + @utils.cached + def symbols(self): + smbls = {} + for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): + smbls[ smbl.symIndexId ] = smbl + return smbls + + def __load_nss(self): + def ns_filter( smbl ): + tags = ( msdia.SymTagFunction + , msdia.SymTagBlock + , msdia.SymTagData + , msdia.SymTagAnnotation + , msdia.SymTagPublicSymbol + , msdia.SymTagUDT + , msdia.SymTagEnum + , msdia.SymTagFunctionType + , msdia.SymTagPointerType + , msdia.SymTagArrayType + , msdia.SymTagBaseType + , msdia.SymTagTypedef + , msdia.SymTagBaseClass + , msdia.SymTagFriend + , msdia.SymTagFunctionArgType + , msdia.SymTagUsingNamespace ) + if smbl.symTag not in tags: + return False + elif not smbl.name: + return False + elif smbl.classParent: + if smbl.classParent.name: + return False + elif smbl.classParent.symTag == msdia.SymTagUDT: + return False + elif smbl.name.endswith( '__unnamed' ): + return False + return True + + self.logger.debug( 'scanning symbols table' ) + + self.logger.debug( 'looking for scopes' ) + names = set() + for index, smbl in enumerate( itertools.ifilter( ns_filter, self.symbols.itervalues() ) ): + if index and ( index % 10000 == 0 ): + self.logger.debug( '%d symbols scanned', index ) + name_splitter = impl_details.get_name_splitter( smbl.name ) + names.update( name_splitter.scope_names ) + names = list( names ) + names.sort() + self.logger.debug( 'looking for scopes - done' ) + + nss = {'': self.__global_ns} + + self.logger.debug( 'building namespace objects' ) + for ns_name in itertools.ifilterfalse( self.__find_udt, names ): + name_splitter = impl_details.get_name_splitter( ns_name ) + if not name_splitter.scope_names: + parent_ns = self.global_ns + else: + parent_ns = nss[ name_splitter.scope_names[-1] ] + ns_decl = declarations.namespace_t( name_splitter.name ) + parent_ns.adopt_declaration( ns_decl ) + nss[ ns_name ] = ns_decl + self.logger.debug( 'building namespace objects - done' ) + + self.logger.debug( 'scanning symbols table - done' ) + def read(self): + self.__load_nss() + #self.__populate_scopes() + + @property + def dia_global_scope(self): + return self.__dia_session.globalScope + + @property + def global_ns(self): + return self.__global_ns + + def __are_symbols_equivalent( self, smbl1_id, smbl2_id ): + smbl1 = self.__dia_session.symbolById(smbl1_id) + smbl2 = self.__dia_session.symbolById(smbl2_id) + result = self.__dia_session.symsAreEquiv( smbl1, smbl2 ) + if result: + msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.' + else: + msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.' + self.logger.debug( msg, smbl1.name, smbl1_id, smbl2.name, smbl2_id ) + return result + + def __find_udt( self, name ): + self.logger.debug( 'testing whether name( "%s" ) is UDT symbol' % name ) + flags = enums.NameSearchOptions.nsfCaseSensitive + found = self.dia_global_scope.findChildren( msdia.SymTagUDT, name, flags ) + if found.Count == 1: + self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) + return as_symbol( found.Item(0) ) + elif 1 < found.Count: + raise RuntimeError( "duplicated UDTs with name '%s', were found" % name ) + #~ self.logger.debug( 'name( "%s" ) is UDT symbol' % name ) + #~ return [as_symbol( s ) for s in iter(found)] + #~ for s in iter(found): + #~ s = + #~ print s.name + #~ print impl_details.guess_class_type(s.udtKind) + else: + self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) + return None + + def __list_main_classes( self ): + #in this context main classes, are classes that were defined within a namespace + #as opposite to the classes defined in other classes + classes = [] + dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) + for dia_class in itertools.imap(as_symbol, dia_classes ): + name_splitter = impl_details.get_name_splitter( dia_class.name ) + for index, scope in enumerate( name_splitter.scope_names ): + if scope in self.__namespaces: + continue + else: + udt = self.__find_udt( scope ) + if udt: + classes.append( udt ) + if index: + self.__namespaces[ name_splitter.scope_names[index-1] ] = None + break + else: + self.__namespaces[ scope ] = None + else: + classes.append( dia_class ) + if name_splitter.scope_names: + self.__namespaces[ name_splitter.scope_names[-1] ] = None + return classes + + def __add_inner_classes( self, parent_class ): + self.logger.debug( 'adding inner classes to "%s"' % parent_class.decl_string ) + for symbol_id in parent_class.dia_symbols: + self.logger.debug( '\tdia symbol id: %d' % symbol_id ) + dia_symbol = self.__dia_session.symbolById( symbol_id ) + found = dia_symbol.findChildren( msdia.SymTagUDT, None, 0 ) + for inner_dia_class in itertools.imap(as_symbol, found): + self.logger.debug( '\t\tinner UDT found - %s' % inner_dia_class.name ) + inner_name_splitter = impl_details.get_name_splitter( inner_dia_class.name ) + try: + inner_klass = parent_class.class_( inner_name_splitter.name, recursive=False ) + inner_klass.dia_symbols.add( inner_dia_class.symIndexId ) + except parent_class.declaration_not_found_t: + inner_klass = self.__create_class( inner_dia_class ) + parent_class.adopt_declaration( inner_klass + , impl_details.guess_access_type( inner_dia_class.access ) ) + self.__classes[ inner_dia_class.name ] = inner_klass + self.logger.debug( 'adding inner classes to "%s" - done' % parent_class.decl_string ) + + def __create_enum( self, enum_smbl ): + name_splitter = impl_details.get_name_splitter( enum_smbl.name ) + enum_decl = declarations.enumeration_t( name_splitter.name ) + enum_decl.dia_symbols = [ enum_smbl.symIndexId ] + enum_decl.byte_size = enum_smbl.length + values = enum_smbl.findChildren( msdia.SymTagData, None, 0 ) + for v in itertools.imap(as_symbol, values): + if v.classParent.symIndexId != enum_smbl.symIndexId: + continue + enum_decl.append_value( v.name, v.value ) + if enum_decl.values: + return enum_decl + else: + #for some reason same enum could appear under global namespace and + #under the class, it was defined in. This is a criteria I use to distinguish + #between those cases + return None + + def __load_enums( self, parent_symbol_id ): + parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) + self.logger.debug( 'loading enums to "%s" ' % parent_symbol.name ) + enum_smbls = parent_symbol.findChildren( SymTagEnum, None, 0 ) + for enum_smbl in itertools.imap(as_symbol, enum_smbls ): + enum_decl = self.__create_enum( enum_smbl ) + if enum_decl: + try: + for enum_discovered in self.__enums[ enum_smbl.name ]: + if self.__are_symbols_equivalent( enum_smbl.symIndexId, enum_discovered.dia_symbols[0] ): + continue + else: + self.__enums[ enum_smbl.name ].append( enum_decl ) + except KeyError: + self.__enums[ enum_smbl.name ] = [ enum_decl ] + self.logger.debug( '\tfound %s %s' % ( enum_smbl.name, str(enum_decl) ) ) + self.logger.debug( 'loading enums to "%s" - done' % parent_symbol.name ) + + def __create_typedef( self, typedef_smbl ): + name_splitter = impl_details.get_name_splitter( typedef_smbl.name ) + typedef_decl = declarations.typedef_t( name_splitter.name ) + typedef_decl.dia_symbols = [ typedef_smbl.symIndexId ] + return typedef_decl + + def __load_typedefs( self, parent_symbol_id ): + parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) + self.logger.debug( 'loading typedefs to "%s" ' % parent_symbol.name ) + typedef_smbls = parent_symbol.findChildren( SymTagTypedef, None, 0 ) + for typedef_smbl in itertools.imap(as_symbol, typedef_smbls ): + typedef_decl = self.__create_typedef( typedef_smbl ) + try: + for typedef_discovered in self.__typedefs[ typedef_smbl.name ]: + if self.__are_symbols_equivalent( typedef_smbl.symIndexId, typedef_discovered.dia_symbols[0] ): + continue + else: + self.__typedefs[ typedef_smbl.name ].append( typedef_decl ) + except KeyError: + self.__typedefs[ typedef_smbl.name ] = [ typedef_decl ] + self.logger.debug( '\tfound %s %s' % ( typedef_smbl.name, str(typedef_decl) ) ) + self.logger.debug( 'loading typedefs to "%s" - done' % parent_symbol.name ) + + def __load_classes( self, parent_symbol_id ): + parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) + self.logger.debug( 'loading classes to "%s" ' % parent_symbol.name ) + class_smbls = parent_symbol.findChildren( msdia.SymTagUDT, None, 0 ) + for class_smbl in itertools.imap(as_symbol, class_smbls ): + class_decl = self.__create_class( class_smbl ) + try: + equivalent_found = False + for class_discovered in self.__classes[ class_smbl.name ]: + for smbl_discovered in class_discovered.dia_symbols: + equivalent_found = self.__are_symbols_equivalent( smbl_discovered, class_smbl.symIndexId ) + if equivalent_found: + class_discovered.dia_symbols.add( class_smbl.symIndexId ) + break + if equivalent_found: + break + if not equivalent_found: + self.__classes[ class_smbl.name ].append( class_decl ) + except KeyError: + self.__classes[ class_smbl.name ] = [ class_decl ] + self.logger.debug( '\tfound %s' % str(class_decl) ) + self.logger.debug( 'loading classes to "%s" - done' % parent_symbol.name ) + + def __create_class( self, class_smbl ): + name_splitter = impl_details.get_name_splitter( class_smbl.name ) + class_decl = declarations.class_t( name_splitter.name ) + class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) + class_decl.dia_symbols = set([class_smbl.symIndexId]) + class_decl.byte_size = class_smbl.length + return class_decl + + def __populate_scopes(self): + self.__load_enums( self.dia_global_scope.symIndexId ) + self.__load_classes( self.dia_global_scope.symIndexId ) + self.__load_typedefs( self.dia_global_scope.symIndexId ) + #~ main_classes = self.__list_main_classes() + #~ self.__create_nss() + + #~ for dia_class in main_classes: + #~ name_splitter = impl_details.get_name_splitter( dia_class.name ) + #~ if not name_splitter.scope_names: + #~ parent_ns = self.global_ns + #~ else: + #~ parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ] + + #~ try: + #~ klass = parent_ns.class_( name_splitter.name, recursive=False ) + #~ klass.dia_symbols.add( dia_class.symIndexId ) + #~ except parent_ns.declaration_not_found_t: + #~ klass = self.__create_class( dia_class ) + #~ parent_ns.adopt_declaration( klass ) + #~ self.__classes[ dia_class.name ] = klass + + #~ map( self.__add_inner_classes, self.__classes.values() ) + + #~ self.__add_enums( self.dia_global_scope.symIndexId ) + #~ for klass in self.__classes.itervalues(): + #~ map( self.__add_enums, klass.dia_symbols ) + + #declarations.print_declarations( self.global_ns )#.namespace( 'ns1' ) ) + #declarations.print_declarations( self.global_ns.namespace( 'std' ) ) + Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-03-12 21:11:19 UTC (rev 1279) +++ pygccxml_dev/unittests/pdb_tester.py 2008-03-15 19:18:36 UTC (rev 1280) @@ -9,16 +9,37 @@ def __init__(self, *args): unittest.TestCase.__init__(self, *args) - def test(self): + def __test_splitter_impl( self, name, expected_result ): + splitter = pdb.impl_details.full_name_splitter_t( name ) + self.failUnless( len(splitter.scope_names) == len(expected_result) ) + self.failUnless( splitter.scope_names == expected_result ) + + def __test_name_splitter(self): + name = "std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator::operator->" + expected_result = [ + 'std' + , 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >', 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator' + ] + self.__test_splitter_impl( name, expected_result ) + + name = 'boost::reference_wrapper<engine_objects::ops::pathable_t const >::operator engine_objects::ops::pathable_t const &' + expected_result = [ + 'boost' + , 'boost::reference_wrapper<engine_objects::ops::pathable_t const >' + ] + self.__test_splitter_impl( name, expected_result ) + + def test_create_nss(self): control_pdb = os.path.join( autoconfig.data_directory, r'xxx.pdb' ) - reader = pdb.reader_t( control_pdb ) + reader = pdb.decl_loader_t( control_pdb ) + print reader.symbols_table.name reader.read() f = file( 'decls.cpp', 'w+' ) - declarations.print_declarations( reader.global_ns, writer=f.write ) + declarations.print_declarations( reader.global_ns )#, writer=f.write ) f.close() def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -26,4 +47,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-03-22 22:14:33
|
Revision: 1286 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1286&view=rev Author: roman_yakovenko Date: 2008-03-22 15:14:36 -0700 (Sat, 22 Mar 2008) Log Message: ----------- adding new functionality Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/pdb_tester.py Removed Paths: ------------- pygccxml_dev/unittests/pdb_reader.py Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -19,4 +19,5 @@ finally: comtypes.client.gen_dir = comtypes_client_gen_dir -from loader import decl_loader_t \ No newline at end of file +from loader import decl_loader_t + Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -26,8 +26,8 @@ return ctypes.cast( x, ctypes.POINTER( msdia.IDiaTable ) ) def as_enum_symbols( x ): - return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) ) - + return ctypes.cast( x, ctypes.POINTER( msdia.IDiaEnumSymbols ) ) + def as_enum_variant( x ): return ctypes.cast( x, ctypes.POINTER( comtypes.automation.IEnumVARIANT ) ) @@ -110,9 +110,9 @@ elif smbl.name.endswith( '__unnamed' ): return False return True - + self.logger.debug( 'scanning symbols table' ) - + self.logger.debug( 'looking for scopes' ) names = set() for index, smbl in enumerate( itertools.ifilter( ns_filter, self.symbols.itervalues() ) ): @@ -120,14 +120,14 @@ self.logger.debug( '%d symbols scanned', index ) if '_Facetptr<std::ctype<char> >' in smbl.name: i = 0 - name_splitter = impl_details.get_name_splitter( smbl.name ) + name_splitter = impl_details.get_name_splitter( smbl.name ) names.update( name_splitter.scope_names ) names = list( names ) names.sort() self.logger.debug( 'looking for scopes - done' ) - + nss = {'': self.__global_ns} - + self.logger.debug( 'building namespace objects' ) for ns_name in itertools.ifilterfalse( self.__find_udt, names ): name_splitter = impl_details.get_name_splitter( ns_name ) @@ -139,11 +139,43 @@ parent_ns.adopt_declaration( ns_decl ) nss[ ns_name ] = ns_decl self.logger.debug( 'building namespace objects - done' ) - + self.logger.debug( 'scanning symbols table - done' ) + + def __load_classes( self ): + classes = {}#unique symbold id : class decl + is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT + self.logger.info( 'building udt objects' ) + for udt_smbl in itertools.ifilter( is_udt, self.symbols.itervalues() ): + classes[udt_smbl.symIndexId] = self.__create_class(udt_smbl) + self.logger.info( 'building udt objects(%d) - done', len(classes) ) + + does_parent_exist = lambda cls_decl: not classes.has_key( cls_decl.dia_symbols[0].classParentId ) + self.logger.info( 'integrating udt objects with namespaces' ) + while classes: + self.logger.info( 'there are %d classes to go', len( classes ) ) + to_be_deleted = filter( does_parent_exist, classes.itervalues() ) + for ns_class in to_be_deleted: + udt_smbl = ns_class.dia_symbols[0] + name_splitter = impl_details.get_name_splitter( udt_smbl.name ) + if not name_splitter.scope_names: + self.global_ns.adopt_declaration( ns_class ) + else: + parent_name = '::' + name_splitter.scope_names[-1] + parent = self.global_ns.decls( parent_name, allow_empty=True ) + if not parent: + self.logger.debug( 'unable to find parent for class %s', udt_smbl.name ) + continue + if isinstance( parent[0], declarations.namespace_t ): + parent.adopt_declaration( ns_class ) + else: + parent[0].adopt_declaration( ns_class, declarations.ACCESS_TYPES.PUBLIC ) + del classes[ ns_class.dia_symbols[0].symIndexId ] + self.logger.info( 'integrating udt objects with namespaces - done' ) + def read(self): self.__load_nss() - #self.__populate_scopes() + self.__load_classes() @property def dia_global_scope(self): @@ -183,50 +215,7 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None - def __list_main_classes( self ): - #in this context main classes, are classes that were defined within a namespace - #as opposite to the classes defined in other classes - classes = [] - dia_classes = self.dia_global_scope.findChildren( msdia.SymTagUDT, None, 0 ) - for dia_class in itertools.imap(as_symbol, dia_classes ): - name_splitter = impl_details.get_name_splitter( dia_class.name ) - for index, scope in enumerate( name_splitter.scope_names ): - if scope in self.__namespaces: - continue - else: - udt = self.__find_udt( scope ) - if udt: - classes.append( udt ) - if index: - self.__namespaces[ name_splitter.scope_names[index-1] ] = None - break - else: - self.__namespaces[ scope ] = None - else: - classes.append( dia_class ) - if name_splitter.scope_names: - self.__namespaces[ name_splitter.scope_names[-1] ] = None - return classes - def __add_inner_classes( self, parent_class ): - self.logger.debug( 'adding inner classes to "%s"' % parent_class.decl_string ) - for symbol_id in parent_class.dia_symbols: - self.logger.debug( '\tdia symbol id: %d' % symbol_id ) - dia_symbol = self.__dia_session.symbolById( symbol_id ) - found = dia_symbol.findChildren( msdia.SymTagUDT, None, 0 ) - for inner_dia_class in itertools.imap(as_symbol, found): - self.logger.debug( '\t\tinner UDT found - %s' % inner_dia_class.name ) - inner_name_splitter = impl_details.get_name_splitter( inner_dia_class.name ) - try: - inner_klass = parent_class.class_( inner_name_splitter.name, recursive=False ) - inner_klass.dia_symbols.add( inner_dia_class.symIndexId ) - except parent_class.declaration_not_found_t: - inner_klass = self.__create_class( inner_dia_class ) - parent_class.adopt_declaration( inner_klass - , impl_details.guess_access_type( inner_dia_class.access ) ) - self.__classes[ inner_dia_class.name ] = inner_klass - self.logger.debug( 'adding inner classes to "%s" - done' % parent_class.decl_string ) - def __create_enum( self, enum_smbl ): name_splitter = impl_details.get_name_splitter( enum_smbl.name ) enum_decl = declarations.enumeration_t( name_splitter.name ) @@ -245,23 +234,6 @@ #between those cases return None - def __load_enums( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading enums to "%s" ' % parent_symbol.name ) - enum_smbls = parent_symbol.findChildren( SymTagEnum, None, 0 ) - for enum_smbl in itertools.imap(as_symbol, enum_smbls ): - enum_decl = self.__create_enum( enum_smbl ) - if enum_decl: - try: - for enum_discovered in self.__enums[ enum_smbl.name ]: - if self.__are_symbols_equivalent( enum_smbl.symIndexId, enum_discovered.dia_symbols[0] ): - continue - else: - self.__enums[ enum_smbl.name ].append( enum_decl ) - except KeyError: - self.__enums[ enum_smbl.name ] = [ enum_decl ] - self.logger.debug( '\tfound %s %s' % ( enum_smbl.name, str(enum_decl) ) ) - self.logger.debug( 'loading enums to "%s" - done' % parent_symbol.name ) def __create_typedef( self, typedef_smbl ): name_splitter = impl_details.get_name_splitter( typedef_smbl.name ) @@ -269,82 +241,10 @@ typedef_decl.dia_symbols = [ typedef_smbl.symIndexId ] return typedef_decl - def __load_typedefs( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading typedefs to "%s" ' % parent_symbol.name ) - typedef_smbls = parent_symbol.findChildren( SymTagTypedef, None, 0 ) - for typedef_smbl in itertools.imap(as_symbol, typedef_smbls ): - typedef_decl = self.__create_typedef( typedef_smbl ) - try: - for typedef_discovered in self.__typedefs[ typedef_smbl.name ]: - if self.__are_symbols_equivalent( typedef_smbl.symIndexId, typedef_discovered.dia_symbols[0] ): - continue - else: - self.__typedefs[ typedef_smbl.name ].append( typedef_decl ) - except KeyError: - self.__typedefs[ typedef_smbl.name ] = [ typedef_decl ] - self.logger.debug( '\tfound %s %s' % ( typedef_smbl.name, str(typedef_decl) ) ) - self.logger.debug( 'loading typedefs to "%s" - done' % parent_symbol.name ) - - def __load_classes( self, parent_symbol_id ): - parent_symbol = self.__dia_session.symbolById( parent_symbol_id ) - self.logger.debug( 'loading classes to "%s" ' % parent_symbol.name ) - class_smbls = parent_symbol.findChildren( msdia.SymTagUDT, None, 0 ) - for class_smbl in itertools.imap(as_symbol, class_smbls ): - class_decl = self.__create_class( class_smbl ) - try: - equivalent_found = False - for class_discovered in self.__classes[ class_smbl.name ]: - for smbl_discovered in class_discovered.dia_symbols: - equivalent_found = self.__are_symbols_equivalent( smbl_discovered, class_smbl.symIndexId ) - if equivalent_found: - class_discovered.dia_symbols.add( class_smbl.symIndexId ) - break - if equivalent_found: - break - if not equivalent_found: - self.__classes[ class_smbl.name ].append( class_decl ) - except KeyError: - self.__classes[ class_smbl.name ] = [ class_decl ] - self.logger.debug( '\tfound %s' % str(class_decl) ) - self.logger.debug( 'loading classes to "%s" - done' % parent_symbol.name ) - def __create_class( self, class_smbl ): name_splitter = impl_details.get_name_splitter( class_smbl.name ) class_decl = declarations.class_t( name_splitter.name ) class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.dia_symbols = set([class_smbl.symIndexId]) + class_decl.dia_symbols = [class_smbl] class_decl.byte_size = class_smbl.length return class_decl - - def __populate_scopes(self): - self.__load_enums( self.dia_global_scope.symIndexId ) - self.__load_classes( self.dia_global_scope.symIndexId ) - self.__load_typedefs( self.dia_global_scope.symIndexId ) - #~ main_classes = self.__list_main_classes() - #~ self.__create_nss() - - #~ for dia_class in main_classes: - #~ name_splitter = impl_details.get_name_splitter( dia_class.name ) - #~ if not name_splitter.scope_names: - #~ parent_ns = self.global_ns - #~ else: - #~ parent_ns = self.__namespaces[ name_splitter.scope_names[-1] ] - - #~ try: - #~ klass = parent_ns.class_( name_splitter.name, recursive=False ) - #~ klass.dia_symbols.add( dia_class.symIndexId ) - #~ except parent_ns.declaration_not_found_t: - #~ klass = self.__create_class( dia_class ) - #~ parent_ns.adopt_declaration( klass ) - #~ self.__classes[ dia_class.name ] = klass - - #~ map( self.__add_inner_classes, self.__classes.values() ) - - #~ self.__add_enums( self.dia_global_scope.symIndexId ) - #~ for klass in self.__classes.itervalues(): - #~ map( self.__add_enums, klass.dia_symbols ) - - #declarations.print_declarations( self.global_ns )#.namespace( 'ns1' ) ) - #declarations.print_declarations( self.global_ns.namespace( 'std' ) ) - Deleted: pygccxml_dev/unittests/pdb_reader.py =================================================================== --- pygccxml_dev/unittests/pdb_reader.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/unittests/pdb_reader.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -1,22 +0,0 @@ -import os -import sys -import win32com.client -from sets import Set as set - -MODULE_IDENTIFIER = ('{106173A0-0173-4e5c-84E7-E915422BE997}', 0, 2, 0) -MODULE_PATH = r'Lib\site-packages\win32com\gen_py\106173A0-0173-4e5c-84E7-E915422BE997x0x2x0.py' - -try: - full_module_path = os.path.split( sys.executable )[0] - full_module_path = os.path.join( full_module_path, MODULE_PATH ) - if os.path.exists( full_module_path ): - os.remove( full_module_path ) - print full_module_path, " removed successfully" -except Exception, error: - print error - -msdia = win32com.client.gencache.EnsureModule( *MODULE_IDENTIFIER ) -print msdia - -if __name__ == "__main__": - pass Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-03-22 22:14:05 UTC (rev 1285) +++ pygccxml_dev/unittests/pdb_tester.py 2008-03-22 22:14:36 UTC (rev 1286) @@ -8,11 +8,15 @@ class tester_t( unittest.TestCase ): def __init__(self, *args): unittest.TestCase.__init__(self, *args) + self.pdb_file = os.path.join( autoconfig.data_directory + , 'msvc_build' + , 'Debug' + , 'msvc_build.pdb' ) def __test_splitter_impl( self, name, expected_result ): splitter = pdb.impl_details.full_name_splitter_t( name ) - self.failUnless( len(splitter.scope_names) == len(expected_result) ) - self.failUnless( splitter.scope_names == expected_result ) + self.failUnless( len(splitter.scope_names) == len(expected_result) ) + self.failUnless( splitter.scope_names == expected_result ) def __test_name_splitter(self): name = "std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator::operator->" @@ -21,17 +25,16 @@ , 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >', 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator' ] self.__test_splitter_impl( name, expected_result ) - + name = 'boost::reference_wrapper<engine_objects::ops::pathable_t const >::operator engine_objects::ops::pathable_t const &' expected_result = [ 'boost' , 'boost::reference_wrapper<engine_objects::ops::pathable_t const >' ] self.__test_splitter_impl( name, expected_result ) - + def test_create_nss(self): - control_pdb = os.path.join( autoconfig.data_directory, r'xxx.pdb' ) - reader = pdb.decl_loader_t( control_pdb ) + reader = pdb.decl_loader_t( self.pdb_file ) print reader.symbols_table.name reader.read() f = file( 'decls.cpp', 'w+' ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-03-25 21:34:35
|
Revision: 1291 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1291&view=rev Author: roman_yakovenko Date: 2008-03-25 14:34:35 -0700 (Tue, 25 Mar 2008) Log Message: ----------- milestone - classes and namespaces could be loaded from pdb Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-24 21:18:46 UTC (rev 1290) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-25 21:34:35 UTC (rev 1291) @@ -73,11 +73,13 @@ def get_name( smbl ): if not smbl.name: return - for ch in '@?$': - if ch in smbl.name and smbl.undecoratedName: - return smbl.undecoratedName else: - return smbl.name + return impl_details.undecorate_name( smbl.name ) + #~ for ch in '@?$': + #~ if ch in smbl.name: + #~ return impl_details.undecorate_name( smbl.name ) + #~ else: + #~ return smbl.name smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): @@ -87,6 +89,7 @@ def __load_nss(self): def ns_filter( smbl ): + self.logger.debug( '__load_ns.ns_filter, %s', smbl.uname ) tags = ( msdia.SymTagFunction , msdia.SymTagBlock #I should skipp data, because it requier different treatment @@ -105,21 +108,29 @@ , msdia.SymTagFunctionArgType , msdia.SymTagUsingNamespace ) if smbl.symTag not in tags: + self.logger.debug( 'smbl.symTag not in tags, %s', smbl.uname ) return False elif not smbl.name: + self.logger.debug( 'not smbl.name, %s', smbl.uname ) return False + #~ elif '-' in smbl.name: + #~ self.logger.debug( '"-" in smbl.name, %s', smbl.uname ) + #~ return False elif smbl.classParent: - if smbl.classParent.name: - return False - parent_smbl = smbl.classParent + parent_smbl = self.symbols[ smbl.classParentId ] while parent_smbl: if parent_smbl.symTag == msdia.SymTagUDT: - return False + if parent_smbl.uname in smbl.uname: + #for some reason std::map is reported as parent of std::_Tree, in source code + #std::map derives from std::_Tree. In logical sense parent name is a subset of the child name + self.logger.debug( 'parent_smbl.symTag == msdia.SymTagUDT, %s', parent_smbl.uname ) + return False + else: + return True else: - parent_smbl = parent_smbl.classParent - elif smbl.name.endswith( '__unnamed' ): - return False - return True + parent_smbl = self.symbols[ parent_smbl.classParentId ] + else: + return True self.logger.debug( 'scanning symbols table' ) @@ -128,9 +139,7 @@ for index, smbl in enumerate( itertools.ifilter( ns_filter, self.symbols.itervalues() ) ): if index and ( index % 10000 == 0 ): self.logger.debug( '%d symbols scanned', index ) - if '_Facetptr<std::ctype<char> >' in smbl.name: - i = 0 - name_splitter = impl_details.get_name_splitter( smbl.name ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) names.update( name_splitter.scope_names ) names = list( names ) names.sort() @@ -152,35 +161,69 @@ self.logger.debug( 'scanning symbols table - done' ) + def __add_class( self, parent, class_decl ): + class_smbl = class_decl.dia_symbols[0] + already_added = parent.classes( class_decl.name, recursive=False, allow_empty=True ) + if not already_added: + if isinstance( parent, declarations.namespace_t ): + parent.adopt_declaration( class_decl ) + else: + parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + else: + for decl in already_added: + for smbl in decl.dia_symbols: + if self.__are_symbols_equivalent( smbl, class_smbl ): + decl.dia_symbols.append( class_smbl ) + return + else: + if isinstance( parent, declarations.namespace_t ): + parent.adopt_declaration( class_decl ) + else: + parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + def __load_classes( self ): - classes = {}#unique symbold id : class decl + classes = {}#unique symbol id : class decl is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT self.logger.info( 'building udt objects' ) for udt_smbl in itertools.ifilter( is_udt, self.symbols.itervalues() ): classes[udt_smbl.symIndexId] = self.__create_class(udt_smbl) self.logger.info( 'building udt objects(%d) - done', len(classes) ) - does_parent_exist = lambda cls_decl: not classes.has_key( cls_decl.dia_symbols[0].classParentId ) + def does_parent_exist_in_decls_tree( class_decl ): + class_smbl = class_decl.dia_symbols[0] + if classes.has_key( class_smbl.classParentId ): + return False + name_splitter = impl_details.get_name_splitter( class_smbl.uname ) + if not name_splitter.scope_names: + return True #global namespace + else: + parent_name = '::' + name_splitter.scope_names[-1] + found = self.global_ns.decls( parent_name + , decl_type=declarations.scopedef_t + , allow_empty=True + , recursive=True ) + return bool( found ) + self.logger.info( 'integrating udt objects with namespaces' ) while classes: self.logger.info( 'there are %d classes to go', len( classes ) ) - to_be_deleted = filter( does_parent_exist, classes.itervalues() ) + to_be_deleted = filter( does_parent_exist_in_decls_tree, classes.itervalues() ) for ns_class in to_be_deleted: udt_smbl = ns_class.dia_symbols[0] - name_splitter = impl_details.get_name_splitter( udt_smbl.name ) + name_splitter = impl_details.get_name_splitter( udt_smbl.uname ) if not name_splitter.scope_names: - self.global_ns.adopt_declaration( ns_class ) + self.__add_class( self.global_ns, ns_class ) else: parent_name = '::' + name_splitter.scope_names[-1] - parent = self.global_ns.decls( parent_name, allow_empty=True ) - if not parent: - self.logger.debug( 'unable to find parent for class %s', udt_smbl.name ) - continue - parent = parent[0] - if isinstance( parent, declarations.namespace_t ): - parent.adopt_declaration( ns_class ) - else: - parent.adopt_declaration( ns_class, declarations.ACCESS_TYPES.PUBLIC ) + try: + parent = self.global_ns.decl( parent_name ) + except: + declarations.print_declarations( self.global_ns ) + print 'identifiers:' + for index, identifier in enumerate(name_splitter.identifiers): + print index, ':', identifier + raise + self.__add_class( parent, ns_class ) del classes[ ns_class.dia_symbols[0].symIndexId ] self.logger.info( 'integrating udt objects with namespaces - done' ) @@ -196,15 +239,15 @@ def global_ns(self): return self.__global_ns - def __are_symbols_equivalent( self, smbl1_id, smbl2_id ): - smbl1 = self.__dia_session.symbolById(smbl1_id) - smbl2 = self.__dia_session.symbolById(smbl2_id) - result = self.__dia_session.symsAreEquiv( smbl1, smbl2 ) + def __are_symbols_equivalent( self, smbl1, smbl2 ): + result = smbl1.symTag == smbl2.symTag and smbl1.uname == smbl2.uname + if not result: + result = self.__dia_session.symsAreEquiv( smbl1, smbl2 ) if result: msg = 'Symbols "%s(%d)" and "%s(%d)" are equivalent.' else: msg = 'Symbols "%s(%d)" and "%s(%d)" are NOT equivalent.' - self.logger.debug( msg, smbl1.name, smbl1_id, smbl2.name, smbl2_id ) + self.logger.debug( msg, smbl1.uname, smbl1.symIndexId, smbl2.uname, smbl2.symIndexId ) return result def __find_udt( self, name ): Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-03-24 21:18:46 UTC (rev 1290) +++ pygccxml_dev/unittests/pdb_tester.py 2008-03-25 21:34:35 UTC (rev 1291) @@ -33,13 +33,13 @@ ] self.__test_splitter_impl( name, expected_result ) - def __test_create_nss(self): + def test_create_nss(self): reader = pdb.decl_loader_t( self.pdb_file ) print reader.symbols_table.name reader.read() - f = file( 'decls.cpp', 'w+' ) - declarations.print_declarations( reader.global_ns )#, writer=f.write ) - f.close() + #f = file( 'decls.cpp', 'w+' ) + #declarations.print_declarations( reader.global_ns )#, writer=f.write ) + #f.close() def test_undecorate_name(self): #basic test, that verify that function wrapper works as expected This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-03-26 20:36:40
|
Revision: 1292 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1292&view=rev Author: roman_yakovenko Date: 2008-03-26 13:36:42 -0700 (Wed, 26 Mar 2008) Log Message: ----------- another set of changes - sync bsc & pdb outputs Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/msvc/bsc/__init__.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/impl_details.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/bsc_tester.py pygccxml_dev/unittests/pdb_tester.py Added Paths: ----------- pygccxml_dev/pygccxml/msvc/common_utils.py Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -34,7 +34,7 @@ def get_partial_name( name ): import templates import container_traits #prevent cyclic dependencies - ct = container_traits.find_container_traits( name ) + ct = container_traits.find_container_traits( name ) if ct: return ct.remove_defaults( name ) elif templates.is_instantiation( name ): @@ -44,8 +44,8 @@ return templates.join( tmpl_name, args ) else: return name - + class hierarchy_info_t( object ): """describes class relationship""" def __init__(self, related_class=None, access=None ): @@ -98,14 +98,14 @@ self._aliases = [] self._container_traits = None self._container_traits_set = False - + def _get__cmp__items(self): """implementation details""" return [] - + def i_depend_on_them( self, recursive=True ): return [] - + def _get_aliases(self): return self._aliases def _set_aliases( self, new_aliases ): @@ -119,12 +119,12 @@ if self._container_traits_set == False: import container_traits #prevent cyclic dependencies self._container_traits_set = True - self._container_traits = container_traits.find_container_traits( self ) + self._container_traits = container_traits.find_container_traits( self ) return self._container_traits - + def _get_partial_name_impl( self ): return get_partial_name( self.name ) - + class class_t( scopedef.scopedef_t ): """describes class definition""" @@ -143,7 +143,7 @@ self._protected_members = [] self._aliases = [] self._byte_size = 0 - self._byte_align = 0 + self._byte_align = 0 self._container_traits = None self._container_traits_set = False self._recursive_bases = None @@ -152,7 +152,7 @@ def _get_name_impl( self ): if not self._name: #class with empty name return self._name - elif class_t.USE_DEMANGLED_AS_NAME and self.demangled: + elif class_t.USE_DEMANGLED_AS_NAME and self.demangled and 'GCC' in self.compiler: if not self.cache.demangled_name: fname = algorithm.full_name( self.parent ) if fname.startswith( '::' ) and not self.demangled.startswith( '::' ): @@ -408,14 +408,14 @@ def i_depend_on_them( self, recursive=True ): report_dependency = lambda *args: dependencies.dependency_info_t( self, *args ) answer = [] - + map( lambda base: answer.append( report_dependency( base.related_class, base.access_type ) ) , self.bases ) - + if recursive: map( lambda access_type: answer.extend( self.__find_out_member_dependencies( access_type ) ) , ACCESS_TYPES.ALL ) - + return answer @property @@ -424,7 +424,7 @@ if self._container_traits_set == False: import container_traits #prevent cyclic dependencies self._container_traits_set = True - self._container_traits = container_traits.find_container_traits( self ) + self._container_traits = container_traits.find_container_traits( self ) return self._container_traits def find_copy_constructor( self ): @@ -433,7 +433,7 @@ return copy_[0] else: return None - + def find_trivial_constructor( self ): trivial = self.constructors( lambda x: x.is_trivial_constructor, recursive=False, allow_empty=True ) if trivial: Modified: pygccxml_dev/pygccxml/msvc/bsc/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/bsc/__init__.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/pygccxml/msvc/bsc/__init__.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -1,8 +1,8 @@ import os import sys import logging - from c_wrapper import * +from .. import common_utils as msvc_utils class definition_t(object): #represents some other symbol @@ -13,7 +13,7 @@ @property def def_id(self): return self.__def_id - + @utils.cached def location( self ): module = STRING() @@ -21,18 +21,18 @@ if not BSCIdefInfo( self.__bsc, self.def_id, byref( module ), byref( line ) ): raise RuntimeError( "Unable to load information about instance(%s)" % str( self.__def_id ) ) return (module, line) - - @utils.cached + + @utils.cached def file_name(self): return self.location[0].value - @utils.cached + @utils.cached def line(self): return self.location[1].value - - def __str__( self ): + + def __str__( self ): return self.file_name + ': %d' % self.line + ' name: %s' % self.as_instance.name - + @utils.cached def as_instance(self): return self.__bsc.create_instance( BSCIinstFrIdef( self.__bsc, self.def_id) ) @@ -46,7 +46,7 @@ @property def inst_id(self): return self.__inst_id - + @utils.cached def name_type_attribute_mangled_name( self ): name = STRING() @@ -54,135 +54,143 @@ attribute = ATR() if not BSCIinstInfo( self.__bsc, self.inst_id, byref( name ), byref( typ ), byref( attribute ) ): raise RuntimeError( "Unable to load information about instance(%s)" % str( self.__inst_id ) ) - undecorated_name = BSCFormatDname( self.__bsc, name ) + undecorated_name = msvc_utils.undecorate_name( name.value ) + if undecorated_name.startswith( ' ?? ' ): + undecorated_name = undecorated_name[4:] + #BSCFormatDname( self.__bsc, name ) return undecorated_name, typ, attribute, name.value - - - @utils.cached + + @utils.cached def mangled_name(self): return self.name_type_attribute_mangled_name[3] - - @utils.cached + + @utils.cached def name(self): return self.name_type_attribute_mangled_name[0] - @utils.cached + @utils.cached def type(self): return self.name_type_attribute_mangled_name[1].value - @utils.cached + @utils.cached def attribute(self): return self.name_type_attribute_mangled_name[2].value - - def __str__( self ): + + @utils.cached + def is_class(self): + return self.type in [ enums.TYPES.STRUCNAM + , enums.TYPES.UNIONNAM + , enums.TYPES.CLASSNAM ] + + def __str__( self ): tmp = [] if enums.TYPES.has_value( self.type ): tmp.append( 'type( "%s" )' % enums.TYPES.name_of( self.type ) ) if enums.ATTRIBUTES.has_value( self.attribute ): - tmp.append( 'attribute( "%s" )' % enums.ATTRIBUTES.name_of( self.attribute ) ) - tmp.append( 'name( "%s" )' % self.name ) - tmp.append( 'mangled name( "%s" )' % self.mangled_name ) + tmp.append( 'attribute( "%s" )' % enums.ATTRIBUTES.name_of( self.attribute ) ) + tmp.append( 'name( "%s" )' % self.name ) + tmp.append( 'mangled name( "%s" )' % self.mangled_name ) return ', '.join( tmp ) - - + + @utils.cached def definitions( self ): - definitions_len = ULONG(0) + definitions_len = ULONG(0) definitions_ids = pointer( IDEF() ) - + if not BSCGetDefArray( self.__bsc, self.inst_id, byref( definitions_ids ), byref( definitions_len ) ): raise RuntimeError( "Unable to call BSCGetDefArray" ) - + definitions = map( lambda i: definition_t( definitions_ids[i], self.__bsc ) , range( definitions_len.value ) ) - - BSCDisposeArray( self.__bsc, definitions_ids ) + + BSCDisposeArray( self.__bsc, definitions_ids ) return definitions - + @utils.cached def members( self ): - instances_len = ULONG(0) + instances_len = ULONG(0) instances_ids = pointer( IINST() ) - + if not BSCGetMembersArray( self.__bsc, self.inst_id, enums.MBF.ALL, byref( instances_ids ), byref( instances_len ) ): raise RuntimeError( "Unable to call BSCGetMembersArray" ) - + instances = map( lambda i: self.__bsc.create_instance( instances_ids[i] ) , range( instances_len.value ) ) - - BSCDisposeArray( self.__bsc, instances_ids ) + + BSCDisposeArray( self.__bsc, instances_ids ) return instances @utils.cached def used_symbols(self): - instances_len = ULONG(0) + instances_len = ULONG(0) instances_ids = pointer( IINST() ) if not BSCGetUsesArray( self.__bsc, self.inst_id, enums.MBF.ALL, byref( instances_ids ), byref( instances_len ) ): raise RuntimeError( "Unable to call BSCGetUsesArray" ) - + instances = map( lambda i: self.__bsc.create_instance( instances_ids[i] ) , range( instances_len.value ) ) - - BSCDisposeArray( self.__bsc, instances_ids ) + + BSCDisposeArray( self.__bsc, instances_ids ) return instances @utils.cached def base_classes(self): - instances_len = ULONG(0) + instances_len = ULONG(0) instances_ids = pointer( IINST() ) if not BSCGetBaseArray( self.__bsc, self.inst_id, byref( instances_ids ), byref( instances_len ) ): raise RuntimeError( "Unable to call BSCGetBaseArray" ) - + instances = map( lambda i: self.__bsc.create_instance( instances_ids[i] ) , range( instances_len.value ) ) - - BSCDisposeArray( self.__bsc, instances_ids ) + + BSCDisposeArray( self.__bsc, instances_ids ) return instances @utils.cached def derived_classes(self): - instances_len = ULONG(0) + instances_len = ULONG(0) instances_ids = pointer( IINST() ) if not BSCGetDervArray( self.__bsc, self.inst_id, byref( instances_ids ), byref( instances_len ) ): raise RuntimeError( "Unable to call BSCGetDervArray" ) - + instances = map( lambda i: self.__bsc.create_instance( instances_ids[i] ) , range( instances_len.value ) ) - - BSCDisposeArray( self.__bsc, instances_ids ) + + BSCDisposeArray( self.__bsc, instances_ids ) return instances class module_t(object): - #represents file + #represents file def __init__( self, mod_id, bsc ): self.__bsc = bsc self.__mod_id = mod_id - + @property def mod_id( self ): - return self.__mod_id - + return self.__mod_id + @utils.cached def path( self ): name = STRING() BSCImodInfo(self.__bsc, self.__mod_id, byref(name)) return name.value - + @utils.cached - def instances( self ): - instances_len = ULONG(0) + def instances( self ): + instances_len = ULONG(0) instances_ids = pointer( IINST() ) - + if not BSCGetModuleContents( self.__bsc, self.mod_id, enums.MBF.ALL, byref( instances_ids ), byref( instances_len ) ): raise RuntimeError( "Unable to call BSCGetModuleContents" ) - + instances = map( lambda i: self.__bsc.create_instance( instances_ids[i] ) , range( instances_len.value ) ) - - BSCDisposeArray( self.__bsc, instances_ids ) + + BSCDisposeArray( self.__bsc, instances_ids ) return instances class reader_t( object ): @@ -190,14 +198,18 @@ self.logger = utils.loggers.pdb_reader self.logger.setLevel(logging.INFO) - self.__bsc_file = bsc_file + self.__bsc_file = bsc_file self.__bsc = pointer( Bsc() ) if not BSCOpen( self.__bsc_file, byref( self.__bsc ) ): raise RuntimeError( "Unable to open bsc file '%s'" % self.__bsc_file ) - + self.__instances_cache = {} #inst id : instance_t self.__bsc.create_instance = lambda inst_id: self.__create_instance( inst_id ) - + + @utils.cached + def instances(self): + return self.__instances_cache.values() + def __create_instance( self, inst_id ): try: return self.__instances_cache[ inst_id ] @@ -205,9 +217,9 @@ inst = instance_t( inst_id, self.__bsc ) self.__instances_cache[ inst_id ] = inst return inst - + def load_instances( self ): - instances_len = ULONG(0) + instances_len = ULONG(0) instances_ids = pointer( IINST() ) if not BSCGetAllGlobalsArray( self.__bsc, enums.MBF.ALL, byref( instances_ids ), byref( instances_len ) ): @@ -215,35 +227,35 @@ for i in range( instances_len.value ): self.__create_instance( instances_ids[i] ) - - BSCDisposeArray( self.__bsc, instances_ids ) - + + BSCDisposeArray( self.__bsc, instances_ids ) + @utils.cached def is_case_sensitive( self ): return bool( BSCFCaseSensitive( self.__bsc ) ) - + @utils.cached def files(self): - module_ids = pointer( IMOD() ) + module_ids = pointer( IMOD() ) module_len = ULONG() bs = BSC_STAT() - + if not BSCGetAllModulesArray( self.__bsc, module_ids, byref(module_len) ): - raise RuntimeError( "Unable to load all modules" ) - + raise RuntimeError( "Unable to load all modules" ) + modules = map( lambda i: module_t( module_ids[i], self.__bsc ) , range( module_len.value ) ) BSCDisposeArray( self.__bsc, module_ids ) - + return modules - + def print_stat( self ): stat = BSC_STAT() BSCGetStatistics( self.__bsc, byref( stat ) ) for f, t in stat._fields_: print '%s: %s' % ( f, str( getattr( stat, f) ) ) - + def print_classes(self, file_name=None): for m in self.files: if file_name and m.path != file_name: @@ -273,7 +285,7 @@ print '\t\t\tDerived classes:' for derived_class in inst.derived_classes: print '\t\t\t\t', str( derived_class ) - + def __del__( self ): if self.__bsc: BSCClose( self.__bsc ) Added: pygccxml_dev/pygccxml/msvc/common_utils.py =================================================================== --- pygccxml_dev/pygccxml/msvc/common_utils.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/common_utils.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -0,0 +1,57 @@ +import ctypes +import ctypes.wintypes +import config as msvc_cfg + +class UNDECORATE_NAME_OPTIONS: + UNDNAME_COMPLETE = 0x0000 #Enables full undecoration. + UNDNAME_NO_LEADING_UNDERSCORES = 0x0001 #Removes leading underscores from Microsoft extended keywords. + UNDNAME_NO_MS_KEYWORDS = 0x0002 #Disables expansion of Microsoft extended keywords. + UNDNAME_NO_FUNCTION_RETURNS = 0x0004 #Disables expansion of return type for primary declaration. + UNDNAME_NO_ALLOCATION_MODEL = 0x0008 #Disables expansion of the declaration model. + UNDNAME_NO_ALLOCATION_LANGUAGE = 0x0010 #Disables expansion of the declaration language specifier. + UNDNAME_RESERVED1 = 0x0020 #RESERVED. + UNDNAME_RESERVED2 = 0x0040 #RESERVED. + UNDNAME_NO_THISTYPE = 0x0060 #Disables all modifiers on the this type. + UNDNAME_NO_ACCESS_SPECIFIERS = 0x0080 #Disables expansion of access specifiers for members. + UNDNAME_NO_THROW_SIGNATURES = 0x0100 #Disables expansion of "throw-signatures" for functions and pointers to functions. + UNDNAME_NO_MEMBER_TYPE = 0x0200 #Disables expansion of static or virtual members. + UNDNAME_NO_RETURN_UDT_MODEL = 0x0400 #Disables expansion of the Microsoft model for UDT returns. + UNDNAME_32_BIT_DECODE = 0x0800 #Undecorates 32-bit decorated names. + UNDNAME_NAME_ONLY = 0x1000 #Gets only the name for primary declaration; returns just [scope::]name. Expands template params. + UNDNAME_TYPE_ONLY = 0x2000 #Input is just a type encoding; composes an abstract declarator. + UNDNAME_HAVE_PARAMETERS = 0x4000 #The real template parameters are available. + UNDNAME_NO_ECSU = 0x8000 #Suppresses enum/class/struct/union. + UNDNAME_NO_IDENT_CHAR_CHECK = 0x10000 #Suppresses check for valid identifier characters. + UNDNAME_NO_PTR64 = 0x20000 #Does not include ptr64 in output. + +#__unDName definition was taken from: +#http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00754.html +msvcrxx = ctypes.CDLL( msvc_cfg.msvcr_path, mode=ctypes.RTLD_GLOBAL) + +free_type = ctypes.CFUNCTYPE( None, ctypes.c_void_p ) #free type +malloc_type = ctypes.CFUNCTYPE( ctypes.c_void_p, ctypes.c_uint ) #malloc type + + +__unDName = msvcrxx.__unDName +__unDName.argtypes = [ ctypes.c_char_p #undecorated name + , ctypes.c_char_p #decorated name + , ctypes.c_int #sizeof undecorated name + , malloc_type + , free_type + , ctypes.c_ushort #flags + ] +__unDName.restype = ctypes.c_char_p + + +def undecorate_name( name, options=None ): + if options is None: + options = UNDECORATE_NAME_OPTIONS.UNDNAME_NO_ECSU + buffer_size = 1024 * 32 + undecorated_name = ctypes.create_string_buffer('\0' * buffer_size) #should be enouph for any symbol + __unDName( undecorated_name + , name + , buffer_size + , malloc_type( msvcrxx.malloc ) + , free_type( msvcrxx.free ) + , options ) + return undecorated_name.value Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -20,27 +20,3 @@ nsRegularExpression = nsfRegularExpression | nsfCaseSensitive nsCaseInRegularExpression = nsfRegularExpression | nsfCaseInsensitive - -class UndecorateNameOptions: - UNDNAME_COMPLETE = 0x0000 #Enables full undecoration. - UNDNAME_NO_LEADING_UNDERSCORES = 0x0001 #Removes leading underscores from Microsoft extended keywords. - UNDNAME_NO_MS_KEYWORDS = 0x0002 #Disables expansion of Microsoft extended keywords. - UNDNAME_NO_FUNCTION_RETURNS = 0x0004 #Disables expansion of return type for primary declaration. - UNDNAME_NO_ALLOCATION_MODEL = 0x0008 #Disables expansion of the declaration model. - UNDNAME_NO_ALLOCATION_LANGUAGE = 0x0010 #Disables expansion of the declaration language specifier. - UNDNAME_RESERVED1 = 0x0020 #RESERVED. - UNDNAME_RESERVED2 = 0x0040 #RESERVED. - UNDNAME_NO_THISTYPE = 0x0060 #Disables all modifiers on the this type. - UNDNAME_NO_ACCESS_SPECIFIERS = 0x0080 #Disables expansion of access specifiers for members. - UNDNAME_NO_THROW_SIGNATURES = 0x0100 #Disables expansion of "throw-signatures" for functions and pointers to functions. - UNDNAME_NO_MEMBER_TYPE = 0x0200 #Disables expansion of static or virtual members. - UNDNAME_NO_RETURN_UDT_MODEL = 0x0400 #Disables expansion of the Microsoft model for UDT returns. - UNDNAME_32_BIT_DECODE = 0x0800 #Undecorates 32-bit decorated names. - UNDNAME_NAME_ONLY = 0x1000 #Gets only the name for primary declaration; returns just [scope::]name. Expands template params. - UNDNAME_TYPE_ONLY = 0x2000 #Input is just a type encoding; composes an abstract declarator. - UNDNAME_HAVE_PARAMETERS = 0x4000 #The real template parameters are available. - UNDNAME_NO_ECSU = 0x8000 #Suppresses enum/class/struct/union. - UNDNAME_NO_IDENT_CHAR_CHECK = 0x10000 #Suppresses check for valid identifier characters. - UNDNAME_NO_PTR64 = 0x20000 #Does not include ptr64 in output. - - Modified: pygccxml_dev/pygccxml/msvc/pdb/impl_details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -1,7 +1,4 @@ -import ctypes from . import enums -import ctypes.wintypes -from .. import config as msvc_cfg from pygccxml import declarations def guess_class_type( udt_kind ): @@ -73,40 +70,6 @@ __name_splitters[full_name] = splitter return splitter - -#__unDName definition was taken from: -#http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00754.html -msvcrxx = ctypes.CDLL( msvc_cfg.msvcr_path, mode=ctypes.RTLD_GLOBAL) - -free_type = ctypes.CFUNCTYPE( None, ctypes.c_void_p ) #free type -malloc_type = ctypes.CFUNCTYPE( ctypes.c_void_p, ctypes.c_uint ) #malloc type - - -__unDName = msvcrxx.__unDName -__unDName.argtypes = [ ctypes.c_char_p #undecorated name - , ctypes.c_char_p #decorated name - , ctypes.c_int #sizeof undecorated name - , malloc_type - , free_type - , ctypes.c_ushort #flags - ] -__unDName.restype = ctypes.c_char_p - - -def undecorate_name( name, options=None ): - if options is None: - options = enums.UndecorateNameOptions.UNDNAME_NO_ECSU - buffer_size = 1024 * 32 - undecorated_name = ctypes.create_string_buffer('\0' * buffer_size) #should be enouph for any symbol - __unDName( undecorated_name - , name - , buffer_size - , malloc_type( msvcrxx.malloc ) - , free_type( msvcrxx.free ) - , options ) - return undecorated_name.value - - if '__main__' == __name__: name = "boost::detail::is_base_and_derived_impl2<engine_objects::universal_base_t,engine_objects::erroneous_transactions_file_configuration_t>::Host" fnsp = full_name_splitter_t( name ) Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -13,12 +13,19 @@ from ... import utils from ... import declarations from .. import config as msvc_cfg +from .. import common_utils as msvc_utils msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) SymTagEnum = 12 msdia.SymTagEnum = 12 +def iif( condition, true_value, false_value ): + if condition: + return true_value + else: + return false_value + def as_symbol( x ): return ctypes.cast( x, ctypes.POINTER( msdia.IDiaSymbol ) ) @@ -38,6 +45,7 @@ print 'File: ', f.fileName class decl_loader_t(object): + COMPILER = 'MSVC PDB' def __init__(self, pdb_file_path ): self.logger = utils.loggers.pdb_reader self.logger.setLevel(logging.INFO) @@ -74,7 +82,7 @@ if not smbl.name: return else: - return impl_details.undecorate_name( smbl.name ) + return msvc_utils.undecorate_name( smbl.name ) #~ for ch in '@?$': #~ if ch in smbl.name: #~ return impl_details.undecorate_name( smbl.name ) @@ -297,7 +305,10 @@ def __create_class( self, class_smbl ): name_splitter = impl_details.get_name_splitter( class_smbl.uname ) class_decl = declarations.class_t( name_splitter.name ) + class_decl.compiler = self.COMPILER + class_decl.dia_symbols = [class_smbl] class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.dia_symbols = [class_smbl] class_decl.byte_size = class_smbl.length + class_decl.mangled = iif( class_smbl.name, class_smbl.name, '' ) + class_decl.demangled = iif( class_smbl.uname, class_smbl.uname, '' ) return class_decl Modified: pygccxml_dev/unittests/bsc_tester.py =================================================================== --- pygccxml_dev/unittests/bsc_tester.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/unittests/bsc_tester.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -7,20 +7,27 @@ class tester_t( unittest.TestCase ): def __init__(self, *args): unittest.TestCase.__init__(self, *args) + self.bsc_file = os.path.join( autoconfig.data_directory + , 'msvc_build' + , 'Debug' + , 'msvc_build.bsc' ) def test(self): - control_bsc = os.path.join( autoconfig.data_directory, r'xxx.bsc' ) - reader = bsc.reader_t( control_bsc ) + reader = bsc.reader_t( self.bsc_file ) reader.print_stat() print 'is_case_sensitive', reader.is_case_sensitive reader.load_instances() - print 'done' - #reader.files + #reader.files #reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') + names = [] + for inst in reader.instances: + names.append( '{%s}<=====>{%s}' % ( inst.name, inst.mangled_name ) ) + names.sort() + for name in names: + print name - def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -28,4 +35,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-03-25 21:34:35 UTC (rev 1291) +++ pygccxml_dev/unittests/pdb_tester.py 2008-03-26 20:36:42 UTC (rev 1292) @@ -39,6 +39,12 @@ reader.read() #f = file( 'decls.cpp', 'w+' ) #declarations.print_declarations( reader.global_ns )#, writer=f.write ) + names = [] + for d in reader.global_ns.classes(): + names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) + names.sort() + for name in names: + print name #f.close() def test_undecorate_name(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-04-05 06:42:02
|
Revision: 1296 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1296&view=rev Author: roman_yakovenko Date: 2008-04-04 23:42:06 -0700 (Fri, 04 Apr 2008) Log Message: ----------- another set of improvements to PDB module Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/common_utils.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj pygccxml_dev/unittests/declarations_tester.py pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/msvc/common_utils.py =================================================================== --- pygccxml_dev/pygccxml/msvc/common_utils.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/pygccxml/msvc/common_utils.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -24,6 +24,17 @@ UNDNAME_NO_IDENT_CHAR_CHECK = 0x10000 #Suppresses check for valid identifier characters. UNDNAME_NO_PTR64 = 0x20000 #Does not include ptr64 in output. + UNDNAME_SCOPES_ONLY = UNDNAME_NO_LEADING_UNDERSCORES \ + | UNDNAME_NO_MS_KEYWORDS \ + | UNDNAME_NO_FUNCTION_RETURNS \ + | UNDNAME_NO_ALLOCATION_MODEL \ + | UNDNAME_NO_ALLOCATION_LANGUAGE \ + | UNDNAME_NO_ACCESS_SPECIFIERS \ + | UNDNAME_NO_THROW_SIGNATURES \ + | UNDNAME_NO_MEMBER_TYPE \ + | UNDNAME_NO_ECSU \ + | UNDNAME_NO_IDENT_CHAR_CHECK + #__unDName definition was taken from: #http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00754.html msvcrxx = ctypes.CDLL( msvc_cfg.msvcr_path, mode=ctypes.RTLD_GLOBAL) @@ -44,6 +55,8 @@ def undecorate_name( name, options=None ): + if not name: + return '' if options is None: options = UNDECORATE_NAME_OPTIONS.UNDNAME_NO_ECSU buffer_size = 1024 * 32 Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -78,20 +78,9 @@ @utils.cached def symbols(self): - def get_name( smbl ): - if not smbl.name: - return - else: - return msvc_utils.undecorate_name( smbl.name ) - #~ for ch in '@?$': - #~ if ch in smbl.name: - #~ return impl_details.undecorate_name( smbl.name ) - #~ else: - #~ return smbl.name - smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): - smbl.uname = get_name( smbl ) + smbl.uname = msvc_utils.undecorate_name( smbl.name, msvc_utils.UNDECORATE_NAME_OPTIONS.UNDNAME_SCOPES_ONLY ) smbls[ smbl.symIndexId ] = smbl return smbls @@ -148,7 +137,11 @@ if index and ( index % 10000 == 0 ): self.logger.debug( '%d symbols scanned', index ) name_splitter = impl_details.get_name_splitter( smbl.uname ) - names.update( name_splitter.scope_names ) + for sn in name_splitter.scope_names: + if '<' in sn: + break + else: + names.add( sn ) names = list( names ) names.sort() self.logger.debug( 'looking for scopes - done' ) @@ -157,37 +150,58 @@ self.logger.debug( 'building namespace objects' ) for ns_name in itertools.ifilterfalse( self.__find_udt, names ): + self.logger.debug( 'inserting ns "%s" into declarations tree', ns_name ) name_splitter = impl_details.get_name_splitter( ns_name ) if not name_splitter.scope_names: parent_ns = self.global_ns else: - parent_ns = nss[ name_splitter.scope_names[-1] ] + parent_ns = nss.get( name_splitter.scope_names[-1], None ) + if not parent_ns: + continue #in this case the parent scope is UDT ns_decl = declarations.namespace_t( name_splitter.name ) parent_ns.adopt_declaration( ns_decl ) nss[ ns_name ] = ns_decl + self.logger.debug( 'inserting ns "%s" into declarations tree - done', ns_name ) self.logger.debug( 'building namespace objects - done' ) self.logger.debug( 'scanning symbols table - done' ) - def __add_class( self, parent, class_decl ): - class_smbl = class_decl.dia_symbols[0] - already_added = parent.classes( class_decl.name, recursive=False, allow_empty=True ) + def __update_decls_tree( self, decl ): + smbl = decl.dia_symbols[0] + name_splitter = impl_details.get_name_splitter( smbl.uname ) + if not name_splitter.scope_names: + self.__adopt_declaration( self.global_ns, decl ) + else: + parent_name = '::' + name_splitter.scope_names[-1] + try: + parent = self.global_ns.decl( parent_name ) + except: + declarations.print_declarations( self.global_ns ) + print 'identifiers:' + for index, identifier in enumerate(name_splitter.identifiers): + print index, ':', identifier + raise + self.__adopt_declaration( parent, decl ) + + def __adopt_declaration( self, parent, decl ): + smbl = decl.dia_symbols[0] + already_added = parent.decls( decl.name, decl_type=decl.__class__, recursive=False, allow_empty=True ) if not already_added: if isinstance( parent, declarations.namespace_t ): - parent.adopt_declaration( class_decl ) + parent.adopt_declaration( decl ) else: - parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) else: - for decl in already_added: - for smbl in decl.dia_symbols: - if self.__are_symbols_equivalent( smbl, class_smbl ): - decl.dia_symbols.append( class_smbl ) + for other_decl in already_added: + for other_smbl in other_decl.dia_symbols: + if self.__are_symbols_equivalent( other_smbl, smbl ): + other_decl.dia_symbols.append( smbl ) return else: if isinstance( parent, declarations.namespace_t ): - parent.adopt_declaration( class_decl ) + parent.adopt_declaration( decl ) else: - parent.adopt_declaration( class_decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) def __load_classes( self ): classes = {}#unique symbol id : class decl @@ -211,33 +225,25 @@ , allow_empty=True , recursive=True ) return bool( found ) - self.logger.info( 'integrating udt objects with namespaces' ) while classes: + to_be_integrated = len( classes ) self.logger.info( 'there are %d classes to go', len( classes ) ) to_be_deleted = filter( does_parent_exist_in_decls_tree, classes.itervalues() ) - for ns_class in to_be_deleted: - udt_smbl = ns_class.dia_symbols[0] - name_splitter = impl_details.get_name_splitter( udt_smbl.uname ) - if not name_splitter.scope_names: - self.__add_class( self.global_ns, ns_class ) - else: - parent_name = '::' + name_splitter.scope_names[-1] - try: - parent = self.global_ns.decl( parent_name ) - except: - declarations.print_declarations( self.global_ns ) - print 'identifiers:' - for index, identifier in enumerate(name_splitter.identifiers): - print index, ':', identifier - raise - self.__add_class( parent, ns_class ) - del classes[ ns_class.dia_symbols[0].symIndexId ] + map( self.__update_decls_tree, to_be_deleted ) + map( lambda decl: classes.pop( decl.dia_symbols[0].symIndexId ) + , to_be_deleted ) + integrated = to_be_integrated - len( classes ) + if not integrated: + for cls in classes.itervalues(): + self.logger.debug( 'unable to integrate class "%s"', cls.dia_symbols[0].uname ) + break self.logger.info( 'integrating udt objects with namespaces - done' ) def read(self): self.__load_nss() self.__load_classes() + self.__load_enums() @property def dia_global_scope(self): @@ -277,12 +283,29 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None + def __load_enums( self ): + is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum + self.logger.info( 'building enum objects' ) + enums_count = 0 + for enum_smbl in itertools.ifilter( is_enum, self.symbols.itervalues() ): + enum_decl = self.__create_enum(enum_smbl) + if not enum_decl: + continue + enums_count += 1 + self.__update_decls_tree( enum_decl ) + self.logger.info( 'building enum objects(%d) - done', enums_count ) + def __update_decl_binary_names( self, decl, smbl ): + decl.mangled = iif( smbl.name, smbl.name, '' ) + decl.demangled = iif( smbl.uname, smbl.uname, '' ) + def __create_enum( self, enum_smbl ): - name_splitter = impl_details.get_name_splitter( enum_smbl.name ) + name_splitter = impl_details.get_name_splitter( enum_smbl.uname ) + self.logger.debug( 'working on enum %s', enum_smbl.uname ) enum_decl = declarations.enumeration_t( name_splitter.name ) - enum_decl.dia_symbols = [ enum_smbl.symIndexId ] + enum_decl.dia_symbols = [ enum_smbl ] enum_decl.byte_size = enum_smbl.length + self.__update_decl_binary_names( enum_decl, enum_smbl ) values = enum_smbl.findChildren( msdia.SymTagData, None, 0 ) for v in itertools.imap(as_symbol, values): if v.classParent.symIndexId != enum_smbl.symIndexId: @@ -309,6 +332,5 @@ class_decl.dia_symbols = [class_smbl] class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) class_decl.byte_size = class_smbl.length - class_decl.mangled = iif( class_smbl.name, class_smbl.name, '' ) - class_decl.demangled = iif( class_smbl.uname, class_smbl.uname, '' ) + self.__update_decl_binary_names( class_decl, class_smbl ) return class_decl Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/autoconfig.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -46,6 +46,22 @@ , define_symbols=[ gccxml_version ] , compiler=compiler ) + pdb_loader = None + + @staticmethod + def get_pdb_loader(): + if not cxx_parsers_cfg.pdb_loader: + from pygccxml.msvc import pdb + pdb_file = os.path.join( data_directory, 'msvc_build', 'Debug', 'msvc_build.pdb' ) + cxx_parsers_cfg.pdb_loader = pdb.decl_loader_t( pdb_file ) + cxx_parsers_cfg.pdb_loader.read() + return cxx_parsers_cfg.pdb_loader + + +def get_pdb_global_ns(): + return cxx_parsers_cfg.get_pdb_loader().global_ns + + #~ try: #~ import pydsc #~ pydsc.include( r'D:\pygccxml_sources\sources\pygccxml_dev' ) Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-05 06:42:06 UTC (rev 1296) @@ -41,3 +41,7 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" +void use_decls(){ + declarations::enums::ENumbers enumbers; + declarations::enums::data::EColor ecolor; +} \ No newline at end of file Modified: pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj =================================================================== --- pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-05 06:42:06 UTC (rev 1296) @@ -20,7 +20,7 @@ Name="Debug|Win32" OutputDirectory="$(SolutionDir)$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="4" + ConfigurationType="2" CharacterSet="1" > <Tool @@ -41,6 +41,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" + InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\" PreprocessorDefinitions="WIN32;_DEBUG;_LIB" MinimalRebuild="true" @@ -63,12 +64,18 @@ Name="VCPreLinkEventTool" /> <Tool - Name="VCLibrarianTool" + Name="VCLinkerTool" + GenerateDebugInformation="true" + GenerateMapFile="true" + MapExports="true" /> <Tool Name="VCALinkTool" /> <Tool + Name="VCManifestTool" + /> + <Tool Name="VCXDCMakeTool" ValidateIntelliSense="true" /> @@ -79,6 +86,9 @@ Name="VCFxCopTool" /> <Tool + Name="VCAppVerifierTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/declarations_tester.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -import pprint +import pprint import unittest import autoconfig import parser_test_case @@ -13,22 +13,11 @@ from pygccxml.parser import * from pygccxml.declarations import * + class declarations_t( parser_test_case.parser_test_case_t ): - global_ns = None def __init__(self, *args ): parser_test_case.parser_test_case_t.__init__( self, *args ) - self.test_files = [ 'declarations_enums.hpp' - , 'declarations_variables.hpp' - , 'declarations_calldef.hpp' - ] self.global_ns = None - - def setUp(self): - if not declarations_t.global_ns: - decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) - declarations_t.global_ns = get_global_namespace( decls ) - if not self.global_ns: - self.global_ns = declarations_t.global_ns def test_enumeration_t(self): enum = self.global_ns.enum( 'ENumbers' ) @@ -47,13 +36,13 @@ def test_variables(self): variables = self.global_ns.namespace( 'variables' ) initialized = self.global_ns.variable( name='initialized' ) - + expected_value = None if '0.9' in initialized.compiler: expected_value = '10122004ul' else: expected_value = '10122004' - + self.failUnless( initialized.value == expected_value , "there is a difference between expected value( %s ) and real value(%s) of 'initialized' variable" \ % ( expected_value, initialized.value ) ) @@ -147,7 +136,7 @@ #there is nothing to check about constructors - I know the implementation of parser #In this case it doesn't different from any other function - def test_operator_symbol(self): + def test_operator_symbol(self): calldefs_operators = ['=', '==' ] calldefs_cast_operators = ['char *', 'double'] struct_calldefs = self.global_ns.class_( 'calldefs_t') @@ -168,22 +157,45 @@ self.failUnless( do_smth.has_ellipsis ) do_smth_else = ns.free_fun( 'do_smth_else' ) self.failUnless( do_smth_else.has_ellipsis ) - -class all_at_once_tester_t( declarations_t ): +class gccxml_declarations_t( declarations_t ): + global_ns = None + def __init__(self, *args ): + declarations_t.__init__( self, *args ) + self.test_files = [ 'declarations_enums.hpp' + , 'declarations_variables.hpp' + , 'declarations_calldef.hpp' + ] + self.global_ns = None + + def setUp(self): + if not gccxml_declarations_t.global_ns: + decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) + gccxml_declarations_t.global_ns = get_global_namespace( decls ) + if not self.global_ns: + self.global_ns = gccxml_declarations_t.global_ns + +class all_at_once_tester_t( gccxml_declarations_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE def __init__(self, *args): - declarations_t.__init__(self, *args) + gccxml_declarations_t.__init__(self, *args) -class file_by_file_tester_t( declarations_t ): +class file_by_file_tester_t( gccxml_declarations_t ): COMPILATION_MODE = COMPILATION_MODE.FILE_BY_FILE def __init__(self, *args): - declarations_t.__init__(self, *args) + gccxml_declarations_t.__init__(self, *args) +class pdb_based_tester_t( declarations_t ): + def __init__(self, *args ): + declarations_t.__init__( self, *args ) + self.global_ns = autoconfig.get_pdb_global_ns() + def create_suite(): - suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(file_by_file_tester_t)) - suite.addTest( unittest.makeSuite(all_at_once_tester_t)) + suite = unittest.TestSuite() + #~ suite.addTest( unittest.makeSuite(file_by_file_tester_t)) + #~ suite.addTest( unittest.makeSuite(all_at_once_tester_t)) + suite.addTest( unittest.makeSuite(pdb_based_tester_t)) + return suite def run_suite(): Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-04-04 19:35:03 UTC (rev 1295) +++ pygccxml_dev/unittests/pdb_tester.py 2008-04-05 06:42:06 UTC (rev 1296) @@ -4,6 +4,7 @@ from pygccxml.msvc import pdb from pygccxml import declarations +from pygccxml.msvc import common_utils as msvc_utils class tester_t( unittest.TestCase ): def __init__(self, *args): @@ -38,13 +39,14 @@ print reader.symbols_table.name reader.read() #f = file( 'decls.cpp', 'w+' ) - #declarations.print_declarations( reader.global_ns )#, writer=f.write ) - names = [] - for d in reader.global_ns.classes(): - names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) - names.sort() - for name in names: - print name + declarations.print_declarations( reader.global_ns )#, writer=f.write ) + + #~ names = [] + #~ for d in reader.global_ns.classes(): + #~ names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) + #~ names.sort() + #~ f6or name in names: + #~ print name #f.close() def test_undecorate_name(self): @@ -62,7 +64,7 @@ for decorated, undecorated in data: #~ print '\n', pdb.impl_details.undecorate_name( decorated ) #~ print undecorated - self.failUnless( pdb.impl_details.undecorate_name( decorated ) == undecorated ) + self.failUnless( msvc_utils.undecorate_name( decorated ) == undecorated ) def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-04-09 20:52:28
|
Revision: 1308 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1308&view=rev Author: roman_yakovenko Date: 2008-04-09 13:52:33 -0700 (Wed, 09 Apr 2008) Log Message: ----------- adding treatment for variables Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/impl_details.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/bsc_tester.py pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -12,12 +12,14 @@ from ... import declarations from .. import config as msvc_cfg -comtypes_client_gen_dir = comtypes.client.gen_dir -try: - comtypes.client.gen_dir = None - msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) -finally: - comtypes.client.gen_dir = comtypes_client_gen_dir +msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) +#~ comtypes_client_gen_dir = comtypes.client.gen_dir +#~ try: + #~ comtypes.client.gen_dir = None + #~ msdia = comtypes.client.GetModule( msvc_cfg.msdia_path ) +#~ finally: + #~ comtypes.client.gen_dir = comtypes_client_gen_dir + from loader import decl_loader_t Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -1,11 +1,35 @@ +from ... import utils #import utils from pygccxml package + +class BasicType(utils.enum): + btNoType = 0 + btVoid = 1 + btChar = 2 + btWChar = 3 + btInt = 6 + btUInt = 7 + btFloat = 8 + btBCD = 9 + btBool = 1 + btLong = 1 + btULong = 1 + btCurrency = 2 + btDate = 2 + btVariant = 2 + btComplex = 2 + btBit = 2 + btBSTR = 3 + btHresult = 31 + + + #Adding code, that was not generated for some reason. -class UdtKind: +class UdtKind(utils.enum): UdtStruct, UdtClass, UdtUnion = (0, 1, 2) -class CV_access_e: +class CV_access_e(utils.enum): CV_private, CV_protected, CV_public = (1, 2, 3) -class NameSearchOptions: +class NameSearchOptions(utils.enum): nsNone = 0 nsfCaseSensitive = 0x1 nsfCaseInsensitive = 0x2 Modified: pygccxml_dev/pygccxml/msvc/pdb/impl_details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/impl_details.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -9,14 +9,6 @@ else: return declarations.CLASS_TYPES.UNION -def guess_access_type( access_type ): - if enums.CV_access_e.CV_private == access_type: - return declarations.ACCESS_TYPES.PRIVATE - elif enums.CV_access_e.CV_protected == access_type: - return declarations.ACCESS_TYPES.PROTECTED - else: - return declarations.ACCESS_TYPES.PUBLIC - class full_name_splitter_t( object ): def __init__( self, full_name ): self.__full_name = full_name Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -72,6 +72,49 @@ else: return None + def create_type( self, smbl ): + if msdia.SymTagBaseType == smbl.symTag: + if enums.BasicType.btNoType == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btVoid == smbl.baseType: + return declarations.void_t() + elif enums.BasicType.btChar == smbl.baseType: + return declarations.char_t() + elif enums.BasicType.btWChar == smbl.baseType: + return declarations.wchar_t() + elif enums.BasicType.btInt == smbl.baseType: + return declarations.int_t() + elif enums.BasicType.btUInt == smbl.baseType: + return declarations.unsigned_int_t() + elif enums.BasicType.btFloat == smbl.baseType: + return declarations.float_t() + elif enums.BasicType.btBCD == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btBool == smbl.baseType: + return declarations.bool_t() + elif enums.BasicType.btLong == smbl.baseType: + return declarations.long_int_t() + elif enums.BasicType.btULong == smbl.baseType: + return declarations.long_unsigned_int_t() + elif enums.BasicType.btCurrency == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btDate == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btVariant == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btComplex == smbl.baseType: + return declarations.complex_double_t() + elif enums.BasicType.btBit == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btBSTR == smbl.baseType: + return declarations.unknown_t() + elif enums.BasicType.btHresult == smbl.baseType: + return declarations.unknown_t() + else: + return declarations.unknown_t() + else: + return declarations.unknown_t() + @utils.cached def symbols_table(self): return self.__find_table( "Symbols" ) @@ -81,6 +124,9 @@ smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): smbl.uname = msvc_utils.undecorate_name( smbl.name, msvc_utils.UNDECORATE_NAME_OPTIONS.UNDNAME_SCOPES_ONLY ) + def smbl_undecorate_name( options = None ): + return msvc_utils.undecorate_name( smbl.name, options ) + smbl.undecorate_name = smbl_undecorate_name smbls[ smbl.symIndexId ] = smbl return smbls @@ -89,24 +135,26 @@ self.logger.debug( '__load_ns.ns_filter, %s', smbl.uname ) tags = ( msdia.SymTagFunction , msdia.SymTagBlock - #I should skipp data, because it requier different treatment - #, msdia.SymTagData - , msdia.SymTagAnnotation - , msdia.SymTagPublicSymbol + , msdia.SymTagData + #~ , msdia.SymTagAnnotation + #~ , msdia.SymTagPublicSymbol , msdia.SymTagUDT , msdia.SymTagEnum - , msdia.SymTagFunctionType - , msdia.SymTagPointerType + #~ , msdia.SymTagFunctionType + #~ , msdia.SymTagPointerType , msdia.SymTagArrayType , msdia.SymTagBaseType , msdia.SymTagTypedef , msdia.SymTagBaseClass , msdia.SymTagFriend - , msdia.SymTagFunctionArgType - , msdia.SymTagUsingNamespace ) + #~ , msdia.SymTagFunctionArgType + #~ , msdia.SymTagUsingNamespace + ) if smbl.symTag not in tags: self.logger.debug( 'smbl.symTag not in tags, %s', smbl.uname ) return False + elif smbl.symTag == msdia.SymTagData and not self.__is_my_var( smbl ): + return False elif not smbl.name: self.logger.debug( 'not smbl.name, %s', smbl.uname ) return False @@ -190,7 +238,7 @@ if isinstance( parent, declarations.namespace_t ): parent.adopt_declaration( decl ) else: - parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) else: for other_decl in already_added: for other_smbl in other_decl.dia_symbols: @@ -201,8 +249,22 @@ if isinstance( parent, declarations.namespace_t ): parent.adopt_declaration( decl ) else: - parent.adopt_declaration( decl, declarations.ACCESS_TYPES.PUBLIC ) + parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) + def __guess_access_type( self, smbl ): + if enums.CV_access_e.CV_private == smbl.access: + return declarations.ACCESS_TYPES.PRIVATE + elif enums.CV_access_e.CV_protected == smbl.access: + return declarations.ACCESS_TYPES.PROTECTED + else: + fully_undecorated_name = smbl.undecorate_name() + if fully_undecorated_name.startswith( 'private:' ): + declarations.ACCESS_TYPES.PRIVATE + elif fully_undecorated_name.startswith( 'protected:' ): + declarations.ACCESS_TYPES.PROTECTED + else: + return declarations.ACCESS_TYPES.PUBLIC + def __load_classes( self ): classes = {}#unique symbol id : class decl is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT @@ -233,10 +295,9 @@ map( self.__update_decls_tree, to_be_deleted ) map( lambda decl: classes.pop( decl.dia_symbols[0].symIndexId ) , to_be_deleted ) - integrated = to_be_integrated - len( classes ) - if not integrated: + if not ( to_be_integrated - len( classes ) ): for cls in classes.itervalues(): - self.logger.debug( 'unable to integrate class "%s"', cls.dia_symbols[0].uname ) + self.logger.warning( 'unable to integrate class "%s" into declarations tree', cls.dia_symbols[0].uname ) break self.logger.info( 'integrating udt objects with namespaces - done' ) @@ -244,6 +305,7 @@ self.__load_nss() self.__load_classes() self.__load_enums() + self.__load_vars() @property def dia_global_scope(self): @@ -283,6 +345,13 @@ self.logger.debug( 'name( "%s" ) is **NOT** UDT symbol' % name ) return None + def __update_decl( self, decl, smbl ): + decl.dia_symbols = [smbl] + decl.compiler = self.COMPILER + decl.byte_size = smbl.length + decl.mangled = iif( smbl.name, smbl.name, '' ) + decl.demangled = iif( smbl.uname, smbl.uname, '' ) + def __load_enums( self ): is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum self.logger.info( 'building enum objects' ) @@ -295,17 +364,12 @@ self.__update_decls_tree( enum_decl ) self.logger.info( 'building enum objects(%d) - done', enums_count ) - def __update_decl_binary_names( self, decl, smbl ): - decl.mangled = iif( smbl.name, smbl.name, '' ) - decl.demangled = iif( smbl.uname, smbl.uname, '' ) - def __create_enum( self, enum_smbl ): name_splitter = impl_details.get_name_splitter( enum_smbl.uname ) self.logger.debug( 'working on enum %s', enum_smbl.uname ) enum_decl = declarations.enumeration_t( name_splitter.name ) - enum_decl.dia_symbols = [ enum_smbl ] - enum_decl.byte_size = enum_smbl.length - self.__update_decl_binary_names( enum_decl, enum_smbl ) + self.__update_decl( enum_decl, enum_smbl ) + values = enum_smbl.findChildren( msdia.SymTagData, None, 0 ) for v in itertools.imap(as_symbol, values): if v.classParent.symIndexId != enum_smbl.symIndexId: @@ -319,18 +383,44 @@ #between those cases return None - def __create_typedef( self, typedef_smbl ): - name_splitter = impl_details.get_name_splitter( typedef_smbl.name ) - typedef_decl = declarations.typedef_t( name_splitter.name ) - typedef_decl.dia_symbols = [ typedef_smbl.symIndexId ] - return typedef_decl - def __create_class( self, class_smbl ): name_splitter = impl_details.get_name_splitter( class_smbl.uname ) class_decl = declarations.class_t( name_splitter.name ) - class_decl.compiler = self.COMPILER - class_decl.dia_symbols = [class_smbl] + self.__update_decl( class_decl, class_smbl ) class_decl.class_type = impl_details.guess_class_type(class_smbl.udtKind) - class_decl.byte_size = class_smbl.length - self.__update_decl_binary_names( class_decl, class_smbl ) return class_decl + + def __is_my_var( self, smbl ): + #I am only interested in global and class variables + if smbl.symTag != msdia.SymTagData: + return False + if smbl.classParentId not in self.symbols: + return True #global scope + parent_smbl = self.symbols[ smbl.classParentId ] + return bool( parent_smbl.symTag == msdia.SymTagUDT ) + + def __load_vars( self ): + self.logger.info( 'building variable objects' ) + vars_count = 0 + for var_smbl in itertools.ifilter( self.__is_my_var, self.symbols.itervalues() ): + var_decl = self.__create_var(var_smbl) + if not var_decl: + continue + vars_count += 1 + self.__update_decls_tree( var_decl ) + self.logger.info( 'building variable objects(%d) - done', vars_count ) + + def __create_var( self, var_smbl ): + self.logger.debug( 'creating variable "%s"', var_smbl.uname ) + name_splitter = impl_details.get_name_splitter( var_smbl.uname ) + if not name_splitter.name: + return None + var_decl = declarations.variable_t( name_splitter.name ) + self.__update_decl( var_decl, var_smbl ) + + var_decl.type = self.create_type( var_smbl.type ) + self.logger.debug( 'creating variable "%s" - done', var_smbl.uname ) + return var_decl + + + Modified: pygccxml_dev/unittests/bsc_tester.py =================================================================== --- pygccxml_dev/unittests/bsc_tester.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/bsc_tester.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -18,13 +18,13 @@ print 'is_case_sensitive', reader.is_case_sensitive reader.load_instances() #reader.files - #reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') - names = [] - for inst in reader.instances: - names.append( '{%s}<=====>{%s}' % ( inst.name, inst.mangled_name ) ) - names.sort() - for name in names: - print name + reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') + #~ names = [] + #~ for inst in reader.instances: + #~ names.append( '{%s}<=====>{%s}' % ( inst.name, inst.mangled_name ) ) + #~ names.sort() + #~ for name in names: + #~ print name def create_suite(): suite = unittest.TestSuite() Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 20:52:33 UTC (rev 1308) @@ -41,7 +41,7 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" -void use_decls(){ - declarations::enums::ENumbers enumbers; - declarations::enums::data::EColor ecolor; +void use_decls(){ + declarations::enums::ENumbers enumbers; + declarations::enums::data::EColor ecolor; } \ No newline at end of file Modified: pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj =================================================================== --- pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-09 20:52:33 UTC (rev 1308) @@ -41,7 +41,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - InlineFunctionExpansion="1" + InlineFunctionExpansion="0" AdditionalIncludeDirectories="..\" PreprocessorDefinitions="WIN32;_DEBUG;_LIB" MinimalRebuild="true" @@ -52,7 +52,7 @@ GenerateXMLDocumentationFiles="true" BrowseInformation="1" WarningLevel="3" - DebugInformationFormat="3" + DebugInformationFormat="4" /> <Tool Name="VCManagedResourceCompilerTool" Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-04-09 17:10:03 UTC (rev 1307) +++ pygccxml_dev/unittests/pdb_tester.py 2008-04-09 20:52:33 UTC (rev 1308) @@ -38,8 +38,12 @@ reader = pdb.decl_loader_t( self.pdb_file ) print reader.symbols_table.name reader.read() - #f = file( 'decls.cpp', 'w+' ) - declarations.print_declarations( reader.global_ns )#, writer=f.write ) + x = [] + declarations.print_declarations( reader.global_ns, writer=x.append ) + x = filter( None, map( lambda l: l.rstrip(), x ) ) + f = file( 'decls.cpp', 'w+' ) + f.write( os.linesep.join( x ) ) + f.close() #~ names = [] #~ for d in reader.global_ns.classes(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-04-12 07:52:28
|
Revision: 1309 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1309&view=rev Author: roman_yakovenko Date: 2008-04-12 00:52:34 -0700 (Sat, 12 Apr 2008) Log Message: ----------- adding support for basic types Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/unittests/data/declarations_variables.hpp pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/declarations_tester.py Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -18,19 +18,19 @@ std_namespaces = ( 'std', 'stdext', '__gnu_cxx' ) -class defaults_eraser: +class defaults_eraser: @staticmethod def normalize( type_str ): return type_str.replace( ' ', '' ) @staticmethod def replace_basic_string( cls_name ): - strings = { + strings = { 'std::string' : ( 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >' , 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' ) , 'std::wstring' : ( 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >' , 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >' ) } - + new_name = cls_name for short_name, long_names in strings.iteritems(): for lname in long_names: @@ -59,13 +59,13 @@ return answer @staticmethod - def erase_call( cls_name ): - global find_container_traits + def erase_call( cls_name ): + global find_container_traits c_traits = find_container_traits( cls_name ) - if not c_traits: + if not c_traits: return cls_name return c_traits.remove_defaults( cls_name ) - + @staticmethod def erase_recursive( cls_name ): ri = defaults_eraser.recursive_impl @@ -85,7 +85,7 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 2 != len( c_args ): - return + return value_type = c_args[0] tmpl = string.Template( "$container< $value_type, $allocator<$value_type> >" ) tmpl = tmpl.substitute( container=c_name, value_type=value_type, allocator=default_allocator ) @@ -97,37 +97,37 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 2 != len( c_args ): - return + return value_type = c_args[0] - dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) if defaults_eraser.normalize( dc_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_container_name, [value_type] ) ): - return - return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) + return + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) @staticmethod def erase_container_compare( cls_name, default_container_name='std::vector', default_compare='std::less' ): cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 3 != len( c_args ): - return - dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + return + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) if defaults_eraser.normalize( dc_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_container_name, [c_args[0]] ) ): - return - dcomp_no_defaults = defaults_eraser.erase_recursive( c_args[2] ) + return + dcomp_no_defaults = defaults_eraser.erase_recursive( c_args[2] ) if defaults_eraser.normalize( dcomp_no_defaults ) \ != defaults_eraser.normalize( templates.join( default_compare, [c_args[0]] ) ): - return + return value_type = defaults_eraser.erase_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + return templates.join( c_name, [value_type] ) @staticmethod def erase_compare_allocator( cls_name, default_compare='std::less', default_allocator='std::allocator' ): cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 3 != len( c_args ): - return + return value_type = c_args[0] tmpl = string.Template( "$container< $value_type, $compare<$value_type>, $allocator<$value_type> >" ) tmpl = tmpl.substitute( container=c_name @@ -142,10 +142,10 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if 4 != len( c_args ): - return - key_type = c_args[0] + return + key_type = c_args[0] mapped_type = c_args[1] - tmpls = [ + tmpls = [ string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< const $key_type, $mapped_type> > >" ) , string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< $key_type const, $mapped_type> > >" ) , string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< $key_type, $mapped_type> > >" )] @@ -166,7 +166,7 @@ cls_name = defaults_eraser.replace_basic_string( cls_name ) c_name, c_args = templates.split( cls_name ) if len( c_args ) < 3: - return + return default_hash=None default_less='std::less' @@ -181,8 +181,8 @@ default_hash='hash' tmpl = "$container< $value_type, $hash<$value_type >, $equal_to<$value_type >, $allocator<$value_type> >" else: - return - + return + value_type = c_args[0] tmpl = string.Template( tmpl ) for ns in std_namespaces: @@ -205,16 +205,16 @@ default_less='std::less' default_allocator='std::allocator' default_equal_to = 'std::equal_to' - - tmpl = None + + tmpl = None key_type = None mapped_type = None if 2 < len( c_args ): - key_type = c_args[0] + key_type = c_args[0] mapped_type = c_args[1] else: return - + if 4 == len( c_args ): default_hash = 'hash_compare' tmpl = string.Template( "$container< $key_type, $mapped_type, $hash<$key_type, $less<$key_type> >, $allocator< std::pair< const $key_type, $mapped_type> > >" ) @@ -312,23 +312,25 @@ % ( self.name, cls.decl_string ) ) return ref - + def create_traits_class( container_name , element_type_index , element_type_typedef , remove_defaults_=None ): """ creates concrete container traits class """ + impl_tmp = container_traits_impl_t( container_name, element_type_index, element_type_typedef ) + class xxx_traits: """extract information from the container""" - impl = container_traits_impl_t( container_name, element_type_index, element_type_typedef ) - + impl = None + @staticmethod def name(): return xxx_traits.impl.name - + @staticmethod def is_my_case( type ): """returns True if type is the container class, otherwise False""" @@ -345,19 +347,22 @@ return xxx_traits.impl.element_type( type ) @staticmethod - def remove_defaults( type_or_string ): - name = None + def remove_defaults( type_or_string ): + name = None if not isinstance( type_or_string, types.StringTypes ): name = xxx_traits.class_declaration( type_or_string ).name else: name = type_or_string if not remove_defaults_: - return name + return name no_defaults = remove_defaults_( name ) if not no_defaults: return name else: return no_defaults + + xxx_traits.impl = impl_tmp + return xxx_traits list_traits = create_traits_class( 'list', 0, 'value_type', defaults_eraser.erase_allocator ) @@ -394,25 +399,25 @@ , map_traits , multimap_traits , hash_map_traits - , hash_multimap_traits + , hash_multimap_traits , set_traits - , hash_set_traits + , hash_set_traits , multiset_traits , hash_multiset_traits ) -"""tuple of all STD container traits classes""" - +"""tuple of all STD container traits classes""" + def find_container_traits( cls_or_string ): if isinstance( cls_or_string, types.StringTypes ): if not templates.is_instantiation( cls_or_string ): - return None + return None name = templates.name( cls_or_string ) if name.startswith( 'std::' ): name = name[ len( 'std::' ): ] - for cls_traits in container_traits: + for cls_traits in container_traits: if cls_traits.name() == name: - return cls_traits + return cls_traits else: - for cls_traits in container_traits: + for cls_traits in container_traits: if cls_traits.is_my_case( cls_or_string ): return cls_traits Modified: pygccxml_dev/pygccxml/msvc/pdb/enums.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/msvc/pdb/enums.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -9,19 +9,20 @@ btUInt = 7 btFloat = 8 btBCD = 9 - btBool = 1 - btLong = 1 - btULong = 1 - btCurrency = 2 - btDate = 2 - btVariant = 2 - btComplex = 2 - btBit = 2 - btBSTR = 3 + btBool = 10 + btLong = 13 + btULong = 14 + btCurrency = 25 + btDate = 26 + btVariant = 27 + btComplex = 28 + btBit = 29 + btBSTR = 30 btHresult = 31 + #Adding code, that was not generated for some reason. class UdtKind(utils.enum): UdtStruct, UdtClass, UdtUnion = (0, 1, 2) Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -1,4 +1,5 @@ import os +import pdb import sys import ctypes import pprint @@ -57,11 +58,8 @@ self.__dia_session = self.__dia_source.openSession() self.logger.debug( 'opening session - done' ) self.__global_ns = declarations.namespace_t( '::' ) + self.__global_ns.compiler = self.COMPILER - self.__enums = {} - self.__classes = {} - self.__typedefs = {} - def __find_table(self, name): valid_names = ( 'Symbols', 'SourceFiles', 'Sections' , 'SegmentMap', 'InjectedSource', 'FrameData' ) @@ -72,55 +70,13 @@ else: return None - def create_type( self, smbl ): - if msdia.SymTagBaseType == smbl.symTag: - if enums.BasicType.btNoType == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btVoid == smbl.baseType: - return declarations.void_t() - elif enums.BasicType.btChar == smbl.baseType: - return declarations.char_t() - elif enums.BasicType.btWChar == smbl.baseType: - return declarations.wchar_t() - elif enums.BasicType.btInt == smbl.baseType: - return declarations.int_t() - elif enums.BasicType.btUInt == smbl.baseType: - return declarations.unsigned_int_t() - elif enums.BasicType.btFloat == smbl.baseType: - return declarations.float_t() - elif enums.BasicType.btBCD == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btBool == smbl.baseType: - return declarations.bool_t() - elif enums.BasicType.btLong == smbl.baseType: - return declarations.long_int_t() - elif enums.BasicType.btULong == smbl.baseType: - return declarations.long_unsigned_int_t() - elif enums.BasicType.btCurrency == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btDate == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btVariant == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btComplex == smbl.baseType: - return declarations.complex_double_t() - elif enums.BasicType.btBit == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btBSTR == smbl.baseType: - return declarations.unknown_t() - elif enums.BasicType.btHresult == smbl.baseType: - return declarations.unknown_t() - else: - return declarations.unknown_t() - else: - return declarations.unknown_t() - @utils.cached def symbols_table(self): return self.__find_table( "Symbols" ) @utils.cached def symbols(self): + self.logger.info( 'loading symbols from the file' ) smbls = {} for smbl in itertools.imap( as_symbol, as_enum_variant( self.symbols_table._NewEnum ) ): smbl.uname = msvc_utils.undecorate_name( smbl.name, msvc_utils.UNDECORATE_NAME_OPTIONS.UNDNAME_SCOPES_ONLY ) @@ -128,6 +84,7 @@ return msvc_utils.undecorate_name( smbl.name, options ) smbl.undecorate_name = smbl_undecorate_name smbls[ smbl.symIndexId ] = smbl + self.logger.info( 'loading symbols(%d) from the file - done', len( smbls ) ) return smbls def __load_nss(self): @@ -301,7 +258,19 @@ break self.logger.info( 'integrating udt objects with namespaces - done' ) + def __clear_symbols(self): + self.logger.info( 'clearing symbols' ) + to_be_deleted = [] + for smbl_id, smbl in self.symbols.iteritems(): + if ( smbl.symTag == msdia.SymTagData and not self.__is_my_var( smbl ) ) \ + or smbl.symTag in ( msdia.SymTagAnnotation, msdia.SymTagPublicSymbol ): + to_be_deleted.append( smbl_id ) + + map( lambda smbl_id: self.symbols.pop( smbl_id ), to_be_deleted ) + self.logger.info( 'clearing symbols(%d) - done', len( to_be_deleted ) ) + def read(self): + self.__clear_symbols() self.__load_nss() self.__load_classes() self.__load_enums() @@ -351,6 +320,7 @@ decl.byte_size = smbl.length decl.mangled = iif( smbl.name, smbl.name, '' ) decl.demangled = iif( smbl.uname, smbl.uname, '' ) + decl.is_artificial = bool( smbl.compilerGenerated ) def __load_enums( self ): is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum @@ -394,6 +364,8 @@ #I am only interested in global and class variables if smbl.symTag != msdia.SymTagData: return False + if not smbl.uname: + return False if smbl.classParentId not in self.symbols: return True #global scope parent_smbl = self.symbols[ smbl.classParentId ] @@ -410,17 +382,71 @@ self.__update_decls_tree( var_decl ) self.logger.info( 'building variable objects(%d) - done', vars_count ) - def __create_var( self, var_smbl ): - self.logger.debug( 'creating variable "%s"', var_smbl.uname ) - name_splitter = impl_details.get_name_splitter( var_smbl.uname ) - if not name_splitter.name: - return None - var_decl = declarations.variable_t( name_splitter.name ) - self.__update_decl( var_decl, var_smbl ) + def __create_var( self, smbl ): + self.logger.debug( 'creating variable "%s"', smbl.uname ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) + decl = declarations.variable_t( name_splitter.name ) + self.__update_decl( decl, smbl ) + #~ if decl.name == 'initialized': + #~ pdb.set_trace() + decl.type = self.create_type( smbl.type ) + decl.value = str(smbl.value) + self.logger.debug( 'creating variable "%s" - done', smbl.uname ) + return decl - var_decl.type = self.create_type( var_smbl.type ) - self.logger.debug( 'creating variable "%s" - done', var_smbl.uname ) - return var_decl - - - + def create_type( self, smbl ): + my_type = None + if msdia.SymTagBaseType == smbl.symTag: + if enums.BasicType.btNoType == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btVoid == smbl.baseType: + my_type = declarations.void_t() + elif enums.BasicType.btChar == smbl.baseType: + my_type = declarations.char_t() + elif enums.BasicType.btWChar == smbl.baseType: + my_type = declarations.wchar_t() + elif enums.BasicType.btInt == smbl.baseType: + my_type = declarations.int_t() + elif enums.BasicType.btUInt == smbl.baseType: + my_type = declarations.unsigned_int_t() + elif enums.BasicType.btFloat == smbl.baseType: + my_type = declarations.float_t() + elif enums.BasicType.btBCD == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btBool == smbl.baseType: + my_type = declarations.bool_t() + elif enums.BasicType.btLong == smbl.baseType: + my_type = declarations.long_int_t() + elif enums.BasicType.btULong == smbl.baseType: + my_type = declarations.long_unsigned_int_t() + elif enums.BasicType.btCurrency == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btDate == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btVariant == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btComplex == smbl.baseType: + my_type = declarations.complex_double_t() + elif enums.BasicType.btBit == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btBSTR == smbl.baseType: + my_type = declarations.unknown_t() + elif enums.BasicType.btHresult == smbl.baseType: + my_type = declarations.unknown_t() + else: + my_type = declarations.unknown_t() + elif msdia.SymTagArrayType == smbl.symTag: + bytes = smbl.length + element_type = self.create_type( smbl.arrayIndexType ) + size = declarations.array_t.SIZE_UNKNOWN + if bytes and element_type.byte_size: + size = bytes / element_type.byte_size + my_type = declarations.array_t( element_type, size ) + else: + my_type = declarations.unknown_t() + my_type.byte_size = smbl.length + if smbl.constType: + my_type = declarations.const_t( my_type ) + if smbl.volatileType: + my_type = declarations.volatile_t( my_type ) + return my_type Modified: pygccxml_dev/unittests/data/declarations_variables.hpp =================================================================== --- pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-12 07:52:34 UTC (rev 1309) @@ -10,6 +10,8 @@ const long unsigned int initialized = 10122004; int array[255]; + +//TODO: explain why such variables is not peeked extern int static_var; struct struct_variables_t{ Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-12 07:52:34 UTC (rev 1309) @@ -41,6 +41,11 @@ #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" +namespace declarations{ namespace variables{ + +int static_var = 0; +}} + void use_decls(){ declarations::enums::ENumbers enumbers; declarations::enums::data::EColor ecolor; Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-04-09 20:52:33 UTC (rev 1308) +++ pygccxml_dev/unittests/declarations_tester.py 2008-04-12 07:52:34 UTC (rev 1309) @@ -49,6 +49,8 @@ % ( expected_value, initialized.value ) ) self._test_type_composition( initialized.type, const_t, long_unsigned_int_t ) + if 'PDB' in self.global_ns.compiler: + return #TODO find out work around static_var = initialized = self.global_ns.variable( name='static_var' ) self.failUnless( static_var.type_qualifiers.has_static , "static_var must have static type qualifier" ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-04-21 20:14:13
|
Revision: 1310 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1310&view=rev Author: roman_yakovenko Date: 2008-04-21 13:14:17 -0700 (Mon, 21 Apr 2008) Log Message: ----------- adding another set of changes related to PDB parser Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/pygccxml/declarations/enumeration.py pygccxml_dev/pygccxml/msvc/pdb/loader.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/unittests/core_tester.py pygccxml_dev/unittests/data/core_types.hpp pygccxml_dev/unittests/data/declarations_enums.hpp pygccxml_dev/unittests/data/declarations_variables.hpp pygccxml_dev/unittests/data/msvc_build/all.cpp pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj pygccxml_dev/unittests/data/typedefs1.hpp pygccxml_dev/unittests/declarations_tester.py pygccxml_dev/unittests/pdb_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -6,6 +6,9 @@ """ contains classes that describe different C++ declarations """ + +import compilers + from dependencies import dependency_info_t from declaration import location_t from declaration import declaration_t @@ -189,7 +192,7 @@ from function_traits import is_same_function all_container_traits = container_traits.container_traits -"""tuple of all STD container traits classes""" +"""tuple of all STD container traits classes""" sequential_container_traits = \ [ Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -13,6 +13,7 @@ """ import scopedef +import compilers import algorithm import declaration import dependencies @@ -48,7 +49,7 @@ class hierarchy_info_t( object ): """describes class relationship""" - def __init__(self, related_class=None, access=None ): + def __init__(self, related_class=None, access=None, is_virtual=None ): """creates class that contains partial information about class relationship""" if related_class: assert( isinstance( related_class, class_t ) ) @@ -56,12 +57,14 @@ if access: assert( access in ACCESS_TYPES.ALL) self._access=access + self._is_virtual = is_virtual def __eq__(self, other): if not isinstance( other, hierarchy_info_t ): return False return algorithm.declaration_path( self.related_class ) == algorithm.declaration_path( other.related_class ) \ - and self.access == other.access + and self.access == other.access \ + and self.is_virtual == other.is_virtual def __ne__( self, other): return not self.__eq__( other ) @@ -69,8 +72,8 @@ def __lt__(self, other): if not isinstance( other, self.__class__ ): return self.__class__.__name__ < other.__class__.__name__ - return ( algorithm.declaration_path( self.related_class ), self.access ) \ - < ( algorithm.declaration_path( other.related_class ), other.access ) + return ( algorithm.declaration_path( self.related_class ), self.access, self.is_virtual ) \ + < ( algorithm.declaration_path( other.related_class ), other.access, self.is_virtual ) def _get_related_class(self): return self._related_class @@ -90,6 +93,15 @@ access_type = property( _get_access, _set_access , doc="describes L{hierarchy type<ACCESS_TYPES>}") + #TODO: check whether GCC XML support this and if so parser this information + def _get_is_virtual(self): + return self._is_virtual + def _set_is_virtual(self, new_is_virtual): + self._is_virtual = new_is_virtual + is_virtual = property( _get_is_virtual, _set_is_virtual + , doc="indicates whether the inheritance is virtual or not") + + class class_declaration_t( declaration.declaration_t ): """describes class declaration""" def __init__( self, name='' ): @@ -162,9 +174,9 @@ if tmp.startswith( '::' ): tmp = tmp[2:] if '<' not in tmp and '<' in self._name: - #we have template class, but for some reason demangled + #we have template class, but for some reason demangled #name doesn't contain any template - #This happens for std::string class, but this breaks + #This happens for std::string class, but this breaks #other cases, because this behaviour is not consistent self.cache.demangled_name = self._name return self.cache.demangled_name @@ -305,6 +317,8 @@ , doc="Size of this class in bytes @type: int") def _get_byte_align(self): + if self.compiler == compilers.MSVC_PDB_9: + compilers.on_missing_functionality( self.compiler, "byte align" ) return self._byte_align def _set_byte_align( self, new_byte_align ): self._byte_align = new_byte_align @@ -450,7 +464,7 @@ return None def _get_partial_name_impl( self ): - import type_traits #prevent cyclic dependencies + import type_traits #prevent cyclic dependencies if type_traits.is_std_string( self ): return 'string' elif type_traits.is_std_wstring( self ): Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -7,6 +7,7 @@ defines classes, that describe C++ types """ +import compilers import algorithms_cache class type_t(object): @@ -42,7 +43,7 @@ @property def decl_string( self ): return self.build_decl_string() - + @property def partial_decl_string( self ): return self.build_decl_string( False ) @@ -63,6 +64,8 @@ , doc="Size of this type in bytes @type: int") def _get_byte_align(self): + if self.compiler == compilers.MSVC_PDB_9: + compilers.on_missing_functionality( self.compiler, "byte align" ) return self._byte_align def _set_byte_align( self, new_byte_align ): self._byte_align = new_byte_align @@ -376,21 +379,21 @@ class restrict_t( compound_t ): """represents C{restrict whatever} type""" - - #The restrict keyword can be considered an extension to the strict aliasing - #rule. It allows the programmer to declare that pointers which share the same - #type (or were otherwise validly created) do not alias eachother. By using - #restrict the programmer can declare that any loads and stores through the - #qualified pointer (or through another pointer copied either directly or - #indirectly from the restricted pointer) are the only loads and stores to - #the same address during the lifetime of the pointer. In other words, the + + #The restrict keyword can be considered an extension to the strict aliasing + #rule. It allows the programmer to declare that pointers which share the same + #type (or were otherwise validly created) do not alias eachother. By using + #restrict the programmer can declare that any loads and stores through the + #qualified pointer (or through another pointer copied either directly or + #indirectly from the restricted pointer) are the only loads and stores to + #the same address during the lifetime of the pointer. In other words, the #pointer is not aliased by any pointers other than its own copies. def __init__( self, base ): compound_t.__init__( self, base) def build_decl_string(self, with_defaults=True): - return '__restrict__ ' + self.base.build_decl_string( with_defaults ) + return '__restrict__ ' + self.base.build_decl_string( with_defaults ) def _clone_impl( self ): return restrict_t( self.base.clone() ) @@ -471,12 +474,12 @@ self._arguments_types = new_arguments_types arguments_types = property( _get_arguments_types, _set_arguments_types , doc="list of argument L{types<type_t>}") - + @property def has_ellipsis( self ): return self.arguments_types and isinstance( self.arguments_types[-1], ellipsis_t ) - + class free_function_type_t( type_t, calldef_type_t ): """describes free function type""" NAME_TEMPLATE = '%(return_type)s (*)( %(arguments)s )' @@ -599,7 +602,7 @@ return self.create_decl_string( self.return_type , self.class_inst.decl_string , self.arguments_types - , self.has_const + , self.has_const , with_defaults) def _clone_impl( self ): Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -115,9 +115,9 @@ self.print_decl_header() if self.__print_details: self.writer( ' ' * ( self.level + 1 ) * self.INDENT_SIZE - + 'copy constructor: ' + str(self.__inst.is_copy_constructor) + + 'copy constructor: ' + str(self.__inst.is_copy_constructor) + os.linesep ) - + def visit_destructor( self ): self.print_decl_header() @@ -144,8 +144,11 @@ if self.__print_details: byte_size = 'size: %d'%(self.__inst.byte_size) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) - byte_align = 'align: %d'%(self.__inst.byte_align) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + try: + byte_align = 'align: %d'%(self.__inst.byte_align) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + except NotImplementedError: + self.writer( ' ' * curr_level * self.INDENT_SIZE + "not implemented".ljust( self.JUSTIFY ) + os.linesep ) if self.__inst.aliases: aliases = map( lambda typedef: typedef.name, self.__inst.aliases ) @@ -158,8 +161,11 @@ for class_ in classes: class_str = 'class: ' + "'%s'" % str(class_.related_class.decl_string) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_str.ljust( self.JUSTIFY ) + os.linesep ) - access = 'access: ' + "'%s'" % str(class_.access) + access = 'access type: ' + "'%s'" % str(class_.access) self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + access.ljust( self.JUSTIFY ) + os.linesep ) + if not ( None is class_.is_virtual ): + is_virtual = 'virtual inheritance: ' + "'%s'" % str(class_.is_virtual) + self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + is_virtual.ljust( self.JUSTIFY ) + os.linesep ) def print_members(members_type, members, curr_level): self.writer( ' ' * curr_level * self.INDENT_SIZE + members_type.ljust( self.JUSTIFY ) + os.linesep ) @@ -209,8 +215,11 @@ if self.__print_details: byte_size = 'size: %d'%(self.__inst.type.byte_size) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_size.ljust( self.JUSTIFY ) + os.linesep ) - byte_align = 'align: %d'%(self.__inst.type.byte_align) - self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + try: + byte_align = 'align: %d'%(self.__inst.type.byte_align) + self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_align.ljust( self.JUSTIFY ) + os.linesep ) + except NotImplementedError: + self.writer( ' ' * curr_level * self.INDENT_SIZE + "not implemented".ljust( self.JUSTIFY ) + os.linesep ) byte_offset = 'offset: %d'%(self.__inst.byte_offset) self.writer( ' ' * curr_level * self.INDENT_SIZE + byte_offset + os.linesep) Modified: pygccxml_dev/pygccxml/declarations/enumeration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/enumeration.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/declarations/enumeration.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -7,9 +7,10 @@ defines class, that describes C++ enum """ -import declaration import copy import types +import compilers +import declaration class enumeration_t( declaration.declaration_t ): """ @@ -37,7 +38,7 @@ # Initialize values via property access self.values = values self._byte_size = 0 - self._byte_align = 0 + self._byte_align = 0 def __eq__(self, other): if not declaration.declaration_t.__eq__( self, other ): @@ -127,6 +128,8 @@ , doc="Size of this class in bytes @type: int") def _get_byte_align(self): + if self.compiler == compilers.MSVC_PDB_9: + compilers.on_missing_functionality( self.compiler, "byte align" ) return self._byte_align def _set_byte_align( self, new_byte_align ): self._byte_align = new_byte_align Modified: pygccxml_dev/pygccxml/msvc/pdb/loader.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/msvc/pdb/loader.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -46,7 +46,7 @@ print 'File: ', f.fileName class decl_loader_t(object): - COMPILER = 'MSVC PDB' + COMPILER = declarations.compilers.MSVC_PDB_9 def __init__(self, pdb_file_path ): self.logger = utils.loggers.pdb_reader self.logger.setLevel(logging.INFO) @@ -59,6 +59,8 @@ self.logger.debug( 'opening session - done' ) self.__global_ns = declarations.namespace_t( '::' ) self.__global_ns.compiler = self.COMPILER + self.__id2decl = {} #cache symIndexId : decl + self.__types_cache = {} #smbl id : type def __find_table(self, name): valid_names = ( 'Symbols', 'SourceFiles', 'Sections' @@ -164,6 +166,7 @@ if not parent_ns: continue #in this case the parent scope is UDT ns_decl = declarations.namespace_t( name_splitter.name ) + ns_decl.compiler = self.COMPILER parent_ns.adopt_declaration( ns_decl ) nss[ ns_name ] = ns_decl self.logger.debug( 'inserting ns "%s" into declarations tree - done', ns_name ) @@ -173,20 +176,23 @@ def __update_decls_tree( self, decl ): smbl = decl.dia_symbols[0] - name_splitter = impl_details.get_name_splitter( smbl.uname ) - if not name_splitter.scope_names: - self.__adopt_declaration( self.global_ns, decl ) + if smbl.classParentId in self.__id2decl: + self.__adopt_declaration( self.__id2decl[smbl.classParentId], decl ) else: - parent_name = '::' + name_splitter.scope_names[-1] - try: - parent = self.global_ns.decl( parent_name ) - except: - declarations.print_declarations( self.global_ns ) - print 'identifiers:' - for index, identifier in enumerate(name_splitter.identifiers): - print index, ':', identifier - raise - self.__adopt_declaration( parent, decl ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) + if not name_splitter.scope_names: + self.__adopt_declaration( self.global_ns, decl ) + else: + parent_name = '::' + name_splitter.scope_names[-1] + try: + parent = self.global_ns.decl( parent_name ) + except: + declarations.print_declarations( self.global_ns ) + print 'identifiers:' + for index, identifier in enumerate(name_splitter.identifiers): + print index, ':', identifier + raise + self.__adopt_declaration( parent, decl ) def __adopt_declaration( self, parent, decl ): smbl = decl.dia_symbols[0] @@ -196,11 +202,13 @@ parent.adopt_declaration( decl ) else: parent.adopt_declaration( decl, self.__guess_access_type( smbl ) ) + self.__id2decl[ smbl.symIndexId ] = decl else: for other_decl in already_added: for other_smbl in other_decl.dia_symbols: if self.__are_symbols_equivalent( other_smbl, smbl ): other_decl.dia_symbols.append( smbl ) + self.__id2decl[ smbl.symIndexId ] = other_decl return else: if isinstance( parent, declarations.namespace_t ): @@ -222,41 +230,37 @@ else: return declarations.ACCESS_TYPES.PUBLIC - def __load_classes( self ): - classes = {}#unique symbol id : class decl - is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT - self.logger.info( 'building udt objects' ) - for udt_smbl in itertools.ifilter( is_udt, self.symbols.itervalues() ): - classes[udt_smbl.symIndexId] = self.__create_class(udt_smbl) - self.logger.info( 'building udt objects(%d) - done', len(classes) ) + class parent_exists_t: + def __init__( self, global_ns, classes, id2decl ): + self.global_ns = global_ns + self.classes = classes + self.id2decl = id2decl + self.__parent_exist = set() - def does_parent_exist_in_decls_tree( class_decl ): - class_smbl = class_decl.dia_symbols[0] - if classes.has_key( class_smbl.classParentId ): + def __call__( self, decl ): + smbl = decl.dia_symbols[0] + if smbl.classParent: + if smbl.classParentId in self.id2decl: + return True + else: + return False + if self.classes.has_key( smbl.classParentId ): return False - name_splitter = impl_details.get_name_splitter( class_smbl.uname ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) if not name_splitter.scope_names: return True #global namespace else: + #print "I am here " + '::' + name_splitter.scope_names[-1] parent_name = '::' + name_splitter.scope_names[-1] + if parent_name in self.__parent_exist: + return True found = self.global_ns.decls( parent_name , decl_type=declarations.scopedef_t , allow_empty=True , recursive=True ) + if found: + self.__parent_exist.add( parent_name ) return bool( found ) - self.logger.info( 'integrating udt objects with namespaces' ) - while classes: - to_be_integrated = len( classes ) - self.logger.info( 'there are %d classes to go', len( classes ) ) - to_be_deleted = filter( does_parent_exist_in_decls_tree, classes.itervalues() ) - map( self.__update_decls_tree, to_be_deleted ) - map( lambda decl: classes.pop( decl.dia_symbols[0].symIndexId ) - , to_be_deleted ) - if not ( to_be_integrated - len( classes ) ): - for cls in classes.itervalues(): - self.logger.warning( 'unable to integrate class "%s" into declarations tree', cls.dia_symbols[0].uname ) - break - self.logger.info( 'integrating udt objects with namespaces - done' ) def __clear_symbols(self): self.logger.info( 'clearing symbols' ) @@ -270,11 +274,13 @@ self.logger.info( 'clearing symbols(%d) - done', len( to_be_deleted ) ) def read(self): - self.__clear_symbols() + #self.__clear_symbols() self.__load_nss() self.__load_classes() + self.__load_base_classes() self.__load_enums() self.__load_vars() + self.__load_typedefs() @property def dia_global_scope(self): @@ -317,20 +323,65 @@ def __update_decl( self, decl, smbl ): decl.dia_symbols = [smbl] decl.compiler = self.COMPILER - decl.byte_size = smbl.length + if not isinstance( decl, declarations.typedef_t ): + decl.byte_size = smbl.length + decl.byte_offset = smbl.offset decl.mangled = iif( smbl.name, smbl.name, '' ) decl.demangled = iif( smbl.uname, smbl.uname, '' ) decl.is_artificial = bool( smbl.compilerGenerated ) + + def __load_classes( self ): + classes = {}#unique symbol id : class decl + is_udt = lambda smbl: smbl.symTag == msdia.SymTagUDT + self.logger.info( 'building udt objects' ) + for udt_smbl in itertools.ifilter( is_udt, self.symbols.itervalues() ): + classes[udt_smbl.symIndexId] = self.__create_class(udt_smbl) + self.logger.info( 'building udt objects(%d) - done', len(classes) ) + + self.logger.info( 'integrating udt objects with namespaces' ) + does_parent_exists = self.parent_exists_t( self.global_ns, classes, self.__id2decl ) + while classes: + to_be_integrated = len( classes ) + self.logger.info( 'there are %d classes to go', len( classes ) ) + to_be_deleted = filter( does_parent_exists, classes.itervalues() ) + map( self.__update_decls_tree, to_be_deleted ) + map( lambda decl: classes.pop( decl.dia_symbols[0].symIndexId ) + , to_be_deleted ) + if not ( to_be_integrated - len( classes ) ): + for cls in classes.itervalues(): + self.logger.warning( 'unable to integrate class "%s" into declarations tree', cls.dia_symbols[0].uname ) + break + self.logger.info( 'integrating udt objects with namespaces - done' ) + + def __load_base_classes( self ): + make_hi = declarations.hierarchy_info_t + is_base_class = lambda smbl: smbl.symTag == msdia.SymTagBaseClass \ + and False == smbl.indirectVirtualBaseClass + self.logger.info( 'building class hierarchies' ) + for count, smbl in enumerate( itertools.ifilter( is_base_class, self.symbols.itervalues() ) ): + base_id = smbl.type.symIndexId + derived_id = smbl.classParentId + + hi_base = make_hi( self.__id2decl[base_id] + , self.__guess_access_type( smbl ) + , bool( smbl.virtualBaseClass ) ) + self.__id2decl[ derived_id ].bases.append( hi_base ) + + hi_derived = make_hi( self.__id2decl[derived_id] + , self.__guess_access_type( smbl ) + , bool( smbl.virtualBaseClass ) ) + self.__id2decl[ base_id ].derived.append( hi_derived ) + + self.logger.info( 'building class hierarchies(%d) - done', count ) + def __load_enums( self ): is_enum = lambda smbl: smbl.symTag == msdia.SymTagEnum self.logger.info( 'building enum objects' ) - enums_count = 0 - for enum_smbl in itertools.ifilter( is_enum, self.symbols.itervalues() ): + for enums_count, enum_smbl in enumerate( itertools.ifilter( is_enum, self.symbols.itervalues() ) ): enum_decl = self.__create_enum(enum_smbl) if not enum_decl: continue - enums_count += 1 self.__update_decls_tree( enum_decl ) self.logger.info( 'building enum objects(%d) - done', enums_count ) @@ -373,13 +424,11 @@ def __load_vars( self ): self.logger.info( 'building variable objects' ) - vars_count = 0 - for var_smbl in itertools.ifilter( self.__is_my_var, self.symbols.itervalues() ): + + for vars_count, var_smbl in enumerate( itertools.ifilter( self.__is_my_var, self.symbols.itervalues() ) ): var_decl = self.__create_var(var_smbl) - if not var_decl: - continue - vars_count += 1 - self.__update_decls_tree( var_decl ) + if var_decl: + self.__update_decls_tree( var_decl ) self.logger.info( 'building variable objects(%d) - done', vars_count ) def __create_var( self, smbl ): @@ -387,14 +436,34 @@ name_splitter = impl_details.get_name_splitter( smbl.uname ) decl = declarations.variable_t( name_splitter.name ) self.__update_decl( decl, smbl ) - #~ if decl.name == 'initialized': - #~ pdb.set_trace() decl.type = self.create_type( smbl.type ) decl.value = str(smbl.value) self.logger.debug( 'creating variable "%s" - done', smbl.uname ) return decl + def __load_typedefs( self ): + self.logger.info( 'building typedef objects' ) + is_typedef = lambda smbl: smbl.symTag == msdia.SymTagTypedef + for typedefs_count, typedef_smbl in enumerate( itertools.ifilter( is_typedef, self.symbols.itervalues() ) ): + typedef_decl = self.__create_typedef(typedef_smbl) + self.__update_decls_tree( typedef_decl ) + self.logger.info( 'building typedef objects(%d) - done', typedefs_count ) + + def __create_typedef( self, smbl ): + self.logger.debug( 'creating typedef "%s"', smbl.uname ) + name_splitter = impl_details.get_name_splitter( smbl.uname ) + #~ if decl.name == 'initialized': + #~ pdb.set_trace() + decl = declarations.typedef_t( name_splitter.name + , self.create_type( smbl.type ) ) + self.__update_decl( decl, smbl ) + self.logger.debug( 'creating typedef "%s" - done', smbl.uname ) + return decl + + def create_type( self, smbl ): + if smbl.symIndexId in self.__types_cache: + return self.__types_cache[smbl.symIndexId] my_type = None if msdia.SymTagBaseType == smbl.symTag: if enums.BasicType.btNoType == smbl.baseType: @@ -442,9 +511,18 @@ if bytes and element_type.byte_size: size = bytes / element_type.byte_size my_type = declarations.array_t( element_type, size ) + elif smbl.symTag in ( msdia.SymTagUDT, msdia.SymTagTypedef, msdia.SymTagEnum ): + if smbl.symIndexId in self.__id2decl: + decl = self.__id2decl[ smbl.symIndexId ] + my_type = declarations.declarated_t( decl ) + else: + my_type = declarations.unknown_t() else: my_type = declarations.unknown_t() - my_type.byte_size = smbl.length + try: + my_type.byte_size = smbl.length + except AttributeError: + pass if smbl.constType: my_type = declarations.const_t( my_type ) if smbl.volatileType: Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/pygccxml/parser/scanner.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -92,12 +92,12 @@ , XML_NN_ENUMERATION : self.__read_enumeration , XML_NN_ENUMERATION_VALUE : self.__read_enumeration_value , XML_NN_ARRAY_TYPE : self.__read_array_type - , XML_NN_CV_QUALIFIED_TYPE : self.__read_cv_qualified_type + , XML_NN_CV_QUALIFIED_TYPE : self.__read_cv_qualified_type , XML_NN_POINTER_TYPE : self.__read_pointer_type , XML_NN_REFERENCE_TYPE : self.__read_reference_type - , XML_NN_FUNDAMENTAL_TYPE : self.__read_fundamental_type + , XML_NN_FUNDAMENTAL_TYPE : self.__read_fundamental_type , XML_NN_ARGUMENT : self.__read_argument - , XML_NN_FUNCTION_TYPE : self.__read_function_type + , XML_NN_FUNCTION_TYPE : self.__read_function_type , XML_NN_METHOD_TYPE : self.__read_method_type , XML_NN_OFFSET_TYPE : self.__read_offset_type , XML_NN_TYPEDEF : self.__read_typedef @@ -132,7 +132,7 @@ assert isinstance( decl_factory, decl_factory_t ) self.__decl_factory = decl_factory - + #mapping from id -> decl self.__declarations = {} #list of all read declarations @@ -141,7 +141,7 @@ self.__enums = [] #mapping from id -> type self.__types = {} - #mapping from id -> file + #mapping from id -> file self.__files = {} #mapping between decl id -> access self.__access = {} @@ -149,12 +149,12 @@ self.__inst = None #mapping from id to members self.__members = {} - + self.__compiler = None - + def read( self ): xml.sax.parse( self.gccxml_file, self ) - + def endDocument( self ): #updating membership members_mapping = {} @@ -164,34 +164,34 @@ continue members_mapping[ id( decl ) ] = members self.__members = members_mapping - + def declarations(self): return self.__declarations - + def calldefs( self ): return self.__calldefs def enums(self): return self.__enums - + def types(self): return self.__types - + def files(self): return self.__files def access(self): return self.__access - + def members(self): return self.__members def startElementNS(self, name, qname, attrs): return self.startElement( name[1], attrs ) - + def endElementNS(self, name, qname): return self.endElement( name[1] ) - + def startElement(self, name, attrs): try: if name not in self.__readers: @@ -216,7 +216,7 @@ self.__read_mangled( obj, attrs) self.__read_demangled( obj, attrs) self.__read_attributes(obj, attrs) - + elif isinstance( obj, type_t ): self.__types[ element_id ] = obj self.__read_byte_size(obj, attrs) @@ -231,7 +231,7 @@ msg = msg + os.linesep + 'Error: %s.' % str( error ) self.logger.error( msg % ( name, pprint.pformat( attrs.keys() ) ) ) raise - + def endElement(self, name): if name in self.deep_declarations: self.__inst = None @@ -242,7 +242,7 @@ def __update_membership(self, attrs): parent = attrs.get( XML_AN_CONTEXT, None ) if not parent: - return + return if not self.__members.has_key( parent ): self.__members[ parent ] = [] self.__members[parent].append( attrs[XML_AN_ID] ) @@ -261,7 +261,7 @@ def __read_demangled( self, decl, attrs ): decl.demangled = attrs.get( XML_AN_DEMANGLED, None ) - + def __read_attributes( self, decl, attrs ): decl.attributes = attrs.get( XML_AN_ATTRIBUTES, None ) @@ -285,7 +285,7 @@ def __read_root(self, attrs): pass - + def __read_file( self, attrs ): return attrs.get( XML_AN_NAME, '' ) @@ -336,7 +336,7 @@ msg = 'unable to find out array size from expression "%s"' % attrs[ XML_AN_MAX ] warnings.warn( msg ) return array_t( type_, size + 1 ) - + def __read_cv_qualified_type( self, attrs ): if attrs.has_key( XML_AN_CONST ): return const_t( attrs[XML_AN_TYPE] ) @@ -344,12 +344,12 @@ return volatile_t( attrs[XML_AN_TYPE] ) elif attrs.has_key( XML_AN_RESTRICT ): return restrict_t( attrs[XML_AN_TYPE] ) - else: - assert 0 + else: + assert 0 def __read_pointer_type( self, attrs ): return pointer_t( attrs[XML_AN_TYPE] ) - + def __read_reference_type( self, attrs ): return reference_t( attrs[XML_AN_TYPE] ) @@ -374,13 +374,13 @@ else: argument = argument_t() argument.name = attrs.get( XML_AN_NAME, 'arg%d' % len(self.__inst.arguments) ) - argument.type = attrs[XML_AN_TYPE] + argument.type = attrs[XML_AN_TYPE] argument.default_value = attrs.get( XML_AN_DEFAULT, None ) self.__read_attributes( argument, attrs ) if argument.default_value == '<gccxml-cast-expr>': argument.default_value = None self.__inst.arguments.append( argument ) - + def __read_ellipsis( self, attrs ): if isinstance( self.__inst, calldef_type_t ): self.__inst.arguments_types.append( '...' ) @@ -405,10 +405,10 @@ else: calldef.does_throw = True calldef.exceptions = throw_stmt.split() - - def __read_member_function( self, calldef, attrs, is_declaration ): + + def __read_member_function( self, calldef, attrs, is_declaration ): self.__read_calldef( calldef, attrs, is_declaration ) - calldef.has_const = attrs.get( XML_AN_CONST, False ) + calldef.has_const = attrs.get( XML_AN_CONST, False ) if is_declaration: calldef.has_static = attrs.get( XML_AN_STATIC, False ) if attrs.has_key( XML_AN_PURE_VIRTUAL ): @@ -418,13 +418,13 @@ else: calldef.virtuality = VIRTUALITY_TYPES.NOT_VIRTUAL else: - calldef.class_inst = attrs[XML_AN_BASE_TYPE] - + calldef.class_inst = attrs[XML_AN_BASE_TYPE] + def __read_function_type(self, attrs): answer = free_function_type_t() self.__read_calldef( answer, attrs, False ) return answer - + def __read_method_type(self, attrs): answer = member_function_type_t() self.__read_member_function( answer, attrs, False ) @@ -434,7 +434,7 @@ return self.__decl_factory.create_typedef( name=attrs.get( XML_AN_NAME, '' ), type=attrs[XML_AN_TYPE]) def __read_variable(self, attrs ): - type_qualifiers = type_qualifiers_t() + type_qualifiers = type_qualifiers_t() type_qualifiers.has_mutable = attrs.get(XML_AN_MUTABLE, False) type_qualifiers.has_static = attrs.get(XML_AN_EXTERN, False) bits = attrs.get( XML_AN_BITS, None ) @@ -466,7 +466,7 @@ self.__read_byte_size(decl, attrs) self.__read_byte_align(decl, attrs) return decl - + def __read_class( self, attrs ): return self.__read_class_impl( CLASS_TYPES.CLASS, attrs ) @@ -480,7 +480,7 @@ operator = self.__decl_factory.create_casting_operator() self.__read_member_function( operator, attrs, True ) return operator - + def __read_constructor( self, attrs ): constructor = self.__decl_factory.create_constructor() self.__read_member_function( constructor, attrs, True ) @@ -490,18 +490,18 @@ gfunction = self.__decl_factory.create_free_function() self.__read_calldef( gfunction, attrs, True ) return gfunction - + def __read_method(self, attrs): mfunction = self.__decl_factory.create_member_function() self.__read_member_function( mfunction, attrs, True ) return mfunction - + def __read_destructor(self, attrs): destructor = self.__decl_factory.create_destructor() self.__read_member_function( destructor, attrs, True ) destructor.name = '~' + destructor.name return destructor - + def __read_free_operator(self, attrs ): operator = self.__decl_factory.create_free_operator() self.__read_member_function( operator, attrs, True ) @@ -510,7 +510,7 @@ else: operator.name = 'operator' + operator.name return operator - + def __read_member_operator(self, attrs): operator = self.__decl_factory.create_member_operator() self.__read_member_function( operator, attrs, True ) @@ -522,18 +522,18 @@ def __read_version(self, attrs): logger = utils.loggers.cxx_parser - + version = float( attrs.get(XML_AN_CVS_REVISION, 0.6) ) if version is None: logger.info ( 'GCCXML version - 0.6' ) - version = "0.6" + self.__compiler = compilers.GCC_XML_06 elif version <= 1.114: logger.info ( 'GCCXML version - 0.7' ) - version = "0.7" + self.__compiler = compilers.GCC_XML_07 elif version in ( 1.115, 1.116, 1.117 ): logger.info ( 'GCCXML version - 0.9 BUGGY' ) - version = "0.9" + self.__compiler = compilers.GCC_XML_09_BUGGY else: logger.info ( 'GCCXML version - 0.9' ) - version = "0.9" - self.__compiler = "GCC-XML " + version + self.__compiler = compilers.GCC_XML_09 + Modified: pygccxml_dev/unittests/core_tester.py =================================================================== --- pygccxml_dev/unittests/core_tester.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/core_tester.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -23,30 +23,8 @@ global_ns = None def __init__(self, *args ): parser_test_case.parser_test_case_t.__init__( self, *args ) - self.test_files = [ 'core_ns_join_1.hpp' - , 'core_ns_join_2.hpp' - , 'core_ns_join_3.hpp' - , 'core_membership.hpp' - , 'core_class_hierarchy.hpp' - , 'core_types.hpp' - , 'core_diamand_hierarchy_base.hpp' - , 'core_diamand_hierarchy_derived1.hpp' - , 'core_diamand_hierarchy_derived2.hpp' - , 'core_diamand_hierarchy_final_derived.hpp' - , 'core_overloads_1.hpp' - , 'core_overloads_2.hpp' - , 'abstract_classes.hpp' - ] self.global_ns = None - def setUp(self): - if not core_t.global_ns: - decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) - core_t.global_ns = pygccxml.declarations.get_global_namespace( decls ) - if self.INIT_OPTIMIZER: - core_t.global_ns.init_optimizer() - self.global_ns = core_t.global_ns - def test_top_parent(self): enum = self.global_ns.enum( '::ns::ns32::E33' ) self.failUnless( self.global_ns is enum.top_parent ) @@ -289,9 +267,9 @@ print '\nexpected: ' for x in others: print str(x) - + self.failUnless( set( do_nothing.overloads ) == set( others ) - , "there is a difference between expected function overloads and existing ones." ) + , "there is a difference between expected function overloads and existing ones." ) def test_abstract_classes(self): ns = self.global_ns.namespace( 'abstract_classes' ) @@ -305,50 +283,89 @@ def test_versioning(self): for d in self.global_ns.decls(): self.failUnless( d.compiler ) - + def test_byte_size( self ): mptrs = self.global_ns.class_( 'members_pointers_t' ) self.failUnless( mptrs.byte_size != 0 ) - + def test_byte_align( self ): mptrs = self.global_ns.class_( 'members_pointers_t' ) - self.failUnless( mptrs.byte_align != 0 ) + if mptrs.compiler != compilers.MSVC_PDB_9: + self.failUnless( mptrs.byte_align != 0 ) def test_byte_offset( self ): mptrs = self.global_ns.class_( 'members_pointers_t' ) self.failUnless( mptrs.var( 'xxx' ).byte_offset != 0 ) +class pdb_based_core_tester_t( core_t ): + def __init__(self, *args ): + core_t.__init__( self, *args ) + self.global_ns = autoconfig.get_pdb_global_ns() -class core_all_at_once_t( core_t ): +class core_gccxml_t( core_t ): + """Tests core algorithms of GCC-XML and GCC-XML file reader. + Those most white-box testing. + """ + global_ns = None + def __init__(self, *args ): + core_t.__init__( self, *args ) + self.test_files = [ 'core_ns_join_1.hpp' + , 'core_ns_join_2.hpp' + , 'core_ns_join_3.hpp' + , 'core_membership.hpp' + , 'core_class_hierarchy.hpp' + , 'core_types.hpp' + , 'core_diamand_hierarchy_base.hpp' + , 'core_diamand_hierarchy_derived1.hpp' + , 'core_diamand_hierarchy_derived2.hpp' + , 'core_diamand_hierarchy_final_derived.hpp' + , 'core_overloads_1.hpp' + , 'core_overloads_2.hpp' + , 'abstract_classes.hpp' + ] + self.global_ns = None + + def setUp(self): + if not core_t.global_ns: + decls = parse( self.test_files, self.config, self.COMPILATION_MODE ) + core_t.global_ns = pygccxml.declarations.get_global_namespace( decls ) + if self.INIT_OPTIMIZER: + core_t.global_ns.init_optimizer() + self.global_ns = core_t.global_ns + +class core_all_at_once_t( core_gccxml_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE INIT_OPTIMIZER = True def __init__(self, *args): - core_t.__init__(self, *args) + core_gccxml_t.__init__(self, *args) -class core_all_at_once_no_opt_t( core_t ): +class core_all_at_once_no_opt_t( core_gccxml_t ): COMPILATION_MODE = COMPILATION_MODE.ALL_AT_ONCE INIT_OPTIMIZER = False def __init__(self, *args): - core_t.__init__(self, *args) + core_gccxml_t.__init__(self, *args) -class core_file_by_file_t( core_t ): +class core_file_by_file_t( core_gccxml_t ): COMPILATION_MODE = COMPILATION_MODE.FILE_BY_FILE INIT_OPTIMIZER = True def __init__(self, *args): - core_t.__init__(self, *args) + core_gccxml_t.__init__(self, *args) -class core_file_by_file_no_opt_t( core_t ): +class core_file_by_file_no_opt_t( core_gccxml_t ): COMPILATION_MODE = COMPILATION_MODE.FILE_BY_FILE INIT_OPTIMIZER = False def __init__(self, *args): - core_t.__init__(self, *args) + core_gccxml_t.__init__(self, *args) def create_suite(): suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(core_all_at_once_t)) - suite.addTest( unittest.makeSuite(core_all_at_once_no_opt_t)) - suite.addTest( unittest.makeSuite(core_file_by_file_t)) - suite.addTest( unittest.makeSuite(core_file_by_file_no_opt_t)) + #~ suite.addTest( unittest.makeSuite(core_all_at_once_t)) + #~ suite.addTest( unittest.makeSuite(core_all_at_once_no_opt_t)) + #~ suite.addTest( unittest.makeSuite(core_file_by_file_t)) + #~ suite.addTest( unittest.makeSuite(core_file_by_file_no_opt_t)) + if sys.platform == 'win32': + suite.addTest( unittest.makeSuite(pdb_based_core_tester_t)) + return suite def run_suite(): Modified: pygccxml_dev/unittests/data/core_types.hpp =================================================================== --- pygccxml_dev/unittests/data/core_types.hpp 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/core_types.hpp 2008-04-21 20:14:17 UTC (rev 1310) @@ -6,6 +6,11 @@ #ifndef __core_types_hpp__ #define __core_types_hpp__ +#include <iostream> + +#define USE_SYMBOL( X ) enum{ x##__LINE__ = sizeof(X) }; + + namespace core{ namespace types{ typedef void typedef_void; @@ -29,6 +34,8 @@ typedef long double typedef_long_double; typedef const int typedef_const_int; +USE_SYMBOL( typedef_const_int ); + typedef int * typedef_pointer_int; typedef int& typedef_reference_int; typedef const unsigned int * const typedef_const_unsigned_int_const_pointer; Modified: pygccxml_dev/unittests/data/declarations_enums.hpp =================================================================== --- pygccxml_dev/unittests/data/declarations_enums.hpp 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/declarations_enums.hpp 2008-04-21 20:14:17 UTC (rev 1310) @@ -17,6 +17,7 @@ enum EPrivColor{ priv_red, priv_green, priv_blue, priv_black, priv_white }; void do_smth(EPrivColor x){} + EColor favorite_color; }; } } Modified: pygccxml_dev/unittests/data/declarations_variables.hpp =================================================================== --- pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/declarations_variables.hpp 2008-04-21 20:14:17 UTC (rev 1310) @@ -18,6 +18,10 @@ mutable int m_mutable; }; +struct struct_variables_holder_t{ + struct_variables_t m_struct_variables; +}; + } } #endif//__declarations_variables_hpp__ Modified: pygccxml_dev/unittests/data/msvc_build/all.cpp =================================================================== --- pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/msvc_build/all.cpp 2008-04-21 20:14:17 UTC (rev 1310) @@ -3,6 +3,7 @@ #include "bit_fields.hpp" #include "complex_types.hpp" #include "core_cache.hpp" +#include "core_types.hpp" #include "core_class_hierarchy.hpp" #include "core_diamand_hierarchy_base.hpp" #include "core_diamand_hierarchy_derived1.hpp" @@ -40,13 +41,22 @@ #include "unnamed_enums_bug2.hpp" #include "unnamed_ns_bug.hpp" #include "vector_traits.hpp" +#include "core_types.hpp" -namespace declarations{ namespace variables{ - -int static_var = 0; +namespace declarations{ namespace variables{ + +int static_var = 0; }} void use_decls(){ declarations::enums::ENumbers enumbers; declarations::enums::data::EColor ecolor; + + sizeof(core::types::exception ); +} + + +void use_core_types(){ + core::types::members_pointers_t mem_ptrs; + core::types::typedef_const_int typedef_const_int_ = 0; } \ No newline at end of file Modified: pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj =================================================================== --- pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/msvc_build/msvc_build.vcproj 2008-04-21 20:14:17 UTC (rev 1310) @@ -53,6 +53,7 @@ BrowseInformation="1" WarningLevel="3" DebugInformationFormat="4" + DisableSpecificWarnings="4290;4584;4293;4244;4101" /> <Tool Name="VCManagedResourceCompilerTool" @@ -77,7 +78,8 @@ /> <Tool Name="VCXDCMakeTool" - ValidateIntelliSense="true" + ValidateIntelliSense="false" + OutputDocumentFile="" /> <Tool Name="VCBscMakeTool" Modified: pygccxml_dev/unittests/data/typedefs1.hpp =================================================================== --- pygccxml_dev/unittests/data/typedefs1.hpp 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/data/typedefs1.hpp 2008-04-21 20:14:17 UTC (rev 1310) @@ -12,6 +12,8 @@ typedef item_t Item1; +typedef int my_int_t; + } -#endif//__typedefs1_hpp__ \ No newline at end of file +#endif//__typedefs1_hpp__ Modified: pygccxml_dev/unittests/declarations_tester.py =================================================================== --- pygccxml_dev/unittests/declarations_tester.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/declarations_tester.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -49,14 +49,15 @@ % ( expected_value, initialized.value ) ) self._test_type_composition( initialized.type, const_t, long_unsigned_int_t ) - if 'PDB' in self.global_ns.compiler: - return #TODO find out work around static_var = initialized = self.global_ns.variable( name='static_var' ) self.failUnless( static_var.type_qualifiers.has_static , "static_var must have static type qualifier" ) self.failUnless( not static_var.type_qualifiers.has_mutable , "static_var must not have mutable type qualifier" ) + if 'PDB' in self.global_ns.compiler: + return #TODO find out work around + m_mutable = initialized = self.global_ns.variable( name='m_mutable' ) self.failUnless( not m_mutable.type_qualifiers.has_static , "m_mutable must not have static type qualifier" ) Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2008-04-12 07:52:34 UTC (rev 1309) +++ pygccxml_dev/unittests/pdb_tester.py 2008-04-21 20:14:17 UTC (rev 1310) @@ -14,25 +14,25 @@ , 'Debug' , 'msvc_build.pdb' ) - def __test_splitter_impl( self, name, expected_result ): + def __splitter_tester_impl( self, name, expected_result ): splitter = pdb.impl_details.full_name_splitter_t( name ) self.failUnless( len(splitter.scope_names) == len(expected_result) ) self.failUnless( splitter.scope_names == expected_result ) - def __test_name_splitter(self): + def test_name_splitter(self): name = "std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator::operator->" expected_result = [ 'std' , 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >', 'std::_Tree<std::_Tmap_traits<engine_objects::ouuid_t,engine_objects::sql_query::parameterized_query::sql_fragment_t,std::less<engine_objects::ouuid_t>,std::allocator<std::pair<engine_objects::ouuid_t const ,engine_objects::sql_query::parameterized_query::sql_fragment_t> >,0> >::const_iterator' ] - self.__test_splitter_impl( name, expected_result ) + self.__splitter_tester_impl( name, expected_result ) name = 'boost::reference_wrapper<engine_objects::ops::pathable_t const >::operator engine_objects::ops::pathable_t const &' expected_result = [ 'boost' , 'boost::reference_wrapper<engine_objects::ops::pathable_t const >' ] - self.__test_splitter_impl( name, expected_result ) + self.__splitter_tester_impl( name, expected_result ) def test_create_nss(self): reader = pdb.decl_loader_t( self.pdb_file ) @@ -45,6 +45,12 @@ f.write( os.linesep.join( x ) ) f.close() + f = file( 'symbols.txt', 'w+') + for smbl in reader.symbols.itervalues(): + f.write( smbl.uname ) + f.write( os.linesep ) + f.write( '\t' + str(smbl.name) ) + f.close() #~ names = [] #~ for d in reader.global_ns.classes(): #~ names.append( '{%s}<=====>{%s}' %( d.demangled, d.mangled ) ) @@ -70,6 +76,7 @@ #~ print undecorated self.failUnless( msvc_utils.undecorate_name( decorated ) == undecorated ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |