Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 2
0
 internal override void Execute(ref int ip, ValueStack valueStack, EnvironmentStack envStack, CallStack callStack)
 {
     envStack.Pop();
     ip = callStack.GetLastIp();
     callStack.Pop();
 }