# HG changeset patch # User Paul Boddie # Date 1188255549 -7200 # Node ID 2c3c8a3cee4573ced7dfdd6c0fef44c10a641c27 # Parent 7747766e42deedf3e0c4c09fe621a031f9d8636d Improved presentation of RSVP code including label information. Made minor adjustments to invocation processing when generating code. Added code generation to the test program. diff -r 7747766e42de -r 2c3c8a3cee45 rsvp.py --- a/rsvp.py Tue Aug 14 00:36:41 2007 +0200 +++ b/rsvp.py Tue Aug 28 00:59:09 2007 +0200 @@ -507,15 +507,22 @@ self.memory += assembler.memory self.add_labels(assembler.labels, assembler.label_users, label_base) -def dump(memory): + def get_reverse_labels(self): + return dict([(value, key) for (key, value) in self.labels.items()]) + + def dump(self): + dump(self.memory, self.get_reverse_labels()) + +def dump(memory, reverse_labels=None): + reverse_labels = reverse_labels or {} for i in range(0, len(memory)): - print "%8d %s" % (i, memory[i]) + print "%50s %8d %s" % (reverse_labels.get(i, ""), i, memory[i]) -def get_image(*assemblers): +def get_merged(*assemblers): merged_assembler = RSVPAssembler() for assembler in assemblers: merged_assembler.merge(assembler) - return merged_assembler.memory + return merged_assembler def test_fact(n, debug=0): @@ -574,11 +581,10 @@ fact_assembler.label("$1") fact_assembler.add(1) - memory = get_image(main_assembler, fact_assembler) + merged = get_merged(main_assembler, fact_assembler) + merged.dump() - dump(memory) - - proc = RSVPMachine(memory, debug=debug) + proc = RSVPMachine(merged.memory, debug=debug) proc.execute() def test_empty(debug=0): diff -r 7747766e42de -r 2c3c8a3cee45 simplify/generator.py --- a/simplify/generator.py Tue Aug 14 00:36:41 2007 +0200 +++ b/simplify/generator.py Tue Aug 28 00:59:09 2007 +0200 @@ -28,10 +28,11 @@ "An RSVP code generator." - def __init__(self): + def __init__(self, debug=0): "Initialise the visitor." + self.debug = debug Visitor.__init__(self) self.assemblers = [] self.current_assemblers = [] @@ -41,7 +42,7 @@ self.visitor = self def get_code(self): - return rsvp.get_image(*self.assemblers) + return rsvp.get_merged(*self.assemblers) def assembler(self): return self.current_assemblers[-1] @@ -55,7 +56,7 @@ self.module = module - main = rsvp.RSVPAssembler(1) + main = rsvp.RSVPAssembler(self.debug) self.current_assemblers.append(main) # Store constants. @@ -103,18 +104,19 @@ # NOTE: consumption as parameters. for subprogram in invoke.invocations: - consumed_args = invoke.consumed_args[subprogram] + prepare_args = not isinstance(invoke, InvokeRef) and not invoke.share_locals + if prepare_args: + consumed_args = invoke.consumed_args[subprogram] - # NOTE: Generate switch table. - - # Save the current frame. + # NOTE: Generate switch table. - sub.add("SCF") + # Save the current frame. + + sub.add("SCF") - # Extend the stack for the arguments. + # Extend the stack for the arguments. - nparams = len(consumed_args) - if not invoke.share_locals: + nparams = len(consumed_args) sub.add("ESF", nparams) # For each argument, evaluate the expression. @@ -137,7 +139,7 @@ sub.add("JAS", "sub$%s$%s" % (subprogram.module.name, subprogram.full_name())) - if not invoke.share_locals: + if prepare_args: sub.add("PSF") # previous stack frame visitInvokeFunction = visitInvoke @@ -158,7 +160,7 @@ def process_subprogram(self, subprogram): - sub = rsvp.RSVPAssembler(1) + sub = rsvp.RSVPAssembler(self.debug) self.current_assemblers.append(sub) sub.label("sub$%s$%s" % (self.module.name, subprogram.full_name())) diff -r 7747766e42de -r 2c3c8a3cee45 test.py --- a/test.py Tue Aug 14 00:36:41 2007 +0200 +++ b/test.py Tue Aug 28 00:59:09 2007 +0200 @@ -17,6 +17,7 @@ import simplify.viewer from simplify import Importer + import simplify.generator importer = Importer(["lib"] + sys.path, "-na" not in sys.argv) builtins = importer.load_from_file(os.path.join("lib", "builtins.py")) @@ -25,5 +26,8 @@ importer.fix_instances() if "-d" in sys.argv: simplify.viewer.makedocs(sys.argv[1], importer.get_modules(), distinct=("-i" in sys.argv)) + if "-g" in sys.argv: + code = simplify.generator.generate(module) + code.dump() # vim: tabstop=4 expandtab shiftwidth=4