1.1 --- a/simplify/generator.py Tue Aug 14 00:36:41 2007 +0200
1.2 +++ b/simplify/generator.py Tue Aug 28 00:59:09 2007 +0200
1.3 @@ -28,10 +28,11 @@
1.4
1.5 "An RSVP code generator."
1.6
1.7 - def __init__(self):
1.8 + def __init__(self, debug=0):
1.9
1.10 "Initialise the visitor."
1.11
1.12 + self.debug = debug
1.13 Visitor.__init__(self)
1.14 self.assemblers = []
1.15 self.current_assemblers = []
1.16 @@ -41,7 +42,7 @@
1.17 self.visitor = self
1.18
1.19 def get_code(self):
1.20 - return rsvp.get_image(*self.assemblers)
1.21 + return rsvp.get_merged(*self.assemblers)
1.22
1.23 def assembler(self):
1.24 return self.current_assemblers[-1]
1.25 @@ -55,7 +56,7 @@
1.26
1.27 self.module = module
1.28
1.29 - main = rsvp.RSVPAssembler(1)
1.30 + main = rsvp.RSVPAssembler(self.debug)
1.31 self.current_assemblers.append(main)
1.32
1.33 # Store constants.
1.34 @@ -103,18 +104,19 @@
1.35 # NOTE: consumption as parameters.
1.36
1.37 for subprogram in invoke.invocations:
1.38 - consumed_args = invoke.consumed_args[subprogram]
1.39 + prepare_args = not isinstance(invoke, InvokeRef) and not invoke.share_locals
1.40 + if prepare_args:
1.41 + consumed_args = invoke.consumed_args[subprogram]
1.42
1.43 - # NOTE: Generate switch table.
1.44 -
1.45 - # Save the current frame.
1.46 + # NOTE: Generate switch table.
1.47
1.48 - sub.add("SCF")
1.49 + # Save the current frame.
1.50 +
1.51 + sub.add("SCF")
1.52
1.53 - # Extend the stack for the arguments.
1.54 + # Extend the stack for the arguments.
1.55
1.56 - nparams = len(consumed_args)
1.57 - if not invoke.share_locals:
1.58 + nparams = len(consumed_args)
1.59 sub.add("ESF", nparams)
1.60
1.61 # For each argument, evaluate the expression.
1.62 @@ -137,7 +139,7 @@
1.63
1.64 sub.add("JAS", "sub$%s$%s" % (subprogram.module.name, subprogram.full_name()))
1.65
1.66 - if not invoke.share_locals:
1.67 + if prepare_args:
1.68 sub.add("PSF") # previous stack frame
1.69
1.70 visitInvokeFunction = visitInvoke
1.71 @@ -158,7 +160,7 @@
1.72
1.73 def process_subprogram(self, subprogram):
1.74
1.75 - sub = rsvp.RSVPAssembler(1)
1.76 + sub = rsvp.RSVPAssembler(self.debug)
1.77 self.current_assemblers.append(sub)
1.78
1.79 sub.label("sub$%s$%s" % (self.module.name, subprogram.full_name()))