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