[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