GitLab will continue to be upgraded from 11.4.5-ce.0 on November 25th 2019 at 4.00pm (AEDT) to 5.00pm (AEDT) due to Critical Security Patch Availability. During the update, GitLab and Mattermost services will not be available.

Commit cac30b5e authored by Stefan Marr's avatar Stefan Marr

Block _invoke doesn't handle control flow exceptions

- it relies on interpreter returning result values and puts it on the stack
- non-local returns are handled by method call of the context
Signed-off-by: 's avatarStefan Marr <git@stefan-marr.de>
parent 36cfed21
from rpython.rlib import jit
from som.interpreter.control_flow import RestartLoopException
from som.vmobjects.abstract_object import AbstractObject
from som.vmobjects.primitive import Primitive
......@@ -44,14 +45,13 @@ def block_evaluation_primitive(num_args, universe):
return Block.Evaluation(num_args, universe, _invoke)
def _invoke(ivkbl, frame, interpreter):
# Get the block (the receiver) from the stack
assert isinstance(ivkbl, Block.Evaluation)
rcvr = frame.get_stack_element(ivkbl._number_of_arguments - 1)
# Get the context of the block...
context = rcvr.get_context()
# Push a new frame and set its context to be the one specified in
# the block
new_frame = interpreter.push_new_frame(rcvr.get_method(), context)
new_frame = interpreter.new_frame(frame, rcvr.get_method(), context)
new_frame.copy_arguments_from(frame)
result = interpreter.interpret(rcvr.get_method(), new_frame)
frame.pop_old_arguments_and_push_result(rcvr.get_method(), result)
new_frame.clear_previous_frame()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment