1.1 --- a/simplified.py Sat Oct 07 01:49:01 2006 +0200
1.2 +++ b/simplified.py Sat Oct 07 01:49:50 2006 +0200
1.3 @@ -24,6 +24,29 @@
1.4 from compiler.visitor import ASTVisitor
1.5 import sys
1.6
1.7 +# Unique name registration.
1.8 +
1.9 +class Naming:
1.10 + def __init__(self):
1.11 + self.obj_to_name = {}
1.12 + self.names = {}
1.13 + def get(self, obj):
1.14 + return self.obj_to_name[obj]
1.15 + def set(self, obj, name):
1.16 + if self.obj_to_name.has_key(obj):
1.17 + return
1.18 + if not self.names.has_key(name):
1.19 + self.names[name] = 0
1.20 + n = self.names[name] + 1
1.21 + self.names[name] = n
1.22 + self.obj_to_name[obj] = "%s#%d" % (name, n)
1.23 +
1.24 +naming = Naming()
1.25 +
1.26 +def name(obj, name):
1.27 + naming.set(obj, name)
1.28 + return naming.get(obj)
1.29 +
1.30 # Elementary visitor support.
1.31
1.32 class Visitor(ASTVisitor):
1.33 @@ -94,14 +117,16 @@
1.34 setattr(self, name, value)
1.35
1.36 def __repr__(self):
1.37 - if hasattr(self, "name"):
1.38 - return "%s '%s' (at %x)" % (self.__class__.__name__, self.name, id(self))
1.39 - if hasattr(self, "index"):
1.40 + if hasattr(self, "full_name"):
1.41 + return "%s '%s'" % (self.__class__.__name__, self.full_name)
1.42 + elif hasattr(self, "name"):
1.43 + return "%s '%s'" % (self.__class__.__name__, self.name)
1.44 + elif hasattr(self, "index"):
1.45 return "%s (%s)" % (self.__class__.__name__, self.index)
1.46 elif hasattr(self, "value"):
1.47 return "%s %s" % (self.__class__.__name__, repr(self.value))
1.48 elif hasattr(self, "ref"):
1.49 - return "%s '%x' (at %x)" % (self.__class__.__name__, id(self.ref), id(self))
1.50 + return "%s '%s'" % (self.__class__.__name__, name(self.ref, self.ref.name))
1.51 else:
1.52 return "%s" % (self.__class__.__name__,)
1.53
1.54 @@ -175,8 +200,17 @@
1.55 self._pprint(indent + 2, "| ", "when %s: %s" % (ref, attribute), stream=stream)
1.56 self._pprint(indent, "", "--------", stream=stream)
1.57
1.58 -class Module(Node): "A Python module."
1.59 -class Subprogram(Node): "A subprogram: functions, methods and loops."
1.60 +class NamedNode(Node):
1.61 +
1.62 + "A named node."
1.63 +
1.64 + def __init__(self, *args, **kw):
1.65 + Node.__init__(self, *args, **kw)
1.66 + self.full_name = name(self, self.name or "$untitled")
1.67 +
1.68 +class Module(NamedNode): "A Python module."
1.69 +class Subprogram(NamedNode): "A subprogram: functions, methods and loops."
1.70 +
1.71 class Pass(Node): "A placeholder node corresponding to pass."
1.72
1.73 class Invoke(Node): "An invocation."
1.74 @@ -216,9 +250,9 @@
1.75
1.76 def __repr__(self):
1.77 if hasattr(self, "name"):
1.78 - return "%s '%s' (at %x)" % (self.__class__.__name__, self.name, id(self))
1.79 + return "%s '%s'" % (self.__class__.__name__, name(self, self.name))
1.80 else:
1.81 - return "%s (at %x)" % (self.__class__.__name__, id(self))
1.82 + return "%s" % (self.__class__.__name__,)
1.83
1.84 class Class(Structure):
1.85