Exemple #1
0
    public void LoadProto(int idx)
    {
        var subProto = LuaStack.Closure.Proto.Protos[idx];
        var closure  = new LuaClosure(subProto);

        LuaStack.Push(closure);
        for (int i = 0; i < subProto.UpValues.Length; i++)
        {
            var uvInfo = subProto.UpValues[i];
            int uvIdx  = uvInfo.Idx;
            if (uvInfo.InStack == 1)
            {
                if (LuaStack.Openuvs == null)
                {
                    LuaStack.Openuvs = new Dictionary <int, LuaUpValue>();
                }
                if (LuaStack.Openuvs.TryGetValue(uvIdx, out LuaUpValue openuv))
                {
                    closure.Upvals[i] = openuv;
                }
                else
                {
                    closure.Upvals[i]       = LuaUpValue.CreateOpen(LuaStack, uvIdx);
                    LuaStack.Openuvs[uvIdx] = closure.Upvals[i];
                }
            }
            else
            {
                closure.Upvals[i] = LuaStack.Closure.Upvals[uvIdx];
            }
        }
    }
Exemple #2
0
    public void PushCSharpClosure(CSharpFunction f, int n)
    {
        var closure = new LuaClosure(f, n);

        for (int i = n - 1; i >= 0; i--)
        {
            var val = LuaStack.Pop();
            closure.Upvals[i] = LuaUpValue.CreateClosed(val);
        }
        LuaStack.Push(closure);
    }
Exemple #3
0
    private void CallLuaClosure(int nArgs, int nResults, LuaClosure c)
    {
        int  nRegs    = c.Proto.MaxStackSize;
        int  nParams  = c.Proto.NumParams;
        bool isVararg = c.Proto.IsVararg == 1;

        var newStack = new LuaStack(nRegs + 20, this)
        {
            Closure = c
        };

        LuaValue[] funcAndArgs = LuaStack.PopN(nArgs + 1);
        newStack.PushN(funcAndArgs[1..], nParams);
Exemple #4
0
    public ErrState Load(byte[] chunk, string chunkName, string mode)
    {
        var proto = Prototype.Undump(chunk);
        var c     = new LuaClosure(proto);

        LuaStack.Push(c);
        if (proto.UpValues != null && proto.UpValues.Length > 0)
        {
            var env = Registry.Get(Consts.LUA_RIDX_GLOBALS);
            c.Upvals[0] = LuaUpValue.CreateClosed(env);
        }
        return(ErrState.Ok);
    }
Exemple #5
0
    private void CallCSharpClosure(int nArgs, int nResults, LuaClosure c)
    {
        var newStack = new LuaStack(nArgs + 20, this)
        {
            Closure = c
        };

        var args = LuaStack.PopN(nArgs);

        newStack.PushN(args, nArgs);
        LuaStack.Pop();

        PushLuaStack(newStack);
        int r = c.CSharpFunc.Invoke(this);

        PopLuaStack();

        if (nResults != 0)
        {
            var results = newStack.PopN(r);
            LuaStack.Check(nResults);
            LuaStack.PushN(results, nResults);
        }
    }