📄 lapi.c
字号:
LUA_API void lua_pushboolean (lua_State *L, int b) { lua_lock(L); setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ api_incr_top(L); lua_unlock(L);}LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { lua_lock(L); setpvalue(L->top, p); api_incr_top(L); lua_unlock(L);}/*** get functions (Lua -> stack)*/LUA_API void lua_gettable (lua_State *L, int idx) { StkId t; lua_lock(L); t = luaA_index(L, idx); setobj2s(L->top - 1, luaV_gettable(L, t, L->top - 1, 0)); lua_unlock(L);}LUA_API void lua_rawget (lua_State *L, int idx) { StkId t; lua_lock(L); t = luaA_index(L, idx); api_check(L, ttistable(t)); setobj2s(L->top - 1, luaH_get(hvalue(t), L->top - 1)); lua_unlock(L);}LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { StkId o; lua_lock(L); o = luaA_index(L, idx); api_check(L, ttistable(o)); setobj2s(L->top, luaH_getnum(hvalue(o), n)); api_incr_top(L); lua_unlock(L);}LUA_API void lua_newtable (lua_State *L) { lua_lock(L); luaC_checkGC(L); sethvalue(L->top, luaH_new(L, 0, 0)); api_incr_top(L); lua_unlock(L);}LUA_API int lua_getmetatable (lua_State *L, int objindex) { const TObject *obj; Table *mt = NULL; int res; lua_lock(L); obj = luaA_indexAcceptable(L, objindex); if (obj != NULL) { switch (ttype(obj)) { case LUA_TTABLE: mt = hvalue(obj)->metatable; break; case LUA_TUSERDATA: mt = uvalue(obj)->uv.metatable; break; } } if (mt == NULL || mt == hvalue(defaultmeta(L))) res = 0; else { sethvalue(L->top, mt); api_incr_top(L); res = 1; } lua_unlock(L); return res;}LUA_API void lua_getfenv (lua_State *L, int idx) { StkId o; lua_lock(L); o = luaA_index(L, idx); setobj2s(L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L)); api_incr_top(L); lua_unlock(L);}/*** set functions (stack -> Lua)*/LUA_API void lua_settable (lua_State *L, int idx) { StkId t; lua_lock(L); api_checknelems(L, 2); t = luaA_index(L, idx); luaV_settable(L, t, L->top - 2, L->top - 1); L->top -= 2; /* pop index and value */ lua_unlock(L);}LUA_API void lua_rawset (lua_State *L, int idx) { StkId t; lua_lock(L); api_checknelems(L, 2); t = luaA_index(L, idx); api_check(L, ttistable(t)); setobj2t(luaH_set(L, hvalue(t), L->top-2), L->top-1); /* write barrier */ L->top -= 2; lua_unlock(L);}LUA_API void lua_rawseti (lua_State *L, int idx, int n) { StkId o; lua_lock(L); api_checknelems(L, 1); o = luaA_index(L, idx); api_check(L, ttistable(o)); setobj2t(luaH_setnum(L, hvalue(o), n), L->top-1); /* write barrier */ L->top--; lua_unlock(L);}LUA_API int lua_setmetatable (lua_State *L, int objindex) { TObject *obj, *mt; int res = 1; lua_lock(L); api_checknelems(L, 1); obj = luaA_index(L, objindex); mt = (!ttisnil(L->top - 1)) ? L->top - 1 : defaultmeta(L); api_check(L, ttistable(mt)); switch (ttype(obj)) { case LUA_TTABLE: { hvalue(obj)->metatable = hvalue(mt); /* write barrier */ break; } case LUA_TUSERDATA: { uvalue(obj)->uv.metatable = hvalue(mt); /* write barrier */ break; } default: { res = 0; /* cannot set */ break; } } L->top--; lua_unlock(L); return res;}LUA_API int lua_setfenv (lua_State *L, int idx) { StkId o; int res = 0; lua_lock(L); api_checknelems(L, 1); o = luaA_index(L, idx); L->top--; api_check(L, ttistable(L->top)); if (isLfunction(o)) { res = 1; clvalue(o)->l.g = *(L->top); } lua_unlock(L); return res;}/*** `load' and `call' functions (run Lua code)*/LUA_API void lua_call (lua_State *L, int nargs, int nresults) { StkId func; lua_lock(L); api_checknelems(L, nargs+1); func = L->top - (nargs+1); luaD_call(L, func, nresults); lua_unlock(L);}/*** Execute a protected call.*/struct CallS { /* data to `f_call' */ StkId func; int nresults;};static void f_call (lua_State *L, void *ud) { struct CallS *c = cast(struct CallS *, ud); luaD_call(L, c->func, c->nresults);}LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { struct CallS c; int status; ptrdiff_t func; lua_lock(L); func = (errfunc == 0) ? 0 : savestack(L, luaA_index(L, errfunc)); c.func = L->top - (nargs+1); /* function to be called */ c.nresults = nresults; status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); lua_unlock(L); return status;}/*** Execute a protected C call.*/struct CCallS { /* data to `f_Ccall' */ lua_CFunction func; void *ud;};static void f_Ccall (lua_State *L, void *ud) { struct CCallS *c = cast(struct CCallS *, ud); Closure *cl; cl = luaF_newCclosure(L, 0); cl->c.f = c->func; setclvalue(L->top, cl); /* push function */ incr_top(L); setpvalue(L->top, c->ud); /* push only argument */ incr_top(L); luaD_call(L, L->top - 2, 0);}LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { struct CCallS c; int status; lua_lock(L); c.func = func; c.ud = ud; status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); lua_unlock(L); return status;}LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *data, const char *chunkname) { ZIO z; int status; int c; lua_lock(L); if (!chunkname) chunkname = "?"; luaZ_init(&z, reader, data, chunkname); c = luaZ_lookahead(&z); status = luaD_protectedparser(L, &z, (c == LUA_SIGNATURE[0])); lua_unlock(L); return status;}LUA_API int lua_dump (lua_State *L, lua_Chunkwriter writer, void *data) { int status; TObject *o; lua_lock(L); api_checknelems(L, 1); o = L->top - 1; if (isLfunction(o) && clvalue(o)->l.nupvalues == 0) { luaU_dump(L, clvalue(o)->l.p, writer, data); status = 1; } else status = 0; lua_unlock(L); return status;}/*** Garbage-collection functions*//* GC values are expressed in Kbytes: #bytes/2^10 */#define GCscalel(x) ((x)>>10)#define GCscale(x) (cast(int, GCscalel(x)))#define GCunscale(x) (cast(lu_mem, x)<<10)LUA_API int lua_getgcthreshold (lua_State *L) { int threshold; lua_lock(L); threshold = GCscale(G(L)->GCthreshold); lua_unlock(L); return threshold;}LUA_API int lua_getgccount (lua_State *L) { int count; lua_lock(L); count = GCscale(G(L)->nblocks); lua_unlock(L); return count;}LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { lua_lock(L); if (cast(lu_mem, newthreshold) > GCscalel(MAX_LUMEM)) G(L)->GCthreshold = MAX_LUMEM; else G(L)->GCthreshold = GCunscale(newthreshold); luaC_checkGC(L); lua_unlock(L);}/*** miscellaneous functions*/LUA_API const char *lua_version (void) { return LUA_VERSION;}LUA_API int lua_error (lua_State *L) { lua_lock(L); api_checknelems(L, 1); luaG_errormsg(L); lua_unlock(L);}LUA_API int lua_next (lua_State *L, int idx) { StkId t; int more; lua_lock(L); t = luaA_index(L, idx); api_check(L, ttistable(t)); more = luaH_next(L, hvalue(t), L->top - 1); if (more) { api_incr_top(L); } else /* no more elements */ L->top -= 1; /* remove key */ lua_unlock(L); return more;}LUA_API void lua_concat (lua_State *L, int n) { lua_lock(L); luaC_checkGC(L); api_checknelems(L, n); if (n >= 2) { luaV_concat(L, n, L->top - L->base - 1); L->top -= (n-1); } else if (n == 0) { /* push empty string */ setsvalue2s(L->top, luaS_newlstr(L, NULL, 0)); api_incr_top(L); } /* else n == 1; nothing to do */ lua_unlock(L);}LUA_API void *lua_newuserdata (lua_State *L, size_t size) { Udata *u; lua_lock(L); luaC_checkGC(L); u = luaS_newudata(L, size); setuvalue(L->top, u); api_incr_top(L); lua_unlock(L); return u + 1;}LUA_API int lua_pushupvalues (lua_State *L) { Closure *func; int n, i; lua_lock(L); api_check(L, iscfunction(L->base - 1)); func = clvalue(L->base - 1); n = func->c.nupvalues; luaD_checkstack(L, n + LUA_MINSTACK); for (i=0; i<n; i++) { setobj2s(L->top, &func->c.upvalue[i]); L->top++; } lua_unlock(L); return n;}static const char *aux_upvalue (lua_State *L, int funcindex, int n, TObject **val) { Closure *f; StkId fi = luaA_index(L, funcindex); if (!ttisfunction(fi)) return NULL; f = clvalue(fi); if (f->c.isC) { if (n > f->c.nupvalues) return NULL; *val = &f->c.upvalue[n-1]; return ""; } else { Proto *p = f->l.p; if (n > p->sizeupvalues) return NULL; *val = f->l.upvals[n-1]->v; return getstr(p->upvalues[n-1]); }}LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { const char *name; TObject *val; lua_lock(L); name = aux_upvalue(L, funcindex, n, &val); if (name) { setobj2s(L->top, val); api_incr_top(L); } lua_unlock(L); return name;}LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { const char *name; TObject *val; lua_lock(L); api_checknelems(L, 1); name = aux_upvalue(L, funcindex, n, &val); if (name) { L->top--; setobj(val, L->top); /* write barrier */ } lua_unlock(L); return name;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -