internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { envStack.Pop(); int oldIp = callStack.GetLastIp(); callStack.Pop(); object target = valueStack.GetFromTop(NumberOfPushedArguments); if (target is IP) { callStack.Push(oldIp, NumberOfPushedArguments); ip = ((IP)target).Value; return; } if (target is Closure) { Closure c = (Closure)target; foreach (var value in c.ClosedOverValues) valueStack.Push(value); callStack.Push(oldIp, NumberOfPushedArguments + c.ClosedOverValues.Count); ip = c.Target; return; } throw new exceptions.RuntimeException("Invalid CALL target"); }
internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack) { envStack.Pop(); ip = callStack.GetLastIp(); callStack.Pop(); }