From 29bc02185a6839c924276cf60dd1cb418231f144 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Wed, 12 Nov 2008 08:02:56 +0100 Subject: [PATCH] fixed bug in Visitor cache, reduces lxml compile time by ~20% --- Cython/Compiler/Visitor.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Cython/Compiler/Visitor.py b/Cython/Compiler/Visitor.py index f8aad6b4..491f467b 100644 --- a/Cython/Compiler/Visitor.py +++ b/Cython/Compiler/Visitor.py @@ -14,26 +14,33 @@ class BasicVisitor(object): # instance. def __init__(self): self.dispatch_table = {} - + def visit(self, obj): - cls = obj.__class__ - m = self.dispatch_table.get(cls.__name__) - if m is None: + cls = type(obj) + try: + handler_method = self.dispatch_table[cls] + except KeyError: + #print "Cache miss for class %s in visitor %s" % ( + # cls.__name__, type(self).__name__) # Must resolve, try entire hierarchy pattern = "visit_%s" mro = inspect.getmro(cls) - for cls in mro: - m = getattr(self, pattern % cls.__name__, None) - if m is not None: + for mro_cls in mro: + try: + handler_method = getattr(self, pattern % mro_cls.__name__) break + except AttributeError: + pass else: print type(self), type(obj) - print self.access_path - print self.access_path[-1][0].pos - print self.access_path[-1][0].__dict__ + if hasattr(self, 'access_path'): + print self.access_path + print self.access_path[-1][0].pos + print self.access_path[-1][0].__dict__ raise RuntimeError("Visitor does not accept object: %s" % obj) - self.dispatch_table[cls.__name__] = m - return m(obj) + #print "Caching " + cls.__name__ + self.dispatch_table[cls] = handler_method + return handler_method(obj) class TreeVisitor(BasicVisitor): """ -- 2.26.2