[pygccxml-commit] SF.net SVN: pygccxml: [1278] pygccxml_dev/pygccxml/msvc
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-03-12 21:03:35
|
Revision: 1278 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1278&view=rev Author: roman_yakovenko Date: 2008-03-12 14:03:41 -0700 (Wed, 12 Mar 2008) Log Message: ----------- massive refactoring - better package structure Added Paths: ----------- pygccxml_dev/pygccxml/msvc/__init__.py pygccxml_dev/pygccxml/msvc/bsc/ pygccxml_dev/pygccxml/msvc/bsc/__init__.py pygccxml_dev/pygccxml/msvc/bsc/c_wrapper.py pygccxml_dev/pygccxml/msvc/config.py pygccxml_dev/pygccxml/msvc/pdb/ pygccxml_dev/pygccxml/msvc/pdb/__init__.py pygccxml_dev/pygccxml/msvc/pdb/enums.py pygccxml_dev/pygccxml/msvc/pdb/impl_details.py Removed Paths: ------------- pygccxml_dev/pygccxml/msvc/bsc.py pygccxml_dev/pygccxml/msvc/details.py pygccxml_dev/pygccxml/msvc/msvc_details.py pygccxml_dev/pygccxml/msvc/scanner.py Added: pygccxml_dev/pygccxml/msvc/__init__.py =================================================================== Added: pygccxml_dev/pygccxml/msvc/bsc/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/bsc/__init__.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/bsc/__init__.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -0,0 +1,279 @@ +import os +import sys +import logging + +from c_wrapper import * + +class definition_t(object): + #represents some other symbol + def __init__( self, def_id, bsc ): + self.__bsc = bsc + self.__def_id = def_id + + @property + def def_id(self): + return self.__def_id + + @utils.cached + def location( self ): + module = STRING() + line = LINE() + 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 + def file_name(self): + return self.location[0].value + + @utils.cached + def line(self): + return self.location[1].value + + 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) ) + +class instance_t(object): + #represents some symbol + def __init__( self, inst_id, bsc ): + self.__bsc = bsc + self.__inst_id = inst_id + + @property + def inst_id(self): + return self.__inst_id + + @utils.cached + def name_type_attribute_mangled_name( self ): + name = STRING() + typ = TYP() + 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 ) + return undecorated_name, typ, attribute, name.value + + + @utils.cached + def mangled_name(self): + return self.name_type_attribute_mangled_name[3] + + @utils.cached + def name(self): + return self.name_type_attribute_mangled_name[0] + + @utils.cached + def type(self): + return self.name_type_attribute_mangled_name[1].value + + @utils.cached + def attribute(self): + return self.name_type_attribute_mangled_name[2].value + + 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 ) + return ', '.join( tmp ) + + + @utils.cached + def definitions( self ): + 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 ) + return definitions + + @utils.cached + def members( self ): + 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 ) + return instances + + @utils.cached + def used_symbols(self): + 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 ) + return instances + + @utils.cached + def base_classes(self): + 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 ) + return instances + + @utils.cached + def derived_classes(self): + 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 ) + return instances + +class module_t(object): + #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 + + @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) + 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 ) + return instances + +class reader_t( object ): + def __init__( self, bsc_file ): + self.logger = utils.loggers.pdb_reader + self.logger.setLevel(logging.INFO) + + 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 ) + + def __create_instance( self, inst_id ): + try: + return self.__instances_cache[ inst_id ] + except KeyError: + inst = instance_t( inst_id, self.__bsc ) + self.__instances_cache[ inst_id ] = inst + return inst + + def load_instances( self ): + instances_len = ULONG(0) + instances_ids = pointer( IINST() ) + + if not BSCGetAllGlobalsArray( self.__bsc, enums.MBF.ALL, byref( instances_ids ), byref( instances_len ) ): + raise RuntimeError( "Unable to load all globals symbols" ) + + for i in range( instances_len.value ): + self.__create_instance( instances_ids[i] ) + + 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_len = ULONG() + bs = BSC_STAT() + + if not BSCGetAllModulesArray( self.__bsc, module_ids, byref(module_len) ): + 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: + continue + print 'File: ', m.path + if m.instances: + print '\tInstances:' + for inst in m.instances: + print '\t\t', str(inst) + if inst.definitions: + print '\t\t\tDefinitions:' + for definition in inst.definitions: + print '\t\t\t\t', str( definition ) + if inst.members: + print '\t\t\tMembers:' + for member in inst.members: + print '\t\t\t\t', str( member ) + if inst.used_symbols: + print '\t\t\tUsed symbols:' + for used_symbol in inst.used_symbols: + print '\t\t\t\t', str( used_symbol ) + if inst.base_classes: + print '\t\t\tBase classes:' + for base_class in inst.base_classes: + print '\t\t\t\t', str( base_class ) + if inst.derived_classes: + 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/bsc/c_wrapper.py =================================================================== --- pygccxml_dev/pygccxml/msvc/bsc/c_wrapper.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/bsc/c_wrapper.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -0,0 +1,284 @@ +import os +import sys +import ctypes +import logging + +from ctypes import * +from ctypes.wintypes import ULONG +from ctypes.wintypes import DWORD +from ctypes.wintypes import BOOL +from ctypes.wintypes import BYTE +from ctypes.wintypes import WORD +from ctypes.wintypes import UINT + +from .. import config as msvc_cfg# +from ... import utils #import utils from pygccxml package + +STRING = c_char_p +_libraries = {} +_libraries['msvcr70.dll'] = CDLL(msvc_cfg.msvcr_path, mode=RTLD_GLOBAL) +_libraries['msbsc70.dll'] = CDLL(msvc_cfg.msbsc_path, mode=RTLD_GLOBAL) + + +qyMac = 9 +refreshAllOp = 4 +qyDervOf = 7 +delOp = 1 +qyImpMembers = 8 +changeOp = 2 +qyRefs = 4 +qyCalls = 2 +changeIinstOp = 3 +qyContains = 1 +qyCalledBy = 3 +noOp = 5 +qyBaseOf = 6 +qyNil = 0 +addOp = 0 +qyDefs = 5 +PULONG = POINTER(ULONG) +USHORT = c_ushort +PUSHORT = POINTER(USHORT) +UCHAR = c_ubyte +PUCHAR = POINTER(UCHAR) +PSZ = STRING +FLOAT = c_float +PFLOAT = POINTER(FLOAT) +PBOOL = POINTER(BOOL) +LPBOOL = POINTER(BOOL) +PBYTE = POINTER(BYTE) +LPBYTE = POINTER(BYTE) +PINT = POINTER(c_int) +LPINT = POINTER(c_int) +PWORD = POINTER(WORD) +LPWORD = POINTER(WORD) +LPLONG = POINTER(c_long) +PDWORD = POINTER(DWORD) +LPDWORD = POINTER(DWORD) +LPVOID = c_void_p +LPCVOID = c_void_p +INT = c_int +PUINT = POINTER(c_uint) +ULONG_PTR = POINTER(ULONG) +NI = ULONG +IINST = ULONG +IREF = ULONG +IDEF = ULONG +IMOD = USHORT +LINE = USHORT +TYP = BYTE +ATR = USHORT +ATR32 = ULONG +MBF = ULONG +SZ = STRING +SZ_CONST = STRING + +class Bsc(Structure): + pass + +# values for enumeration 'OPERATION' +OPERATION = c_int # enum +class IinstInfo(Structure): + pass +IinstInfo._fields_ = [ + ('m_iinst', IINST), + ('m_szName', SZ_CONST), + ('m_ni', NI), +] +class BSC_STAT(Structure): + pass +BSC_STAT._fields_ = [ + ('cDef', ULONG), + ('cRef', ULONG), + ('cInst', ULONG), + ('cMod', ULONG), + ('cUseLink', ULONG), + ('cBaseLink', ULONG), +] +class NiQ(Structure): + pass +NiQ._fields_ = [ + ('m_iinstOld', IINST), + ('m_iInfoNew', IinstInfo), + ('m_op', OPERATION), + ('m_typ', TYP), +] +pfnNotifyChange = CFUNCTYPE(BOOL, POINTER(NiQ), ULONG, ULONG_PTR) + +# values for enumeration '_qy_' +_qy_ = c_int # enum +QY = _qy_ +Bsc._fields_ = [ +] +BSCOpen = _libraries['msbsc70.dll'].BSCOpen +BSCOpen.restype = BOOL +BSCOpen.argtypes = [SZ_CONST, POINTER(POINTER(Bsc))] +BSCClose = _libraries['msbsc70.dll'].BSCClose +BSCClose.restype = BOOL +BSCClose.argtypes = [POINTER(Bsc)] +BSCIinstInfo = _libraries['msbsc70.dll'].BSCIinstInfo +BSCIinstInfo.restype = BOOL +BSCIinstInfo.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR)] +BSCIrefInfo = _libraries['msbsc70.dll'].BSCIrefInfo +BSCIrefInfo.restype = BOOL +BSCIrefInfo.argtypes = [POINTER(Bsc), IREF, POINTER(SZ), POINTER(LINE)] +BSCIdefInfo = _libraries['msbsc70.dll'].BSCIdefInfo +BSCIdefInfo.restype = BOOL +BSCIdefInfo.argtypes = [POINTER(Bsc), IDEF, POINTER(SZ), POINTER(LINE)] +BSCImodInfo = _libraries['msbsc70.dll'].BSCImodInfo +BSCImodInfo.restype = BOOL +BSCImodInfo.argtypes = [POINTER(Bsc), IMOD, POINTER(SZ)] +BSCSzFrTyp = _libraries['msbsc70.dll'].BSCSzFrTyp +BSCSzFrTyp.restype = SZ +BSCSzFrTyp.argtypes = [POINTER(Bsc), TYP] +BSCSzFrAtr = _libraries['msbsc70.dll'].BSCSzFrAtr +BSCSzFrAtr.restype = SZ +BSCSzFrAtr.argtypes = [POINTER(Bsc), ATR] +BSCGetIinstByvalue = _libraries['msbsc70.dll'].BSCGetIinstByvalue +BSCGetIinstByvalue.restype = BOOL +BSCGetIinstByvalue.argtypes = [POINTER(Bsc), SZ, TYP, ATR, POINTER(IINST)] +BSCGetOverloadArray = _libraries['msbsc70.dll'].BSCGetOverloadArray +BSCGetOverloadArray.restype = BOOL +BSCGetOverloadArray.argtypes = [POINTER(Bsc), SZ, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetUsedByArray = _libraries['msbsc70.dll'].BSCGetUsedByArray +BSCGetUsedByArray.restype = BOOL +BSCGetUsedByArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetUsesArray = _libraries['msbsc70.dll'].BSCGetUsesArray +BSCGetUsesArray.restype = BOOL +BSCGetUsesArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetBaseArray = _libraries['msbsc70.dll'].BSCGetBaseArray +BSCGetBaseArray.restype = BOOL +BSCGetBaseArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetDervArray = _libraries['msbsc70.dll'].BSCGetDervArray +BSCGetDervArray.restype = BOOL +BSCGetDervArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetMembersArray = _libraries['msbsc70.dll'].BSCGetMembersArray +BSCGetMembersArray.restype = BOOL +BSCGetMembersArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetDefArray = _libraries['msbsc70.dll'].BSCGetDefArray +BSCGetDefArray.restype = BOOL +BSCGetDefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] +BSCGetRefArray = _libraries['msbsc70.dll'].BSCGetRefArray +BSCGetRefArray.restype = BOOL +BSCGetRefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] +BSCGetModuleContents = _libraries['msbsc70.dll'].BSCGetModuleContents +BSCGetModuleContents.restype = BOOL +BSCGetModuleContents.argtypes = [POINTER(Bsc), IMOD, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCGetModuleByName = _libraries['msbsc70.dll'].BSCGetModuleByName +BSCGetModuleByName.restype = BOOL +BSCGetModuleByName.argtypes = [POINTER(Bsc), SZ, POINTER(IMOD)] +BSCGetAllModulesArray = _libraries['msbsc70.dll'].BSCGetAllModulesArray +BSCGetAllModulesArray.restype = BOOL +BSCGetAllModulesArray.argtypes = [POINTER(Bsc), POINTER(POINTER(IMOD)), POINTER(ULONG)] +BSCDisposeArray = _libraries['msbsc70.dll'].BSCDisposeArray +BSCDisposeArray.restype = None +BSCDisposeArray.argtypes = [POINTER(Bsc), c_void_p] +BSCFormatDname = _libraries['msbsc70.dll'].BSCFormatDname +BSCFormatDname.restype = SZ +BSCFormatDname.argtypes = [POINTER(Bsc), SZ] +BSCFInstFilter = _libraries['msbsc70.dll'].BSCFInstFilter +BSCFInstFilter.restype = BOOL +BSCFInstFilter.argtypes = [POINTER(Bsc), IINST, MBF] +BSCIinstFrIref = _libraries['msbsc70.dll'].BSCIinstFrIref +BSCIinstFrIref.restype = IINST +BSCIinstFrIref.argtypes = [POINTER(Bsc), IREF] +BSCIinstFrIdef = _libraries['msbsc70.dll'].BSCIinstFrIdef +BSCIinstFrIdef.restype = IINST +BSCIinstFrIdef.argtypes = [POINTER(Bsc), IDEF] +BSCIinstContextIref = _libraries['msbsc70.dll'].BSCIinstContextIref +BSCIinstContextIref.restype = IINST +BSCIinstContextIref.argtypes = [POINTER(Bsc), IREF] +BSCGetStatistics = _libraries['msbsc70.dll'].BSCGetStatistics +BSCGetStatistics.restype = BOOL +BSCGetStatistics.argtypes = [POINTER(Bsc), POINTER(BSC_STAT)] +BSCGetModuleStatistics = _libraries['msbsc70.dll'].BSCGetModuleStatistics +BSCGetModuleStatistics.restype = BOOL +BSCGetModuleStatistics.argtypes = [POINTER(Bsc), IMOD, POINTER(BSC_STAT)] +BSCFCaseSensitive = _libraries['msbsc70.dll'].BSCFCaseSensitive +BSCFCaseSensitive.restype = BOOL +BSCFCaseSensitive.argtypes = [POINTER(Bsc)] +BSCSetCaseSensitivity = _libraries['msbsc70.dll'].BSCSetCaseSensitivity +BSCSetCaseSensitivity.restype = BOOL +BSCSetCaseSensitivity.argtypes = [POINTER(Bsc), BOOL] +BSCGetAllGlobalsArray = _libraries['msbsc70.dll'].BSCGetAllGlobalsArray +BSCGetAllGlobalsArray.restype = BOOL +BSCGetAllGlobalsArray.argtypes = [POINTER(Bsc), MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] +BSCSzFrAtr2 = _libraries['msbsc70.dll'].BSCSzFrAtr2 +BSCSzFrAtr2.restype = SZ +BSCSzFrAtr2.argtypes = [POINTER(Bsc), ATR32] +BSCIinstInfo2 = _libraries['msbsc70.dll'].BSCIinstInfo2 +BSCIinstInfo2.restype = BOOL +BSCIinstInfo2.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR32)] +BSCGetIinstByvalue2 = _libraries['msbsc70.dll'].BSCGetIinstByvalue2 +BSCGetIinstByvalue2.restype = BOOL +BSCGetIinstByvalue2.argtypes = [POINTER(Bsc), SZ, TYP, ATR32, POINTER(IINST)] +OpenBSCQuery = _libraries['msbsc70.dll'].OpenBSCQuery +OpenBSCQuery.restype = BOOL +OpenBSCQuery.argtypes = [POINTER(Bsc)] +CloseBSCQuery = _libraries['msbsc70.dll'].CloseBSCQuery +CloseBSCQuery.restype = BOOL +CloseBSCQuery.argtypes = [] +BOB = ULONG +InitBSCQuery = _libraries['msbsc70.dll'].InitBSCQuery +InitBSCQuery.restype = BOOL +InitBSCQuery.argtypes = [QY, BOB] +BobNext = _libraries['msbsc70.dll'].BobNext +BobNext.restype = BOB +BobNext.argtypes = [] +BobFrName = _libraries['msbsc70.dll'].BobFrName +BobFrName.restype = BOB +BobFrName.argtypes = [SZ] +LszNameFrBob = _libraries['msbsc70.dll'].LszNameFrBob +LszNameFrBob.restype = SZ +LszNameFrBob.argtypes = [BOB] +CLS = USHORT + +class enums: + class MBF(utils.enum): + NIL = 0x000 + VARS = 0x001 + FUNCS = 0x002 + MACROS = 0x004 + TYPES = 0x008 + CLASS = 0x010 + INCL = 0x020 + MSGMAP = 0x040 + DIALOGID = 0x080 + LIBRARY = 0x100 + IMPORT = 0x200 + TEMPLATE = 0x400 + NAMESPACE = 0x800 + ALL = 0xFFF + + class TYPES(utils.enum): + FUNCTION = 0x01 + LABEL = 0x02 + PARAMETER = 0x03 + VARIABLE = 0x04 + CONSTANT = 0x05 + MACRO = 0x06 + TYPEDEF = 0x07 + STRUCNAM = 0x08 + ENUMNAM = 0x09 + ENUMMEM = 0x0A + UNIONNAM = 0x0B + SEGMENT = 0x0C + GROUP = 0x0D + PROGRAM = 0x0E + CLASSNAM = 0x0F + MEMFUNC = 0x10 + MEMVAR = 0x11 + + class ATTRIBUTES(utils.enum): + LOCAL = 0x001 + STATIC = 0x002 + SHARED = 0x004 + NEAR = 0x008 + COMMON = 0x010 + DECL_ONLY = 0x020 + PUBLIC = 0x040 + NAMED = 0x080 + MODULE = 0x100 + VIRTUAL = 0x200 + PRIVATE = 0x400 + PROTECT = 0x800 Deleted: pygccxml_dev/pygccxml/msvc/bsc.py =================================================================== --- pygccxml_dev/pygccxml/msvc/bsc.py 2008-03-12 11:59:29 UTC (rev 1277) +++ pygccxml_dev/pygccxml/msvc/bsc.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -1,568 +0,0 @@ -import os -import sys -import ctypes -import logging -import msvc_details -from ctypes import * -from ctypes.wintypes import ULONG -from ctypes.wintypes import DWORD -from ctypes.wintypes import BOOL -from ctypes.wintypes import BYTE -from ctypes.wintypes import WORD -from ctypes.wintypes import UINT - -sys.path.append( r'../..' ) - -from pygccxml import utils -from pygccxml import declarations - - -STRING = c_char_p -_libraries = {} -_libraries['msvcr70.dll'] = CDLL(msvc_details.msvcr_path, mode=RTLD_GLOBAL) -_libraries['msbsc70.dll'] = CDLL(msvc_details.msbsc_path, mode=RTLD_GLOBAL) - - -qyMac = 9 -refreshAllOp = 4 -qyDervOf = 7 -delOp = 1 -qyImpMembers = 8 -changeOp = 2 -qyRefs = 4 -qyCalls = 2 -changeIinstOp = 3 -qyContains = 1 -qyCalledBy = 3 -noOp = 5 -qyBaseOf = 6 -qyNil = 0 -addOp = 0 -qyDefs = 5 -PULONG = POINTER(ULONG) -USHORT = c_ushort -PUSHORT = POINTER(USHORT) -UCHAR = c_ubyte -PUCHAR = POINTER(UCHAR) -PSZ = STRING -FLOAT = c_float -PFLOAT = POINTER(FLOAT) -PBOOL = POINTER(BOOL) -LPBOOL = POINTER(BOOL) -PBYTE = POINTER(BYTE) -LPBYTE = POINTER(BYTE) -PINT = POINTER(c_int) -LPINT = POINTER(c_int) -PWORD = POINTER(WORD) -LPWORD = POINTER(WORD) -LPLONG = POINTER(c_long) -PDWORD = POINTER(DWORD) -LPDWORD = POINTER(DWORD) -LPVOID = c_void_p -LPCVOID = c_void_p -INT = c_int -PUINT = POINTER(c_uint) -ULONG_PTR = POINTER(ULONG) -NI = ULONG -IINST = ULONG -IREF = ULONG -IDEF = ULONG -IMOD = USHORT -LINE = USHORT -TYP = BYTE -ATR = USHORT -ATR32 = ULONG -MBF = ULONG -SZ = STRING -SZ_CONST = STRING - -class Bsc(Structure): - pass - -# values for enumeration 'OPERATION' -OPERATION = c_int # enum -class IinstInfo(Structure): - pass -IinstInfo._fields_ = [ - ('m_iinst', IINST), - ('m_szName', SZ_CONST), - ('m_ni', NI), -] -class BSC_STAT(Structure): - pass -BSC_STAT._fields_ = [ - ('cDef', ULONG), - ('cRef', ULONG), - ('cInst', ULONG), - ('cMod', ULONG), - ('cUseLink', ULONG), - ('cBaseLink', ULONG), -] -class NiQ(Structure): - pass -NiQ._fields_ = [ - ('m_iinstOld', IINST), - ('m_iInfoNew', IinstInfo), - ('m_op', OPERATION), - ('m_typ', TYP), -] -pfnNotifyChange = CFUNCTYPE(BOOL, POINTER(NiQ), ULONG, ULONG_PTR) - -# values for enumeration '_qy_' -_qy_ = c_int # enum -QY = _qy_ -Bsc._fields_ = [ -] -BSCOpen = _libraries['msbsc70.dll'].BSCOpen -BSCOpen.restype = BOOL -BSCOpen.argtypes = [SZ_CONST, POINTER(POINTER(Bsc))] -BSCClose = _libraries['msbsc70.dll'].BSCClose -BSCClose.restype = BOOL -BSCClose.argtypes = [POINTER(Bsc)] -BSCIinstInfo = _libraries['msbsc70.dll'].BSCIinstInfo -BSCIinstInfo.restype = BOOL -BSCIinstInfo.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR)] -BSCIrefInfo = _libraries['msbsc70.dll'].BSCIrefInfo -BSCIrefInfo.restype = BOOL -BSCIrefInfo.argtypes = [POINTER(Bsc), IREF, POINTER(SZ), POINTER(LINE)] -BSCIdefInfo = _libraries['msbsc70.dll'].BSCIdefInfo -BSCIdefInfo.restype = BOOL -BSCIdefInfo.argtypes = [POINTER(Bsc), IDEF, POINTER(SZ), POINTER(LINE)] -BSCImodInfo = _libraries['msbsc70.dll'].BSCImodInfo -BSCImodInfo.restype = BOOL -BSCImodInfo.argtypes = [POINTER(Bsc), IMOD, POINTER(SZ)] -BSCSzFrTyp = _libraries['msbsc70.dll'].BSCSzFrTyp -BSCSzFrTyp.restype = SZ -BSCSzFrTyp.argtypes = [POINTER(Bsc), TYP] -BSCSzFrAtr = _libraries['msbsc70.dll'].BSCSzFrAtr -BSCSzFrAtr.restype = SZ -BSCSzFrAtr.argtypes = [POINTER(Bsc), ATR] -BSCGetIinstByvalue = _libraries['msbsc70.dll'].BSCGetIinstByvalue -BSCGetIinstByvalue.restype = BOOL -BSCGetIinstByvalue.argtypes = [POINTER(Bsc), SZ, TYP, ATR, POINTER(IINST)] -BSCGetOverloadArray = _libraries['msbsc70.dll'].BSCGetOverloadArray -BSCGetOverloadArray.restype = BOOL -BSCGetOverloadArray.argtypes = [POINTER(Bsc), SZ, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetUsedByArray = _libraries['msbsc70.dll'].BSCGetUsedByArray -BSCGetUsedByArray.restype = BOOL -BSCGetUsedByArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetUsesArray = _libraries['msbsc70.dll'].BSCGetUsesArray -BSCGetUsesArray.restype = BOOL -BSCGetUsesArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetBaseArray = _libraries['msbsc70.dll'].BSCGetBaseArray -BSCGetBaseArray.restype = BOOL -BSCGetBaseArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetDervArray = _libraries['msbsc70.dll'].BSCGetDervArray -BSCGetDervArray.restype = BOOL -BSCGetDervArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetMembersArray = _libraries['msbsc70.dll'].BSCGetMembersArray -BSCGetMembersArray.restype = BOOL -BSCGetMembersArray.argtypes = [POINTER(Bsc), IINST, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetDefArray = _libraries['msbsc70.dll'].BSCGetDefArray -BSCGetDefArray.restype = BOOL -BSCGetDefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] -BSCGetRefArray = _libraries['msbsc70.dll'].BSCGetRefArray -BSCGetRefArray.restype = BOOL -BSCGetRefArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IREF)), POINTER(ULONG)] -BSCGetModuleContents = _libraries['msbsc70.dll'].BSCGetModuleContents -BSCGetModuleContents.restype = BOOL -BSCGetModuleContents.argtypes = [POINTER(Bsc), IMOD, MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCGetModuleByName = _libraries['msbsc70.dll'].BSCGetModuleByName -BSCGetModuleByName.restype = BOOL -BSCGetModuleByName.argtypes = [POINTER(Bsc), SZ, POINTER(IMOD)] -BSCGetAllModulesArray = _libraries['msbsc70.dll'].BSCGetAllModulesArray -BSCGetAllModulesArray.restype = BOOL -BSCGetAllModulesArray.argtypes = [POINTER(Bsc), POINTER(POINTER(IMOD)), POINTER(ULONG)] -BSCDisposeArray = _libraries['msbsc70.dll'].BSCDisposeArray -BSCDisposeArray.restype = None -BSCDisposeArray.argtypes = [POINTER(Bsc), c_void_p] -BSCFormatDname = _libraries['msbsc70.dll'].BSCFormatDname -BSCFormatDname.restype = SZ -BSCFormatDname.argtypes = [POINTER(Bsc), SZ] -BSCFInstFilter = _libraries['msbsc70.dll'].BSCFInstFilter -BSCFInstFilter.restype = BOOL -BSCFInstFilter.argtypes = [POINTER(Bsc), IINST, MBF] -BSCIinstFrIref = _libraries['msbsc70.dll'].BSCIinstFrIref -BSCIinstFrIref.restype = IINST -BSCIinstFrIref.argtypes = [POINTER(Bsc), IREF] -BSCIinstFrIdef = _libraries['msbsc70.dll'].BSCIinstFrIdef -BSCIinstFrIdef.restype = IINST -BSCIinstFrIdef.argtypes = [POINTER(Bsc), IDEF] -BSCIinstContextIref = _libraries['msbsc70.dll'].BSCIinstContextIref -BSCIinstContextIref.restype = IINST -BSCIinstContextIref.argtypes = [POINTER(Bsc), IREF] -BSCGetStatistics = _libraries['msbsc70.dll'].BSCGetStatistics -BSCGetStatistics.restype = BOOL -BSCGetStatistics.argtypes = [POINTER(Bsc), POINTER(BSC_STAT)] -BSCGetModuleStatistics = _libraries['msbsc70.dll'].BSCGetModuleStatistics -BSCGetModuleStatistics.restype = BOOL -BSCGetModuleStatistics.argtypes = [POINTER(Bsc), IMOD, POINTER(BSC_STAT)] -BSCFCaseSensitive = _libraries['msbsc70.dll'].BSCFCaseSensitive -BSCFCaseSensitive.restype = BOOL -BSCFCaseSensitive.argtypes = [POINTER(Bsc)] -BSCSetCaseSensitivity = _libraries['msbsc70.dll'].BSCSetCaseSensitivity -BSCSetCaseSensitivity.restype = BOOL -BSCSetCaseSensitivity.argtypes = [POINTER(Bsc), BOOL] -BSCGetAllGlobalsArray = _libraries['msbsc70.dll'].BSCGetAllGlobalsArray -BSCGetAllGlobalsArray.restype = BOOL -BSCGetAllGlobalsArray.argtypes = [POINTER(Bsc), MBF, POINTER(POINTER(IINST)), POINTER(ULONG)] -BSCSzFrAtr2 = _libraries['msbsc70.dll'].BSCSzFrAtr2 -BSCSzFrAtr2.restype = SZ -BSCSzFrAtr2.argtypes = [POINTER(Bsc), ATR32] -BSCIinstInfo2 = _libraries['msbsc70.dll'].BSCIinstInfo2 -BSCIinstInfo2.restype = BOOL -BSCIinstInfo2.argtypes = [POINTER(Bsc), IINST, POINTER(SZ), POINTER(TYP), POINTER(ATR32)] -BSCGetIinstByvalue2 = _libraries['msbsc70.dll'].BSCGetIinstByvalue2 -BSCGetIinstByvalue2.restype = BOOL -BSCGetIinstByvalue2.argtypes = [POINTER(Bsc), SZ, TYP, ATR32, POINTER(IINST)] -OpenBSCQuery = _libraries['msbsc70.dll'].OpenBSCQuery -OpenBSCQuery.restype = BOOL -OpenBSCQuery.argtypes = [POINTER(Bsc)] -CloseBSCQuery = _libraries['msbsc70.dll'].CloseBSCQuery -CloseBSCQuery.restype = BOOL -CloseBSCQuery.argtypes = [] -BOB = ULONG -InitBSCQuery = _libraries['msbsc70.dll'].InitBSCQuery -InitBSCQuery.restype = BOOL -InitBSCQuery.argtypes = [QY, BOB] -BobNext = _libraries['msbsc70.dll'].BobNext -BobNext.restype = BOB -BobNext.argtypes = [] -BobFrName = _libraries['msbsc70.dll'].BobFrName -BobFrName.restype = BOB -BobFrName.argtypes = [SZ] -LszNameFrBob = _libraries['msbsc70.dll'].LszNameFrBob -LszNameFrBob.restype = SZ -LszNameFrBob.argtypes = [BOB] -CLS = USHORT - -class enums: - class MBF(utils.enum): - NIL = 0x000 - VARS = 0x001 - FUNCS = 0x002 - MACROS = 0x004 - TYPES = 0x008 - CLASS = 0x010 - INCL = 0x020 - MSGMAP = 0x040 - DIALOGID = 0x080 - LIBRARY = 0x100 - IMPORT = 0x200 - TEMPLATE = 0x400 - NAMESPACE = 0x800 - ALL = 0xFFF - - class TYPES(utils.enum): - FUNCTION = 0x01 - LABEL = 0x02 - PARAMETER = 0x03 - VARIABLE = 0x04 - CONSTANT = 0x05 - MACRO = 0x06 - TYPEDEF = 0x07 - STRUCNAM = 0x08 - ENUMNAM = 0x09 - ENUMMEM = 0x0A - UNIONNAM = 0x0B - SEGMENT = 0x0C - GROUP = 0x0D - PROGRAM = 0x0E - CLASSNAM = 0x0F - MEMFUNC = 0x10 - MEMVAR = 0x11 - - class ATTRIBUTES(utils.enum): - LOCAL = 0x001 - STATIC = 0x002 - SHARED = 0x004 - NEAR = 0x008 - COMMON = 0x010 - DECL_ONLY = 0x020 - PUBLIC = 0x040 - NAMED = 0x080 - MODULE = 0x100 - VIRTUAL = 0x200 - PRIVATE = 0x400 - PROTECT = 0x800 - -class definition_t(object): - #represents some other symbol - def __init__( self, def_id, bsc ): - self.__bsc = bsc - self.__def_id = def_id - - @property - def def_id(self): - return self.__def_id - - @utils.cached - def location( self ): - module = STRING() - line = LINE() - 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 - def file_name(self): - return self.location[0].value - - @utils.cached - def line(self): - return self.location[1].value - - 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) ) - -class instance_t(object): - #represents some symbol - def __init__( self, inst_id, bsc ): - self.__bsc = bsc - self.__inst_id = inst_id - - @property - def inst_id(self): - return self.__inst_id - - @utils.cached - def name_type_attribute_mangled_name( self ): - name = STRING() - typ = TYP() - 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 ) - return undecorated_name, typ, attribute, name.value - - - @utils.cached - def mangled_name(self): - return self.name_type_attribute_mangled_name[3] - - @utils.cached - def name(self): - return self.name_type_attribute_mangled_name[0] - - @utils.cached - def type(self): - return self.name_type_attribute_mangled_name[1].value - - @utils.cached - def attribute(self): - return self.name_type_attribute_mangled_name[2].value - - 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 ) - return ', '.join( tmp ) - - - @utils.cached - def definitions( self ): - 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 ) - return definitions - - @utils.cached - def members( self ): - 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 ) - return instances - - @utils.cached - def used_symbols(self): - 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 ) - return instances - - @utils.cached - def base_classes(self): - 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 ) - return instances - - @utils.cached - def derived_classes(self): - 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 ) - return instances - -class module_t(object): - #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 - - @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) - 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 ) - return instances - -class bsc_reader_t( object ): - def __init__( self, bsc_file ): - self.logger = utils.loggers.pdb_reader - self.logger.setLevel(logging.INFO) - - 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 ) - - def __create_instance( self, inst_id ): - try: - return self.__instances_cache[ inst_id ] - except KeyError: - inst = instance_t( inst_id, self.__bsc ) - self.__instances_cache[ inst_id ] = inst - return inst - - def query_all_instances( self ): - instances_len = ULONG(0) - instances = pointer( IINST() ) - - if not BSCGetAllGlobalsArray( self.__bsc, enums.MBF.ALL, byref( instances ), byref( instances_len ) ): - raise RuntimeError( "Unable to load all globals symbols" ) - for i in range( instances_len.value ): - self.__instances.append( instances[i] ) - BSCDisposeArray( self.__bsc, instances ) - - @utils.cached - def is_case_sensitive( self ): - return bool( BSCFCaseSensitive( self.__bsc ) ) - - @utils.cached - def files(self): - 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" ) - - 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: - continue - print 'File: ', m.path - if m.instances: - print '\tInstances:' - for inst in m.instances: - print '\t\t', str(inst) - if inst.definitions: - print '\t\t\tDefinitions:' - for definition in inst.definitions: - print '\t\t\t\t', str( definition ) - if inst.members: - print '\t\t\tMembers:' - for member in inst.members: - print '\t\t\t\t', str( member ) - if inst.used_symbols: - print '\t\t\tUsed symbols:' - for used_symbol in inst.used_symbols: - print '\t\t\t\t', str( used_symbol ) - if inst.base_classes: - print '\t\t\tBase classes:' - for base_class in inst.base_classes: - print '\t\t\t\t', str( base_class ) - if inst.derived_classes: - 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 ) - -if __name__ == '__main__': - control_bsc = r'xxx.bsc' - reader = bsc_reader_t( control_bsc ) - reader.print_stat() - print 'is_case_sensitive', reader.is_case_sensitive - #~ reader.query_all_instances() - #reader.files - reader.print_classes( )#r'c:\dev\produce_pdb\produce_pdb.cpp') Added: pygccxml_dev/pygccxml/msvc/config.py =================================================================== --- pygccxml_dev/pygccxml/msvc/config.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/config.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -0,0 +1,62 @@ +import os +import sys +import comtypes +import comtypes.client +import _winreg as win_registry +from distutils import msvccompiler + +class binaries_searcher_t: + + def get_msbsc_path( self ): + relative_path = os.path.dirname( sys.modules[__name__].__file__) + absolute_path = os.path.abspath (relative_path) + return os.path.join( absolute_path, 'msbsc70.dll' ) + + def get_msvcr_path( self ): + relative_path = os.path.dirname( sys.modules[__name__].__file__) + absolute_path = os.path.abspath (relative_path) + return os.path.join( absolute_path, 'msvcr70.dll' ) + + def get_msdia_path( self ): + vss_installed = self.__get_installed_vs_dirs() + msdia_dlls = self.__get_msdia_dll_paths( vss_installed ) + if 1 == len(msdia_dlls): + return msdia_dlls[0] + else: + #TODO find the highest version and use it. + pass + + def __get_msdia_dll_paths( self, vss_installed ): + msdia_dlls = [] + for vs in vss_installed: + debug_dir = os.path.join( vs, 'Common7', 'Packages', 'Debugger' ) + files = filter( lambda f: f.startswith( 'msdia' ) and f.endswith( '.dll' ) + , os.listdir( debug_dir ) ) + if not files: + continue + msdia_dlls.extend([ os.path.join( debug_dir, f ) for f in files ]) + if not msdia_dlls: + raise RuntimeError( 'pygccxml unable to find out msdiaXX.dll location' ) + return msdia_dlls + + def __get_installed_vs_dirs( self ): + vs_reg_path = 'Software\Microsoft\VisualStudio\SxS\VS7' + values = self.read_values( win_registry.HKEY_LOCAL_MACHINE, vs_reg_path ) + return [ values.values()[0] ] + + def read_keys(self, base, key): + return msvccompiler.read_keys(base, key) + + def read_values(self, base, key): + return msvccompiler.read_values(base, key) + +bs = binaries_searcher_t() + +msdia_path = bs.get_msdia_path() +print 'msdia path: ', msdia_path + +msbsc_path = bs.get_msbsc_path() +print 'msbsc path: ', msbsc_path + +msvcr_path = bs.get_msvcr_path() +print 'msvcr path: ', msvcr_path Deleted: pygccxml_dev/pygccxml/msvc/details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/details.py 2008-03-12 11:59:29 UTC (rev 1277) +++ pygccxml_dev/pygccxml/msvc/details.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -1,77 +0,0 @@ -from msvc_details import msdia -from pygccxml import declarations - -def guess_class_type( udt_kind ): - if msdia.UdtKind.UdtStruct == udt_kind: - return declarations.CLASS_TYPES.STRUCT - elif msdia.UdtKind.UdtClass == udt_kind: - return declarations.CLASS_TYPES.CLASS - else: - return declarations.CLASS_TYPES.UNION - -def guess_access_type( access_type ): - if msdia.CV_access_e.CV_private == access_type: - return declarations.ACCESS_TYPES.PRIVATE - elif msdia.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 - self.__identifiers = self.__split_scope_identifiers() - self.__scope_identifiers = None - - @property - def name( self ): - return self.__identifiers[-1] - - @property - def scope_names( self ): - if None is self.__scope_identifiers: - self.__scope_identifiers = []# ['::'] - for i in range( len(self.__identifiers) - 1): - self.__scope_identifiers.append( '::'.join( self.__identifiers[0:i+1] ) ) - return self.__scope_identifiers - - @property - def identifiers( self ): - 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 - -__name_splitters = {} -def get_name_splitter( full_name ): - try: - return __name_splitters[full_name] - except KeyError: - splitter = full_name_splitter_t( full_name ) - __name_splitters[full_name] = splitter - return splitter - - -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 ) - for x in fnsp.scope_names: - print x - - fnsp = full_name_splitter_t( 'x' ) - for x in fnsp.scope_names: - print x Deleted: pygccxml_dev/pygccxml/msvc/msvc_details.py =================================================================== --- pygccxml_dev/pygccxml/msvc/msvc_details.py 2008-03-12 11:59:29 UTC (rev 1277) +++ pygccxml_dev/pygccxml/msvc/msvc_details.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -1,98 +0,0 @@ -import os -import sys -import comtypes -import comtypes.client -import _winreg as win_registry -from distutils import msvccompiler - - -class binaries_searcher_t: - - def get_msbsc_path( self ): - relative_path = os.path.dirname( sys.modules[__name__].__file__) - absolute_path = os.path.abspath (relative_path) - return os.path.join( absolute_path, 'msbsc70.dll' ) - - def get_msvcr_path( self ): - relative_path = os.path.dirname( sys.modules[__name__].__file__) - absolute_path = os.path.abspath (relative_path) - return os.path.join( absolute_path, 'msvcr70.dll' ) - - def get_msdia_path( self ): - vss_installed = self.__get_installed_vs_dirs() - msdia_dlls = self.__get_msdia_dll_paths( vss_installed ) - if 1 == len(msdia_dlls): - return msdia_dlls[0] - else: - #TODO find the highest version and use it. - pass - - def __get_msdia_dll_paths( self, vss_installed ): - msdia_dlls = [] - for vs in vss_installed: - debug_dir = os.path.join( vs, 'Common7', 'Packages', 'Debugger' ) - files = filter( lambda f: f.startswith( 'msdia' ) and f.endswith( '.dll' ) - , os.listdir( debug_dir ) ) - if not files: - continue - msdia_dlls.extend([ os.path.join( debug_dir, f ) for f in files ]) - if not msdia_dlls: - raise RuntimeError( 'pygccxml unable to find out msdiaXX.dll location' ) - return msdia_dlls - - def __get_installed_vs_dirs( self ): - vs_reg_path = 'Software\Microsoft\VisualStudio\SxS\VS7' - values = self.read_values( win_registry.HKEY_LOCAL_MACHINE, vs_reg_path ) - return [ values.values()[0] ] - - def read_keys(self, base, key): - return msvccompiler.read_keys(base, key) - - def read_values(self, base, key): - return msvccompiler.read_values(base, key) - -bs = binaries_searcher_t() - -msdia_path = bs.get_msdia_path() -print 'msdia path: ', msdia_path - -msbsc_path = bs.get_msbsc_path() -print 'msbsc path: ', msbsc_path - -msvcr_path = bs.get_msvcr_path() -print 'msvcr path: ', msvcr_path - -comtypes_client_gen_dir = comtypes.client.gen_dir -try: - comtypes.client.gen_dir = None - msdia = comtypes.client.GetModule( msdia_path ) -finally: - comtypes.client.gen_dir = comtypes_client_gen_dir - -#Adding code, that was not generated for some reason. - -class UdtKind: - UdtStruct, UdtClass, UdtUnion = (0, 1, 2) - -class CV_access_e: - CV_private, CV_protected, CV_public = (1, 2, 3) - -msdia.UdtKind = UdtKind -msdia.CV_access_e = CV_access_e - -class NameSearchOptions: - nsNone = 0 - nsfCaseSensitive = 0x1 - nsfCaseInsensitive = 0x2 - nsfFNameExt = 0x4 - nsfRegularExpression = 0x8 - nsfUndecoratedName = 0x10 - - # For backward compabibility: - nsCaseSensitive = nsfCaseSensitive - nsCaseInsensitive = nsfCaseInsensitive - nsFNameExt = nsfFNameExt - nsRegularExpression = nsfRegularExpression | nsfCaseSensitive - nsCaseInRegularExpression = nsfRegularExpression | nsfCaseInsensitive - -msdia.NameSearchOptions = NameSearchOptions Added: pygccxml_dev/pygccxml/msvc/pdb/__init__.py =================================================================== --- pygccxml_dev/pygccxml/msvc/pdb/__init__.py (rev 0) +++ pygccxml_dev/pygccxml/msvc/pdb/__init__.py 2008-03-12 21:03:41 UTC (rev 1278) @@ -0,0 +1,284 @@ +import os +import sys +import ctypes +import pprint +import logging +import comtypes +import comtypes.client + +from . import impl_details + +from ... import utils +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 + + + +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 ) + ... [truncated message content] |