Esempio n. 1
0
 public static void lua_pushcclosure(lua_State L, lua_CFunction fn, int n)
 {
     lua_lock(L);
     if (n == 0)
     {
         imp.setfvalue(L, L.top, fn);
     }
     else
     {
         imp.api_checknelems(L, n);
         imp.api_check(n <= imp.MAXUPVAL, "upvalue index too large");
         imp.luaC_checkGC(L);
         CClosure cl = imp.luaF_newCclosure(L, n);
         cl.f   = fn;
         L.top -= n;
         while (n-- != 0)
         {
             imp.setobj2n(L, cl.upvalue[n], L.top + n);
             /* does not need barrier because closure is white */
         }
         imp.setclCvalue(L, L.top, cl);
     }
     imp.api_incr_top(L);
     lua_unlock(L);
 }
Esempio n. 2
0
        public static string lua_setupvalue(lua_State L, int funcindex, int n)
        {
            lua_lock(L);
            TValue   val   = null;
            CClosure owner = null;
            UpVal    uv    = null;
            TValue   fi    = imp.index2addr(L, funcindex);

            imp.api_checknelems(L, 1);
            string name = imp.aux_upvalue(fi, n, ref val, ref owner, ref uv);

            if (name != null)
            {
                L.top--;
                imp.setobj(L, val, L.top);
                if (owner != null)
                {
                    imp.luaC_barrier(L, owner, L.top);
                }
                else if (uv != null)
                {
                    imp.luaC_upvalbarrier(L, uv);
                }
            }
            lua_unlock(L);
            return(name);
        }
Esempio n. 3
0
        public static string lua_getupvalue(lua_State L, int funcindex, int n)
        {
            lua_lock(L);
            TValue   val  = null;
            CClosure cl   = null;
            UpVal    uv   = null;
            string   name = imp.aux_upvalue(imp.index2addr(L, funcindex), n, ref val, ref cl, ref uv);

            if (name != null)
            {
                imp.setobj2s(L, L.top, val);
                imp.api_incr_top(L);
            }
            lua_unlock(L);
            return(name);
        }
Esempio n. 4
0
        public static TValue index2addr(lua_State L, int idx)
        {
            CallInfo ci = L.ci;

            if (idx > 0)
            {
                api_check(idx <= ci.top - (ci.func + 1), "unacceptable index");
                if (ci.func + idx >= L.top)
                {
                    return(lapi.NONVALIDVALUE);
                }
                else
                {
                    return(L.stack[ci.func + idx]);
                }
            }
            else if (ispseudo(idx) == false)     /* negative index */
            {
                api_check(idx != 0 && -idx <= L.top - (ci.func + 1), "invalid index");
                return(L.stack[L.top + idx]);
            }
            else if (idx == cc.LUA_REGISTRYINDEX)
            {
                return(G(L).l_registry);
            }
            else    /* upvalues */
            {
                idx = cc.LUA_REGISTRYINDEX - idx;
                api_check(idx <= MAXUPVAL + 1, "upvalue index too large");
                if (ttislcf(L.stack[ci.func]))   /* light C function? */
                {
                    return(lapi.NONVALIDVALUE);  /* it has no upvalues */
                }
                else
                {
                    CClosure func = clCvalue(L.stack[ci.func]);
                    return((idx <= func.nupvalues) ? func.upvalue[idx - 1] : lapi.NONVALIDVALUE);
                }
            }
        }
Esempio n. 5
0
        public static object lua_upvalueid(lua_State L, int fidx, int n)
        {
            TValue   fi = imp.index2addr(L, fidx);
            LClosure pf = null;

            switch (imp.ttype(fi))
            {
            case imp.LUA_TLCL: {      /* lua closure */
                return(imp.getupvalref(L, fidx, n, ref pf));
            }

            case imp.LUA_TCCL: {      /* C closure */
                CClosure f = imp.clCvalue(fi);
                imp.api_check(1 <= n && n <= f.nupvalues, "invalid upvalue index");
                return(f.upvalue[n - 1]);
            }

            default: {
                imp.api_check(false, "closure expected");
                return(null);
            }
            }
        }
Esempio n. 6
0
        public static string aux_upvalue(TValue fi, int n, ref TValue val, ref CClosure owner, ref UpVal uv)
        {
            switch (ttype(fi))
            {
            case LUA_TCCL: {      /* C closure */
                CClosure f = clCvalue(fi);
                if ((1 <= n && n <= f.nupvalues) == false)
                {
                    return(null);
                }
                val = f.upvalue[n - 1];
                if (owner != null)
                {
                    owner = f;
                }
                return("");
            }

            case LUA_TLCL: {      /* Lua closure */
                LClosure f = clLvalue(fi);
                Proto    p = f.p;
                if ((1 <= n && n <= p.sizeupvalues) == false)
                {
                    return(null);
                }
                val = f.upvals[n - 1].v;
                if (uv != null)
                {
                    uv = f.upvals[n - 1];
                }
                TString name = p.upvalues[n - 1].name;
                return((name == null) ? "(*no name)" : byte2str(getstr(name)));
            }

            default: return(null);     /* not a closure */
            }
        }