private void CallLuaClosure(int nArgs, int nResults, Closure c) { var nRegs = c.Proto.MaxStackSize; var nParams = c.Proto.NumParams; var isVararg = c.Proto.IsVararg == 1; // create new lua stack var newStack = new LuaStack { Closure = c }; // pass args, pop func var funcAndArgs = _stack.PopN(nArgs + 1); var count = funcAndArgs.Count - 1; newStack.PushN(funcAndArgs.GetRange(1, count), nParams); if (nArgs > nParams && isVararg) { newStack.Varargs = funcAndArgs.GetRange(nParams + 1, count); } // run closure PushLuaStack(newStack); SetTop(nRegs); RunLuaClosure(); PopLuaStack(); // return results if (nResults != 0) { var results = newStack.PopN(newStack.Top() - nRegs); //stack.check(results.size()) _stack.PushN(results, nResults); } }
private void CallCsharpClosure(int nArgs, int nResults, Closure c) { // create new lua stack var newStack = new LuaStack { State = this, Closure = c }; // pass args, pop func if (nArgs > 0) { newStack.PushN(_stack.PopN(nArgs), nArgs); } _stack.Pop(); // run closure PushLuaStack(newStack); var r = c.CsharpFunc(this); PopLuaStack(); // return results if (nResults != 0) { var results = newStack.PopN(r); //stack.check(results.Length); _stack.PushN(results, nResults); } }