Update of /cvsroot/pygccxml/source/pyplusplus/decl_wrappers
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30165/pyplusplus/decl_wrappers
Modified Files:
decl_wrapper.py namespace_wrapper.py scopedef_wrapper.py
Log Message:
improving "select" methods performance.
Now the performance is not a bottleneck any more
Index: namespace_wrapper.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/namespace_wrapper.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** namespace_wrapper.py 20 Mar 2006 05:47:56 -0000 1.3
--- namespace_wrapper.py 29 Mar 2006 04:23:45 -0000 1.4
***************
*** 13,19 ****
--- 13,21 ----
def namespace( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.namespace_t
return self._find_single( declarations.namespace_matcher_t, *args, **keywds )
def namespaces( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.namespace_t
return self._find_multiple( declarations.namespace_matcher_t, *args, **keywds )
Index: decl_wrapper.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/decl_wrapper.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** decl_wrapper.py 20 Mar 2006 05:47:56 -0000 1.3
--- decl_wrapper.py 29 Mar 2006 04:23:45 -0000 1.4
***************
*** 6,9 ****
--- 6,11 ----
from pygccxml import declarations
import algorithm
+ import sys
+ import logging
__REPOTED_REPLACES = []
***************
*** 14,17 ****
--- 16,26 ----
__REPOTED_REPLACES.append( msg )
+ #TODO: find better place for it
+ logger = logging.getLogger('pyplusplus')
+ __handler = logging.StreamHandler(sys.stdout)
+ __handler.setFormatter( logging.Formatter('%(message)s') )
+ logger.addHandler(__handler)
+ logger.setLevel(logging.DEBUG)
+
class ERROR_BEHAVIOUR:
PRINT = 'print'
Index: scopedef_wrapper.py
===================================================================
RCS file: /cvsroot/pygccxml/source/pyplusplus/decl_wrappers/scopedef_wrapper.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** scopedef_wrapper.py 20 Mar 2006 05:47:56 -0000 1.4
--- scopedef_wrapper.py 29 Mar 2006 04:23:45 -0000 1.5
***************
*** 7,18 ****
from pygccxml import declarations
import mdecl_wrapper
class scopedef_t(decl_wrapper.decl_wrapper_t):
!
! RECURSIVE_DEFAULT = True
!
def __init__(self):
decl_wrapper.decl_wrapper_t.__init__( self )
def exclude( self ):
self.ignore = True
--- 7,88 ----
from pygccxml import declarations
import mdecl_wrapper
+ from sets import Set as set
+ import time
class scopedef_t(decl_wrapper.decl_wrapper_t):
! RECURSIVE_DEFAULT = True
def __init__(self):
decl_wrapper.decl_wrapper_t.__init__( self )
+
+ self.__optimized = False
+ self.__type2decls = {}
+ self.__type2name2decls = {}
+ self.__type2decls_nr = {}
+ self.__type2name2decls_nr = {}
+ self.__all_decls = None
+
+ def __decl_types( self, decl ):
+ types = []
+ bases = list( decl.__class__.__bases__ )
+ visited = set()
+ while bases:
+ base = bases.pop()
+ if 'pygccxml' not in base.__module__:
+ continue
+ if base in visited:
+ continue
+ types.append( base )
+ bases.extend( base.__bases__ )
+ return types
+ def init_optimizer(self):
+ #start_time = time.clock()
+
+ decl_types = [ declarations.declaration_t
+ , declarations.scopedef_t
+ , declarations.enumeration_t
+ , declarations.namespace_t
+ , declarations.class_t
+ , declarations.class_declaration_t
+ , declarations.typedef_t
+ , declarations.variable_t
+ , declarations.calldef_t
+ , declarations.member_calldef_t
+ , declarations.free_calldef_t
+ , declarations.operator_t
+ , declarations.member_function_t
+ , declarations.constructor_t
+ , declarations.destructor_t
+ , declarations.member_operator_t
+ , declarations.casting_operator_t
+ , declarations.free_function_t
+ , declarations.free_operator_t ]
+ for dtype in decl_types:
+ self.__type2decls[ dtype ] = []
+ self.__type2decls_nr[ dtype ] = []
+ self.__type2name2decls[ dtype ] = {}
+ self.__type2name2decls_nr[ dtype ] = {}
+
+ self.__all_decls = declarations.make_flatten( self.declarations )
+ for decl in self.__all_decls:
+ types = self.__decl_types( decl )
+ for type_ in types:
+ self.__type2decls[ type_ ].append( decl )
+ name2decls = self.__type2name2decls[ type_ ]
+ if not name2decls.has_key( decl.name ):
+ name2decls[ decl.name ] = []
+ name2decls[ decl.name ].append( decl )
+ if self is decl.parent:
+ self.__type2decls_nr[ type_ ].append( decl )
+ name2decls_nr = self.__type2name2decls_nr[ type_ ]
+ if not name2decls_nr.has_key( decl.name ):
+ name2decls_nr[ decl.name ] = []
+ name2decls_nr[ decl.name ].append( decl )
+
+ #decl_wrapper.logger.info( 'Time took to optimize data strucutres:
+ #print 'time taken : ', time.clock() - start_time, ' seconds'
+
+ self.__optimized = True
+
def exclude( self ):
self.ignore = True
***************
*** 24,46 ****
def __create_matcher( self, match_class, *args, **keywds ):
if len( args ) == 1 and callable( args[0] ):
! matcher = match_class( [], **keywds)
return lambda decl: matcher( decl ) and args[0](decl)
else:
if 1 == len( args ) and isinstance( args[0], str ):
! keywds['name'] = args[0]
! args = []
! return match_class(*args, **keywds)
def _find_single( self, match_class, *args, **keywds ):
matcher = self.__create_matcher( match_class, *args, **keywds )
! recursive = keywds.get( 'recursive', scopedef_t.RECURSIVE_DEFAULT )
! return declarations.matcher.get_single( matcher, self.declarations, recursive )
def _find_multiple( self, match_class, *args, **keywds ):
matcher = self.__create_matcher( match_class, *args, **keywds )
! recursive = keywds.get( 'recursive', scopedef_t.RECURSIVE_DEFAULT )
! found = declarations.matcher.find( matcher, self.declarations, recursive )
! return mdecl_wrapper.mdecl_wrapper_t( found )
def decl( self, *args, **keywds ):
--- 94,169 ----
def __create_matcher( self, match_class, *args, **keywds ):
+ matcher = match_class( **keywds )
if len( args ) == 1 and callable( args[0] ):
! decl_wrapper.logger.info( 'running query: %s and <user defined function>' % str( matcher ) )
return lambda decl: matcher( decl ) and args[0](decl)
else:
if 1 == len( args ) and isinstance( args[0], str ):
! matcher.name = args[0]
! decl_wrapper.logger.info( 'running query: %s' % str( matcher ) )
! return matcher
!
! def __does_query_has_type( self, **keywds ):
! return keywds.has_key( 'decl_type' )
!
! def __does_query_has_type_and_name( self, *args, **keywds ):
! if len(args) != 1:
! return False
! if not isinstance( args[0], str ):
! return False
! return self.__does_query_has_type_and_name( **keywds )
!
! def __findout_range( self, matcher, *args, **keywds ):
! recursive = keywds.get( 'recursive', scopedef_t.RECURSIVE_DEFAULT )
!
! if not self.__optimized:
! decl_wrapper.logger.info( 'running non optimized query - optimization has not been done' )
! decls = self.declarations
! if recursive:
! decls = declarations.make_flatten( self.declarations )
! return decls
!
! if self.__does_query_has_type_and_name( *args, **keywds ):
! name = matcher.name
! if matcher.is_full_name():
! name = matcher.decl_name_only()
! if recursive:
! decl_wrapper.logger.info( 'running type + name optimized query recursively' )
! return self.__type2name2decls[ keywds['decl_type'] ][ name ]
! else:
! decl_wrapper.logger.info( 'running type + name optimized query non recursively' )
! return self.__type2name2decls_nr[ keywds['decl_type'] ][ name ]
! elif self.__does_query_has_type( **keywds ):
! if recursive:
! decl_wrapper.logger.info( 'running type optimized query recursively' )
! return self.__type2decls[ keywds['decl_type'] ]
! else:
! decl_wrapper.logger.info( 'running type optimized query non recursively' )
! return self.__type2decls_nr[ keywds['decl_type'] ]
! else:
! decl_wrapper.logger.info( 'running non optimized query - query is more complex then type + name' )
! if recursive:
! return self.__all_decls
! else:
! return self.declarations
def _find_single( self, match_class, *args, **keywds ):
+ decl_wrapper.logger.info( 'running query - started' )
+ start_time = time.clock()
matcher = self.__create_matcher( match_class, *args, **keywds )
! decls = self.__findout_range( matcher, *args, **keywds )
! found = declarations.matcher.get_single( matcher, decls, False )
! decl_wrapper.logger.info( 'query execution took : %f seconds' % ( time.clock() - start_time ) )
! decl_wrapper.logger.info( 'running query - done' )
! return found
def _find_multiple( self, match_class, *args, **keywds ):
+ start_time = time.clock()
matcher = self.__create_matcher( match_class, *args, **keywds )
! decls = self.__findout_range( matcher, *args, **keywds )
! found = declarations.matcher.find( matcher, decls, False )
! mfound = mdecl_wrapper.mdecl_wrapper_t( found )
! decl_wrapper.logger.info( 'query execution took : %f seconds' % ( time.clock() - start_time ) )
! return mfound
def decl( self, *args, **keywds ):
***************
*** 59,77 ****
--- 182,206 ----
def variable( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.variable_t
return self._find_single( declarations.variable_matcher_t, *args, **keywds )
def variables( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.variable_t
return self._find_multiple( declarations.variable_matcher_t, *args, **keywds )
def calldef( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.calldef_t
return self._find_single( declarations.calldef_matcher_t, *args, **keywds )
def calldefs( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.calldef_t
return self._find_multiple( declarations.calldef_matcher_t, *args, **keywds )
def operator( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.operator_t
return self._find_single( declarations.operator_matcher_t, *args, **keywds )
def operators( self, *args, **keywds ):
+ keywds['decl_type'] = declarations.operator_t
return self._find_multiple( declarations.operator_matcher_t, *args, **keywds )
|