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); }
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); }
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); }
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); } } }
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); } } }
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 */ } }