[pypy-svn] r13910 - pypy/dist/pypy/objspace/flow

pedronis at codespeak.net pedronis at codespeak.net
Sun Jun 26 03:18:34 CEST 2005


Author: pedronis
Date: Sun Jun 26 03:18:32 2005
New Revision: 13910

Modified:
   pypy/dist/pypy/objspace/flow/model.py
Log:
leaner visit



Modified: pypy/dist/pypy/objspace/flow/model.py
==============================================================================
--- pypy/dist/pypy/objspace/flow/model.py	(original)
+++ pypy/dist/pypy/objspace/flow/model.py	Sun Jun 26 03:18:32 2005
@@ -330,11 +330,6 @@
 import inspect   # for getmro
 
 class traverse:
-    edgedef = {
-        FunctionGraph : ('startblock',),
-        Block : ('exits',),
-        Link : ('target',),
-        }
 
     def __init__(self, visitor, functiongraph):
         """ send the visitor over all (reachable) nodes. 
@@ -342,6 +337,7 @@
             or otherwise is callable itself.  
         """
         self.visitor = visitor
+        self.visitor_cache = {}
         self.seen = {}
         self.visit(functiongraph)
 
@@ -351,26 +347,32 @@
 
         # do the visit
         cls = node.__class__
-        for subclass in inspect.getmro(cls):
-            consume = getattr(self.visitor, "visit_" + subclass.__name__, None)
-            if consume:
-                break
-        else:
-            consume = getattr(self.visitor, 'visit', self.visitor)
+        try:
+            consume = self.visitor_cache[cls]
+        except KeyError:
+            for subclass in inspect.getmro(cls):
+                consume = getattr(self.visitor, "visit_" + subclass.__name__, None)
+                if consume:
+                    break
+            else:
+                consume = getattr(self.visitor, 'visit', self.visitor)
+
+                assert callable(consume), "visitor not found for %r on %r" % (cls, self.visitor)
+
+                self.visitor_cache[cls] = consume
 
-        assert callable(consume), "visitor not found for %r on %r" % (cls, self.visitor)
         self.seen[id(node)] = consume(node)
 
         # recurse
-        for dispclass, attrs in self.edgedef.items():
-            for subclass in inspect.getmro(cls):
-                if subclass == dispclass:
-                    for attr in attrs:
-                        for obj in flattenobj(getattr(node, attr)):
-                            self.visit(obj)
-                    return
-
-        raise ValueError, "could not dispatch %r" % cls
+        if isinstance(node, Block):
+            for obj in node.exits:
+                self.visit(obj)
+        elif isinstance(node, Link):
+            self.visit(node.target)
+        elif isinstance(node, FunctionGraph):
+            self.visit(node.startblock)
+        else:
+            raise ValueError, "could not dispatch %r" % cls
 
 def flatten(funcgraph):
     l = []



More information about the Pypy-commit mailing list