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