Shovel.Vm.Vm.CallFunction C# (CSharp) Метод

CallFunction() статический приватный Метод

static private CallFunction ( Callable callable, Vm vm, int numArgs, bool saveReturnAddress, bool inApply ) : void
callable Callable
vm Vm
numArgs int
saveReturnAddress bool
inApply bool
Результат void
        static void CallFunction(Callable callable, Vm vm, int numArgs, bool saveReturnAddress, bool inApply)
        {
            if (callable.Arity != null)
            {
                // FIXME: Find out why/when the arity can be null.
                if (callable.HasCollectParams)
                {
                    if (callable.Arity.Value <= numArgs)
                    {
                        var extraArgs = numArgs - callable.Arity.Value;
                        var values = new ArrayInstance();
                        for (int i = 0; i < extraArgs; i++) {
                            values.Add(vm.stack.Storage[i + vm.stack.Count - extraArgs]);
                        }
                        vm.stack.PopMany(extraArgs);
                        vm.stack.Push(Value.Make(values));
                    }
                    else
                    {
                        ArityError(vm, callable.Arity.Value, numArgs, inApply);
                    }
                }
                else if (callable.Arity.Value != numArgs)
                {
                    ArityError(vm, callable.Arity.Value, numArgs, inApply);
                }
            }
            if (saveReturnAddress)
            {
                vm.stack.Push (Value.Make (new ReturnAddress () {
                    ProgramCounter = vm.programCounter + 1,
                    Environment = vm.currentEnvironment
                }));
            }
            vm.currentEnvironment = callable.Environment;
            vm.programCounter = callable.ProgramCounter.Value;
        }
Vm