# HG changeset patch # User paulb@jeremy # Date 1160178590 -7200 # Node ID 5d22daea10ab42fafc1560f04479da56a621ad09 # Parent 4ba865697143c8f90fd6e34746bb3feefcb3bb9c Added "full naming", replacing the id(self) usage. diff -r 4ba865697143 -r 5d22daea10ab simplified.py --- a/simplified.py Sat Oct 07 01:49:01 2006 +0200 +++ b/simplified.py Sat Oct 07 01:49:50 2006 +0200 @@ -24,6 +24,29 @@ from compiler.visitor import ASTVisitor import sys +# Unique name registration. + +class Naming: + def __init__(self): + self.obj_to_name = {} + self.names = {} + def get(self, obj): + return self.obj_to_name[obj] + def set(self, obj, name): + if self.obj_to_name.has_key(obj): + return + if not self.names.has_key(name): + self.names[name] = 0 + n = self.names[name] + 1 + self.names[name] = n + self.obj_to_name[obj] = "%s#%d" % (name, n) + +naming = Naming() + +def name(obj, name): + naming.set(obj, name) + return naming.get(obj) + # Elementary visitor support. class Visitor(ASTVisitor): @@ -94,14 +117,16 @@ setattr(self, name, value) def __repr__(self): - if hasattr(self, "name"): - return "%s '%s' (at %x)" % (self.__class__.__name__, self.name, id(self)) - if hasattr(self, "index"): + if hasattr(self, "full_name"): + return "%s '%s'" % (self.__class__.__name__, self.full_name) + elif hasattr(self, "name"): + return "%s '%s'" % (self.__class__.__name__, self.name) + elif hasattr(self, "index"): return "%s (%s)" % (self.__class__.__name__, self.index) elif hasattr(self, "value"): return "%s %s" % (self.__class__.__name__, repr(self.value)) elif hasattr(self, "ref"): - return "%s '%x' (at %x)" % (self.__class__.__name__, id(self.ref), id(self)) + return "%s '%s'" % (self.__class__.__name__, name(self.ref, self.ref.name)) else: return "%s" % (self.__class__.__name__,) @@ -175,8 +200,17 @@ self._pprint(indent + 2, "| ", "when %s: %s" % (ref, attribute), stream=stream) self._pprint(indent, "", "--------", stream=stream) -class Module(Node): "A Python module." -class Subprogram(Node): "A subprogram: functions, methods and loops." +class NamedNode(Node): + + "A named node." + + def __init__(self, *args, **kw): + Node.__init__(self, *args, **kw) + self.full_name = name(self, self.name or "$untitled") + +class Module(NamedNode): "A Python module." +class Subprogram(NamedNode): "A subprogram: functions, methods and loops." + class Pass(Node): "A placeholder node corresponding to pass." class Invoke(Node): "An invocation." @@ -216,9 +250,9 @@ def __repr__(self): if hasattr(self, "name"): - return "%s '%s' (at %x)" % (self.__class__.__name__, self.name, id(self)) + return "%s '%s'" % (self.__class__.__name__, name(self, self.name)) else: - return "%s (at %x)" % (self.__class__.__name__, id(self)) + return "%s" % (self.__class__.__name__,) class Class(Structure): diff -r 4ba865697143 -r 5d22daea10ab simplify.py --- a/simplify.py Sat Oct 07 01:49:01 2006 +0200 +++ b/simplify.py Sat Oct 07 01:49:50 2006 +0200 @@ -74,6 +74,10 @@ self.current_subprograms = [] # Current subprograms being processed. self.builtins = builtins # Whether the builtins are being processed. + # Convenience attributes. + + self.subnames = {} + # For compiler package mechanisms. self.visitor = self @@ -109,7 +113,7 @@ resulting program nodes. """ - result = Module(module) + result = Module(module, name="module") module_code = self.dispatch(module.node) # NOTE: Constant initialisation necessary for annotation but perhaps @@ -431,7 +435,7 @@ subprogram.code = results self.current_subprograms.pop() - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Make an invocation of the subprogram. @@ -491,7 +495,7 @@ subprogram.code = results self.current_subprograms.pop() - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Make an invocation of the subprogram. @@ -553,7 +557,7 @@ subprogram.code = results self.current_subprograms.pop() - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Make an invocation of the subprogram. @@ -883,7 +887,7 @@ subprogram.code = self.dispatch(class_.code) + [Return(class_)] self.current_subprograms.pop() - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Make a definition of the class associating it with a name. @@ -951,7 +955,7 @@ subprogram.params = params subprogram.star = star subprogram.dstar = dstar - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram def visitFunction(self, function): @@ -1038,7 +1042,7 @@ subprogram.code = [test] self.current_subprograms.pop() - self.subprograms.append(subprogram) + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Make an invocation of the subprogram. @@ -1102,8 +1106,8 @@ # Finish the subprogram definition. - self.subprograms.append(subprogram) self.current_subprograms.pop() + self.subprograms.append(subprogram); self.subnames[subprogram.full_name] = subprogram # Obtain an iterator for the sequence involved. # Then, make an invocation of the subprogram.