Revision: 1589
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1589&view=rev
Author: roman_yakovenko
Date: 2009-01-19 12:38:29 +0000 (Mon, 19 Jan 2009)
Log Message:
-----------
fixing performance issue
Modified Paths:
--------------
pygccxml_dev/pygccxml/parser/patcher.py
pygccxml_dev/pygccxml/parser/scanner.py
pygccxml_dev/pygccxml/parser/source_reader.py
Modified: pygccxml_dev/pygccxml/parser/patcher.py
===================================================================
--- pygccxml_dev/pygccxml/parser/patcher.py 2009-01-18 21:12:45 UTC (rev 1588)
+++ pygccxml_dev/pygccxml/parser/patcher.py 2009-01-19 12:38:29 UTC (rev 1589)
@@ -11,7 +11,7 @@
def __init__( self, enums ):
object.__init__( self )
self.__enums = enums
-
+
def __call__(self, decl):
for arg in decl.arguments:
if not arg.default_value:
@@ -26,7 +26,7 @@
elif self.__is_unqualified_enum( func, arg ):
return self.__fix_unqualified_enum
elif self.__is_double_call( func, arg ):
- return self.__fix_double_call
+ return self.__fix_double_call
elif self.__is_invalid_integral( func, arg ):
return self.__fix_invalid_integral
elif self.__is_constructor_call( func, arg ):
@@ -39,9 +39,9 @@
return '::' + suffix
else:
return prefix + '::' + suffix
-
+
def __is_unqualified_enum(self, func, arg):
- type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) )
+ type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) )
if not declarations.is_enum( type_ ):
return False
enum_type = declarations.enum_declaration( type_ )
@@ -53,7 +53,7 @@
return self.__join_names( enum_type.parent.decl_string, arg.default_value )
def __is_invalid_integral(self, func, arg):
- type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) )
+ type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) )
if not declarations.is_integral( type_ ):
return False
try:
@@ -68,7 +68,7 @@
return arg.default_value
except:
pass
-
+
try:
int( arg.default_value, 16 )
if 64 == utils.get_architecture():
@@ -83,7 +83,7 @@
return '0x' + default_value
except:
pass
-
+
#may be we deal with enum
parent = func.parent
while parent:
@@ -103,7 +103,7 @@
#this algorithm could be improved: it could take into account
#1. unnamed namespaced
#2. location within files
-
+
for enum in self.__enums:
if enum.parent is scope and enum.has_value_name( default_value ):
return enum
@@ -121,7 +121,7 @@
args1 = call_invocation.args( dv[ found1[0] : found1[1] + 1 ] )
args2 = call_invocation.args( dv[ found2[0] : found2[1] + 1 ] )
return len(args1) == len(args2)
-
+
def __fix_double_call( self, func, arg ):
call_invocation = declarations.call_invocation
dv = arg.default_value
@@ -167,7 +167,7 @@
, decl.name )
else:
f_q_name = self.__join_names( declarations.full_name( decl.parent ), name )
-
+
return call_invocation.join( f_q_name, args )
class casting_operator_patcher_t( object ):
@@ -186,9 +186,3 @@
default_arg_patcher( decl )
if isinstance( decl, declarations.casting_operator_t):
_casting_oper_patcher_( decl )
-
-def fix_mangled( decls ):
- suffix = ' *INTERNAL* '
- for d in decls:
- if d.mangled and d.mangled.endswith( suffix ):
- d.mangled = d.mangled[:-len( suffix )]
Modified: pygccxml_dev/pygccxml/parser/scanner.py
===================================================================
--- pygccxml_dev/pygccxml/parser/scanner.py 2009-01-18 21:12:45 UTC (rev 1588)
+++ pygccxml_dev/pygccxml/parser/scanner.py 2009-01-19 12:38:29 UTC (rev 1589)
@@ -149,9 +149,11 @@
self.__inst = None
#mapping from id to members
self.__members = {}
-
self.__compiler = None
+ self.__mangled_suffix = ' *INTERNAL* '
+ self.__mangled_suffix_len = len( self.__mangled_suffix )
+
def read( self ):
xml.sax.parse( self.gccxml_file, self )
@@ -257,7 +259,11 @@
decl.is_artificial = attrs.get( XML_AN_ARTIFICIAL, False )
def __read_mangled( self, decl, attrs ):
- decl.mangled = attrs.get( XML_AN_MANGLED, None )
+ mangled = attrs.get( XML_AN_MANGLED, None )
+ #the following patch is defined here for performance reasons
+ if isinstance( mangled, types.StringType ) and mangled.endswith( self.__mangled_suffix ):
+ mangled = mangled[:self.__mangled_suffix_len]
+ decl.mangled = mangled
def __read_demangled( self, decl, attrs ):
decl.demangled = attrs.get( XML_AN_DEMANGLED, None )
Modified: pygccxml_dev/pygccxml/parser/source_reader.py
===================================================================
--- pygccxml_dev/pygccxml/parser/source_reader.py 2009-01-18 21:12:45 UTC (rev 1588)
+++ pygccxml_dev/pygccxml/parser/source_reader.py 2009-01-19 12:38:29 UTC (rev 1589)
@@ -316,7 +316,6 @@
#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() )
- patcher.fix_mangled( decls.itervalues() )
decls = filter( lambda inst: isinstance( inst, namespace_t ) and not inst.parent
, decls.itervalues() )
return ( decls, files.values() )
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|