1.1 --- a/micropython/ast.py Sat May 16 01:34:03 2009 +0200
1.2 +++ b/micropython/ast.py Sun May 17 00:58:27 2009 +0200
1.3 @@ -593,15 +593,32 @@
1.4 # Visiting of the code occurs when get_code is invoked on this node.
1.5
1.6 else:
1.7 + body_block = self.new_block()
1.8 +
1.9 + # Check frames using the function's details.
1.10 +
1.11 + fn = node.unit
1.12 + nparams = len(fn.positional_names)
1.13 + ndefaults = len(fn.defaults)
1.14 +
1.15 + self.new_op(CheckFrame((nparams, ndefaults, fn.has_star)))
1.16 + self.new_op(FillDefaults((nparams, ndefaults)))
1.17 +
1.18 + # Produce the body.
1.19 +
1.20 + self.set_block(body_block)
1.21 +
1.22 extend = ExtendFrame()
1.23 self.new_op(extend)
1.24
1.25 self.dispatch(node.code)
1.26 +
1.27 if not isinstance(self.last_op(), Return):
1.28 self.dispatch(compiler.ast.Name("None"))
1.29 self.new_op(StoreResult())
1.30 + self.new_op(Return())
1.31
1.32 - self.new_op(Return())
1.33 + # Make sure that enough frame space is reserved from the start.
1.34
1.35 self.set_frame_usage(node, extend)
1.36
1.37 @@ -645,10 +662,33 @@
1.38 # Visiting of the code occurs when get_code is invoked on this node.
1.39
1.40 else:
1.41 + body_block = self.new_block()
1.42 +
1.43 + # Check frames using the function's details.
1.44 +
1.45 + fn = node.unit
1.46 + nparams = len(fn.positional_names)
1.47 + ndefaults = len(fn.defaults)
1.48 +
1.49 + self.new_op(CheckFrame((nparams, ndefaults, fn.has_star)))
1.50 + self.new_op(FillDefaults((nparams, ndefaults)))
1.51 +
1.52 + # Produce the body.
1.53 +
1.54 + self.set_block(body_block)
1.55 +
1.56 + extend = ExtendFrame()
1.57 + self.new_op(extend)
1.58 +
1.59 self.dispatch(node.code)
1.60 +
1.61 self.new_op(StoreResult())
1.62 self.new_op(Return())
1.63
1.64 + # Make sure that enough frame space is reserved from the start.
1.65 +
1.66 + self.set_frame_usage(node, extend)
1.67 +
1.68 def visitModule(self, node):
1.69 extend = ExtendFrame()
1.70 self.new_op(extend)