/// <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; }