示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }