[pygccxml-commit] SF.net SVN: pygccxml:[1589] pygccxml_dev/pygccxml/parser
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-01-19 12:38:39
|
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. |