예제 #1
0
        /// <summary>
        /// This is similar to the way we handle closures, except functions don't have durable
        /// state, so we destroy the environment after using.
        /// </summary>
        /// <param name="vm"></param>
        /// <param name="i"></param>
        internal static void ReturnFunction(VirtualMachine vm, Instruction i)
        {
            if (vm.ClosureStack.Count() < 1) {
                vm.RaiseError("Attempted to return a function without any outer context.");
                return;
            }
            Environment temporaryEnv = vm.CurrentEnvironment;
            Environment enviro = vm.ClosureStack.Last();
            vm.ClosureStack.RemoveAt(vm.ClosureStack.Count() - 1);

            if (vm.Stack.Count() > 0) {
                Value val = vm.Stack.Shift();
                enviro.Stack.Push(val);
            }
            vm.CurrentEnvironment = enviro;
            vm.ByteCode.ProgramCounter = vm.ReturnAddresses[vm.ReturnAddresses.Count() - 1];
            vm.ReturnAddresses.RemoveAt(vm.ReturnAddresses.Count() - 1);
            vm.FunctionCallList.RemoveAt(vm.FunctionCallList.Count() - 1);

            vm.DestroyClosure(temporaryEnv);

            return;
        }