1.1 --- a/rsvp.py Tue Aug 14 00:36:41 2007 +0200
1.2 +++ b/rsvp.py Tue Aug 28 00:59:09 2007 +0200
1.3 @@ -507,15 +507,22 @@
1.4 self.memory += assembler.memory
1.5 self.add_labels(assembler.labels, assembler.label_users, label_base)
1.6
1.7 -def dump(memory):
1.8 + def get_reverse_labels(self):
1.9 + return dict([(value, key) for (key, value) in self.labels.items()])
1.10 +
1.11 + def dump(self):
1.12 + dump(self.memory, self.get_reverse_labels())
1.13 +
1.14 +def dump(memory, reverse_labels=None):
1.15 + reverse_labels = reverse_labels or {}
1.16 for i in range(0, len(memory)):
1.17 - print "%8d %s" % (i, memory[i])
1.18 + print "%50s %8d %s" % (reverse_labels.get(i, ""), i, memory[i])
1.19
1.20 -def get_image(*assemblers):
1.21 +def get_merged(*assemblers):
1.22 merged_assembler = RSVPAssembler()
1.23 for assembler in assemblers:
1.24 merged_assembler.merge(assembler)
1.25 - return merged_assembler.memory
1.26 + return merged_assembler
1.27
1.28 def test_fact(n, debug=0):
1.29
1.30 @@ -574,11 +581,10 @@
1.31 fact_assembler.label("$1")
1.32 fact_assembler.add(1)
1.33
1.34 - memory = get_image(main_assembler, fact_assembler)
1.35 + merged = get_merged(main_assembler, fact_assembler)
1.36 + merged.dump()
1.37
1.38 - dump(memory)
1.39 -
1.40 - proc = RSVPMachine(memory, debug=debug)
1.41 + proc = RSVPMachine(merged.memory, debug=debug)
1.42 proc.execute()
1.43
1.44 def test_empty(debug=0):
2.1 --- a/simplify/generator.py Tue Aug 14 00:36:41 2007 +0200
2.2 +++ b/simplify/generator.py Tue Aug 28 00:59:09 2007 +0200
2.3 @@ -28,10 +28,11 @@
2.4
2.5 "An RSVP code generator."
2.6
2.7 - def __init__(self):
2.8 + def __init__(self, debug=0):
2.9
2.10 "Initialise the visitor."
2.11
2.12 + self.debug = debug
2.13 Visitor.__init__(self)
2.14 self.assemblers = []
2.15 self.current_assemblers = []
2.16 @@ -41,7 +42,7 @@
2.17 self.visitor = self
2.18
2.19 def get_code(self):
2.20 - return rsvp.get_image(*self.assemblers)
2.21 + return rsvp.get_merged(*self.assemblers)
2.22
2.23 def assembler(self):
2.24 return self.current_assemblers[-1]
2.25 @@ -55,7 +56,7 @@
2.26
2.27 self.module = module
2.28
2.29 - main = rsvp.RSVPAssembler(1)
2.30 + main = rsvp.RSVPAssembler(self.debug)
2.31 self.current_assemblers.append(main)
2.32
2.33 # Store constants.
2.34 @@ -103,18 +104,19 @@
2.35 # NOTE: consumption as parameters.
2.36
2.37 for subprogram in invoke.invocations:
2.38 - consumed_args = invoke.consumed_args[subprogram]
2.39 + prepare_args = not isinstance(invoke, InvokeRef) and not invoke.share_locals
2.40 + if prepare_args:
2.41 + consumed_args = invoke.consumed_args[subprogram]
2.42
2.43 - # NOTE: Generate switch table.
2.44 -
2.45 - # Save the current frame.
2.46 + # NOTE: Generate switch table.
2.47
2.48 - sub.add("SCF")
2.49 + # Save the current frame.
2.50 +
2.51 + sub.add("SCF")
2.52
2.53 - # Extend the stack for the arguments.
2.54 + # Extend the stack for the arguments.
2.55
2.56 - nparams = len(consumed_args)
2.57 - if not invoke.share_locals:
2.58 + nparams = len(consumed_args)
2.59 sub.add("ESF", nparams)
2.60
2.61 # For each argument, evaluate the expression.
2.62 @@ -137,7 +139,7 @@
2.63
2.64 sub.add("JAS", "sub$%s$%s" % (subprogram.module.name, subprogram.full_name()))
2.65
2.66 - if not invoke.share_locals:
2.67 + if prepare_args:
2.68 sub.add("PSF") # previous stack frame
2.69
2.70 visitInvokeFunction = visitInvoke
2.71 @@ -158,7 +160,7 @@
2.72
2.73 def process_subprogram(self, subprogram):
2.74
2.75 - sub = rsvp.RSVPAssembler(1)
2.76 + sub = rsvp.RSVPAssembler(self.debug)
2.77 self.current_assemblers.append(sub)
2.78
2.79 sub.label("sub$%s$%s" % (self.module.name, subprogram.full_name()))
3.1 --- a/test.py Tue Aug 14 00:36:41 2007 +0200
3.2 +++ b/test.py Tue Aug 28 00:59:09 2007 +0200
3.3 @@ -17,6 +17,7 @@
3.4
3.5 import simplify.viewer
3.6 from simplify import Importer
3.7 + import simplify.generator
3.8
3.9 importer = Importer(["lib"] + sys.path, "-na" not in sys.argv)
3.10 builtins = importer.load_from_file(os.path.join("lib", "builtins.py"))
3.11 @@ -25,5 +26,8 @@
3.12 importer.fix_instances()
3.13 if "-d" in sys.argv:
3.14 simplify.viewer.makedocs(sys.argv[1], importer.get_modules(), distinct=("-i" in sys.argv))
3.15 + if "-g" in sys.argv:
3.16 + code = simplify.generator.generate(module)
3.17 + code.dump()
3.18
3.19 # vim: tabstop=4 expandtab shiftwidth=4