[pygccxml-commit] SF.net SVN: pygccxml: [1296] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
|
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.
|