176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** $Id: lapi.c,v 2.171.1.1 2013/04/12 18:48:47 roberto Exp $ 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Lua API 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** See Copyright Notice in lua.h 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdarg.h> 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define lapi_c 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LUA_CORE 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lua.h" 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lapi.h" 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ldebug.h" 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ldo.h" 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lfunc.h" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lgc.h" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lmem.h" 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lobject.h" 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstate.h" 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstring.h" 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltable.h" 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltm.h" 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lundump.h" 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lvm.h" 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char lua_ident[] = 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "$LuaVersion: " LUA_COPYRIGHT " $" 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "$LuaAuthors: " LUA_AUTHORS " $"; 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* value at a non-valid index */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define NONVALIDVALUE cast(TValue *, luaO_nilobject) 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* corresponding test */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define isvalid(o) ((o) != luaO_nilobject) 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* test for pseudo index */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* test for valid but not pseudo index */ 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define isstackindex(i, o) (isvalid(o) && !ispseudo(i)) 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define api_checkvalidindex(L, o) api_check(L, isvalid(o), "invalid index") 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define api_checkstackindex(L, i, o) \ 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, isstackindex(i, o), "index not in the stack") 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic TValue *index2addr (lua_State *L, int idx) { 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CallInfo *ci = L->ci; 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (idx > 0) { 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *o = ci->func + idx; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index"); 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (o >= L->top) return NONVALIDVALUE; 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return o; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (!ispseudo(idx)) { /* negative index */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return L->top + idx; 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (idx == LUA_REGISTRYINDEX) 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return &G(L)->l_registry; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* upvalues */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman idx = LUA_REGISTRYINDEX - idx; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large"); 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttislcf(ci->func)) /* light C function? */ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NONVALIDVALUE; /* it has no upvalues */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CClosure *func = clCvalue(ci->func); 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE; 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** to be called by 'lua_checkstack' in protected mode, to grow stack 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** capturing memory errors 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void growstack (lua_State *L, void *ud) { 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int size = *(int *)ud; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_growstack(L, size); 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_checkstack (lua_State *L, int size) { 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int res; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CallInfo *ci = L->ci; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (L->stack_last - L->top > size) /* stack large enough? */ 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = 1; /* yes; check is OK */ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* no; need to grow stack */ 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int inuse = cast_int(L->top - L->stack) + EXTRA_STACK; 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (inuse > LUAI_MAXSTACK - size) /* can grow without overflow? */ 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = 0; /* no */ 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* try to grow stack */ 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = (luaD_rawrunprotected(L, &growstack, &size) == LUA_OK); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (res && ci->top < L->top + size) 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->top = L->top + size; /* adjust frame top */ 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return res; 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (from == to) return; 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(to); 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(from, n); 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(from, G(from) == G(to), "moving among independent states"); 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(from, to->ci->top - to->top >= n, "not enough elements to move"); 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman from->top -= n; 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < n; i++) { 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(to, to->top++, from->top + i); 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(to); 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_CFunction old; 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman old = G(L)->panic; 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman G(L)->panic = panicf; 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return old; 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const lua_Number *lua_version (lua_State *L) { 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const lua_Number version = LUA_VERSION_NUM; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (L == NULL) return &version; 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return G(L)->version; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** basic stack manipulation 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** convert an acceptable stack index into an absolute index 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 15376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_absindex (lua_State *L, int idx) { 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (idx > 0 || ispseudo(idx)) 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ? idx 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : cast_int(L->top - L->ci->func + idx); 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_gettop (lua_State *L) { 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return cast_int(L->top - (L->ci->func + 1)); 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_settop (lua_State *L, int idx) { 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId func = L->ci->func; 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (idx >= 0) { 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, idx <= L->stack_last - (func + 1), "new top too large"); 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (L->top < (func + 1) + idx) 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnilvalue(L->top++); 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top = (func + 1) + idx; 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top"); 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top += idx+1; /* `subtract' index (index is negative) */ 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_remove (lua_State *L, int idx) { 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId p; 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p = index2addr(L, idx); 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checkstackindex(L, idx, p); 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (++p < L->top) setobjs2s(L, p-1, p); 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_insert (lua_State *L, int idx) { 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId p; 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId q; 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p = index2addr(L, idx); 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checkstackindex(L, idx, p); 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (q = L->top; q > p; q--) /* use L->top as a temporary */ 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobjs2s(L, q, q - 1); 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobjs2s(L, p, L->top); 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void moveto (lua_State *L, TValue *fr, int idx) { 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *to = index2addr(L, idx); 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checkvalidindex(L, to); 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj(L, to, fr); 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (idx < LUA_REGISTRYINDEX) /* function upvalue? */ 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrier(L, clCvalue(L->ci->func), fr); 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* LUA_REGISTRYINDEX does not need gc barrier 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (collector revisits it before finishing collection) */ 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_replace (lua_State *L, int idx) { 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman moveto(L, L->top - 1, idx); 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *fr; 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fr = index2addr(L, fromidx); 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman moveto(L, fr, toidx); 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushvalue (lua_State *L, int idx) { 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(L, L->top, index2addr(L, idx)); 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** access functions (stack -> C) 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_type (lua_State *L, int idx) { 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (isvalid(o) ? ttypenv(o) : LUA_TNONE); 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_typename (lua_State *L, int t) { 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman UNUSED(L); 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ttypename(t); 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_iscfunction (lua_State *L, int idx) { 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (ttislcf(o) || (ttisCclosure(o))); 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_isnumber (lua_State *L, int idx) { 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue n; 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return tonumber(o, &n); 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_isstring (lua_State *L, int idx) { 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int t = lua_type(L, idx); 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (t == LUA_TSTRING || t == LUA_TNUMBER); 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_isuserdata (lua_State *L, int idx) { 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (ttisuserdata(o) || ttislightuserdata(o)); 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_rawequal (lua_State *L, int index1, int index2) { 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o1 = index2addr(L, index1); 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o2 = index2addr(L, index2); 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0; 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_arith (lua_State *L, int op) { 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o1; /* 1st operand */ 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o2; /* 2nd operand */ 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (op != LUA_OPUNM) /* all other operations expect two operands */ 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 2); 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* for unary minus, add fake 2nd operand */ 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobjs2s(L, L->top, L->top - 1); 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top++; 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o1 = L->top - 2; 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o2 = L->top - 1; 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttisnumber(o1) && ttisnumber(o2)) { 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnvalue(o1, luaO_arith(op, nvalue(o1), nvalue(o2))); 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_arith(L, o1, o1, o2, cast(TMS, op - LUA_OPADD + TM_ADD)); 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o1, o2; 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i = 0; 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); /* may call tag method */ 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o1 = index2addr(L, index1); 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o2 = index2addr(L, index2); 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isvalid(o1) && isvalid(o2)) { 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (op) { 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_OPEQ: i = equalobj(L, o1, o2); break; 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break; 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break; 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: api_check(L, 0, "invalid option"); 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return i; 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum) { 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue n; 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (tonumber(o, &n)) { 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 1; 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return nvalue(o); 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 0; 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum) { 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue n; 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (tonumber(o, &n)) { 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Integer res; 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Number num = nvalue(o); 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_number2integer(res, num); 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 1; 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return res; 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 0; 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *isnum) { 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue n; 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (tonumber(o, &n)) { 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Unsigned res; 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Number num = nvalue(o); 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_number2unsigned(res, num); 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 1; 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return res; 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) *isnum = 0; 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_toboolean (lua_State *L, int idx) { 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *o = index2addr(L, idx); 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return !l_isfalse(o); 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!ttisstring(o)) { 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); /* `luaV_tostring' may create a new string */ 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!luaV_tostring(L, o)) { /* conversion failed? */ 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (len != NULL) *len = 0; 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o = index2addr(L, idx); /* previous call may reallocate the stack */ 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (len != NULL) *len = tsvalue(o)->len; 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return svalue(o); 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API size_t lua_rawlen (lua_State *L, int idx) { 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttypenv(o)) { 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TSTRING: return tsvalue(o)->len; 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: return uvalue(o)->len; 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTABLE: return luaH_getn(hvalue(o)); 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return 0; 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttislcf(o)) return fvalue(o); 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (ttisCclosure(o)) 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return clCvalue(o)->f; 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return NULL; /* not a C function */ 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void *lua_touserdata (lua_State *L, int idx) { 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttypenv(o)) { 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: return (rawuvalue(o) + 1); 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLIGHTUSERDATA: return pvalue(o); 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return NULL; 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_State *lua_tothread (lua_State *L, int idx) { 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (!ttisthread(o)) ? NULL : thvalue(o); 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const void *lua_topointer (lua_State *L, int idx) { 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, idx); 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttype(o)) { 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTABLE: return hvalue(o); 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLCL: return clLvalue(o); 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TCCL: return clCvalue(o); 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o))); 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTHREAD: return thvalue(o); 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLIGHTUSERDATA: 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_touserdata(L, idx); 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return NULL; 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** push functions (C -> stack) 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushnil (lua_State *L) { 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnilvalue(L->top); 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushnumber (lua_State *L, lua_Number n) { 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnvalue(L->top, n); 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luai_checknum(L, L->top, 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaG_runerror(L, "C API - attempt to push a signaling NaN")); 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnvalue(L->top, cast_num(n)); 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) { 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Number n; 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman n = lua_unsigned2number(u); 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnvalue(L->top, n); 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *ts; 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ts = luaS_newlstr(L, s, len); 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top, ts); 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return getstr(ts); 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_pushstring (lua_State *L, const char *s) { 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (s == NULL) { 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *ts; 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ts = luaS_new(L, s); 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top, ts); 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return getstr(ts); 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 53176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list argp) { 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *ret; 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ret = luaO_pushvfstring(L, fmt, argp); 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ret; 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *ret; 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list argp; 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_start(argp, fmt); 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ret = luaO_pushvfstring(L, fmt, argp); 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_end(argp); 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ret; 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (n == 0) { 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setfvalue(L->top, fn); 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Closure *cl; 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, n); 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, n <= MAXUPVAL, "upvalue index too large"); 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cl = luaF_newCclosure(L, n); 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cl->c.f = fn; 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= n; 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (n--) 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2n(L, &cl->c.upvalue[n], L->top + n); 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setclCvalue(L, L->top, cl); 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushboolean (lua_State *L, int b) { 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_pushlightuserdata (lua_State *L, void *p) { 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setpvalue(L->top, p); 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_pushthread (lua_State *L) { 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setthvalue(L, L->top, L); 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (G(L)->mainthread == L); 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** get functions (Lua -> stack) 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_getglobal (lua_State *L, const char *var) { 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *reg = hvalue(&G(L)->l_registry); 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *gt; /* global table */ 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gt = luaH_getint(reg, LUA_RIDX_GLOBALS); 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top++, luaS_new(L, var)); 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_gettable(L, gt, L->top - 1, L->top - 1); 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_gettable (lua_State *L, int idx) { 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_gettable(L, t, L->top - 1, L->top - 1); 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 62876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_getfield (lua_State *L, int idx, const char *k) { 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top, luaS_new(L, k)); 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_gettable(L, t, L->top - 1, L->top - 1); 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawget (lua_State *L, int idx) { 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawgeti (lua_State *L, int idx, int n) { 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(L, L->top, luaH_getint(hvalue(t), n)); 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) { 66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue k; 66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setpvalue(&k, cast(void *, p)); 66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(L, L->top, luaH_get(hvalue(t), &k)); 66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_createtable (lua_State *L, int narray, int nrec) { 67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *t; 67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = luaH_new(L); 67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sethvalue(L, L->top, t); 67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (narray > 0 || nrec > 0) 68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaH_resize(L, t, narray, nrec); 68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_getmetatable (lua_State *L, int objindex) { 68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *obj; 68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *mt = NULL; 68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int res; 69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman obj = index2addr(L, objindex); 69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttypenv(obj)) { 69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTABLE: 69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = hvalue(obj)->metatable; 69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: 69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = uvalue(obj)->metatable; 69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = G(L)->mt[ttypenv(obj)]; 70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mt == NULL) 70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = 0; 70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sethvalue(L, L->top, mt); 70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = 1; 70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return res; 71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_getuservalue (lua_State *L, int idx) { 71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o; 71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o = index2addr(L, idx); 71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttisuserdata(o), "userdata expected"); 72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (uvalue(o)->env) { 72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sethvalue(L, L->top, uvalue(o)->env); 72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else 72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setnilvalue(L->top); 72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** set functions (stack -> Lua) 73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 73476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_setglobal (lua_State *L, const char *var) { 73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *reg = hvalue(&G(L)->l_registry); 73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *gt; /* global table */ 73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gt = luaH_getint(reg, LUA_RIDX_GLOBALS); 74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top++, luaS_new(L, var)); 74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_settable(L, gt, L->top - 1, L->top - 2); 74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= 2; /* pop value and key */ 74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_settable (lua_State *L, int idx) { 74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 2); 75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_settable(L, t, L->top - 2, L->top - 1); 75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= 2; /* pop index and value */ 75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_setfield (lua_State *L, int idx, const char *k) { 75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top++, luaS_new(L, k)); 76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_settable(L, t, L->top - 1, L->top - 2); 76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= 2; /* pop value and key */ 76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawset (lua_State *L, int idx) { 77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 2); 77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); 77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman invalidateTMcache(hvalue(t)); 77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrierback(L, gcvalue(t), L->top-1); 77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= 2; 78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawseti (lua_State *L, int idx, int n) { 78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaH_setint(L, hvalue(t), n, L->top - 1); 79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrierback(L, gcvalue(t), L->top-1); 79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 79776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { 79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue k; 80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setpvalue(&k, cast(void *, p)); 80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2t(L, luaH_set(L, hvalue(t), &k), L->top - 1); 80676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrierback(L, gcvalue(t), L->top - 1); 80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 81276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_setmetatable (lua_State *L, int objindex) { 81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *obj; 81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *mt; 81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman obj = index2addr(L, objindex); 81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttisnil(L->top - 1)) 81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = NULL; 82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(L->top - 1), "table expected"); 82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mt = hvalue(L->top - 1); 82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttypenv(obj)) { 82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TTABLE: { 82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hvalue(obj)->metatable = mt; 82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mt) { 82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_objbarrierback(L, gcvalue(obj), mt); 82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkfinalizer(L, gcvalue(obj), mt); 83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TUSERDATA: { 83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uvalue(obj)->metatable = mt; 83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (mt) { 83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_objbarrier(L, rawuvalue(obj), mt); 83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkfinalizer(L, gcvalue(obj), mt); 83876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman G(L)->mt[ttypenv(obj)] = mt; 84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 85276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_setuservalue (lua_State *L, int idx) { 85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o; 85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o = index2addr(L, idx); 85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttisuserdata(o), "userdata expected"); 85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttisnil(L->top - 1)) 85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uvalue(o)->env = NULL; 86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(L->top - 1), "table expected"); 86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uvalue(o)->env = hvalue(L->top - 1); 86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); 86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 86976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 87076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 87176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** `load' and `call' functions (run Lua code) 87276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 87376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 87476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 87576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define checkresults(L,na,nr) \ 87676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \ 87776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "results from function overflow current stack size") 87876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 87976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 88076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_getctx (lua_State *L, int *ctx) { 88176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (L->ci->callstatus & CIST_YIELDED) { 88276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ctx) *ctx = L->ci->u.c.ctx; 88376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return L->ci->u.c.status; 88476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 88576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return LUA_OK; 88676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 88776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 88876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 88976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_callk (lua_State *L, int nargs, int nresults, int ctx, 89076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_CFunction k) { 89176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId func; 89276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 89376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, k == NULL || !isLua(L->ci), 89476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cannot use continuations inside hooks"); 89576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, nargs+1); 89676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); 89776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman checkresults(L, nargs, nresults); 89876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman func = L->top - (nargs+1); 89976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (k != NULL && L->nny == 0) { /* need to prepare continuation? */ 90076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->ci->u.c.k = k; /* save continuation */ 90176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->ci->u.c.ctx = ctx; /* save context */ 90276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_call(L, func, nresults, 1); /* do the call */ 90376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 90476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* no continuation or no yieldable */ 90576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_call(L, func, nresults, 0); /* just do the call */ 90676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman adjustresults(L, nresults); 90776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 90876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 90976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 91276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 91376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Execute a protected call. 91476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 91576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct CallS { /* data to `f_call' */ 91676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId func; 91776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int nresults; 91876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 91976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void f_call (lua_State *L, void *ud) { 92276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct CallS *c = cast(struct CallS *, ud); 92376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_call(L, c->func, c->nresults, 0); 92476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 92576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 92876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, 92976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ctx, lua_CFunction k) { 93076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct CallS c; 93176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 93276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ptrdiff_t func; 93376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 93476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, k == NULL || !isLua(L->ci), 93576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cannot use continuations inside hooks"); 93676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, nargs+1); 93776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); 93876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman checkresults(L, nargs, nresults); 93976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (errfunc == 0) 94076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman func = 0; 94176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 94276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId o = index2addr(L, errfunc); 94376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checkstackindex(L, errfunc, o); 94476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman func = savestack(L, o); 94576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 94676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c.func = L->top - (nargs+1); /* function to be called */ 94776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */ 94876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c.nresults = nresults; /* do a 'conventional' protected call */ 94976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); 95076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 95176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* prepare continuation (call is already protected by 'resume') */ 95276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CallInfo *ci = L->ci; 95376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->u.c.k = k; /* save continuation */ 95476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->u.c.ctx = ctx; /* save context */ 95576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* save information for error recovery */ 95676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->extra = savestack(L, c.func); 95776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->u.c.old_allowhook = L->allowhook; 95876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->u.c.old_errfunc = L->errfunc; 95976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->errfunc = func; 96076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* mark that function may do error recovery */ 96176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->callstatus |= CIST_YPCALL; 96276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_call(L, c.func, nresults, 1); /* do the call */ 96376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ci->callstatus &= ~CIST_YPCALL; 96476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->errfunc = ci->u.c.old_errfunc; 96576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = LUA_OK; /* if it is here, there were no errors */ 96676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 96776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman adjustresults(L, nresults); 96876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 96976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return status; 97076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 97176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 97276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 97376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, 97476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *chunkname, const char *mode) { 97576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ZIO z; 97676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 97776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 97876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!chunkname) chunkname = "?"; 97976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_init(L, &z, reader, data); 98076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = luaD_protectedparser(L, &z, chunkname, mode); 98176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (status == LUA_OK) { /* no errors? */ 98276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LClosure *f = clLvalue(L->top - 1); /* get newly created function */ 98376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (f->nupvalues == 1) { /* does it have one upvalue? */ 98476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* get global table from registry */ 98576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Table *reg = hvalue(&G(L)->l_registry); 98676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS); 98776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ 98876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj(L, f->upvals[0]->v, gt); 98976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrier(L, f->upvals[0], gt); 99076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 99176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 99276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 99376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return status; 99476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 99576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 99676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 99776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { 99876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 99976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *o; 100076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 100176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 100276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o = L->top - 1; 100376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isLfunction(o)) 100476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = luaU_dump(L, getproto(o), writer, data, 0); 100576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 100676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = 1; 100776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 100876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return status; 100976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 101076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_status (lua_State *L) { 101376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return L->status; 101476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 101576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 101776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 101876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Garbage-collection function 101976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 102076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 102176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_gc (lua_State *L, int what, int data) { 102276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int res = 0; 102376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman global_State *g; 102476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 102576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g = G(L); 102676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (what) { 102776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSTOP: { 102876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g->gcrunning = 0; 102976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 103076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 103176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCRESTART: { 103276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaE_setdebt(g, 0); 103376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g->gcrunning = 1; 103476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 103576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 103676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCCOLLECT: { 103776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_fullgc(L, 0); 103876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 103976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 104076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCCOUNT: { 104176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* GC values are expressed in Kbytes: #bytes/2^10 */ 104276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = cast_int(gettotalbytes(g) >> 10); 104376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 104476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 104576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCCOUNTB: { 104676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = cast_int(gettotalbytes(g) & 0x3ff); 104776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 104876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 104976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSTEP: { 105076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (g->gckind == KGC_GEN) { /* generational mode? */ 105176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = (g->GCestimate == 0); /* true if it will do major collection */ 105276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_forcestep(L); /* do a single step */ 105376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 105476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 105576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lu_mem debt = cast(lu_mem, data) * 1024 - GCSTEPSIZE; 105676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (g->gcrunning) 105776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman debt += g->GCdebt; /* include current debt */ 105876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaE_setdebt(g, debt); 105976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_forcestep(L); 106076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (g->gcstate == GCSpause) /* end of cycle? */ 106176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = 1; /* signal it */ 106276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 106376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 106476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 106576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSETPAUSE: { 106676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = g->gcpause; 106776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g->gcpause = data; 106876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 106976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 107076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSETMAJORINC: { 107176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = g->gcmajorinc; 107276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g->gcmajorinc = data; 107376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 107476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 107576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSETSTEPMUL: { 107676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = g->gcstepmul; 107776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman g->gcstepmul = data; 107876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 107976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 108076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCISRUNNING: { 108176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman res = g->gcrunning; 108276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 108376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 108476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCGEN: { /* change collector to generational mode */ 108576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_changemode(L, KGC_GEN); 108676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 108776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 108876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCINC: { /* change collector to incremental mode */ 108976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_changemode(L, KGC_NORMAL); 109076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 109176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 109276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: res = -1; /* invalid option */ 109376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 109476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 109576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return res; 109676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 109776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 109976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 110076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 110176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** miscellaneous functions 110276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 110376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 110476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 110576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_error (lua_State *L) { 110676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 110776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 110876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaG_errormsg(L); 110976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* code unreachable; will unlock when control actually leaves the kernel */ 111076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; /* to avoid warnings */ 111176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 111276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 111376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 111476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API int lua_next (lua_State *L, int idx) { 111576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 111676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int more; 111776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 111876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 111976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttistable(t), "table expected"); 112076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more = luaH_next(L, hvalue(t), L->top - 1); 112176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (more) { 112276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 112376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 112476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* no more elements */ 112576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top -= 1; /* remove key */ 112676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 112776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return more; 112876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 112976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 113076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 113176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_concat (lua_State *L, int n) { 113276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 113376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, n); 113476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (n >= 2) { 113576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 113676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_concat(L, n); 113776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 113876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (n == 0) { /* push empty string */ 113976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); 114076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 114176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 114276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* else n == 1; nothing to do */ 114376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 114476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 114576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 114676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 114776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_len (lua_State *L, int idx) { 114876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId t; 114976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 115076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t = index2addr(L, idx); 115176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaV_objlen(L, L->top, t); 115276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 115376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 115476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 115576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 115676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 115776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { 115876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Alloc f; 115976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 116076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ud) *ud = G(L)->ud; 116176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman f = G(L)->frealloc; 116276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 116376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return f; 116476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 116576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 116676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 116776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { 116876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 116976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman G(L)->ud = ud; 117076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman G(L)->frealloc = f; 117176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 117276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 117376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 117476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 117576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void *lua_newuserdata (lua_State *L, size_t size) { 117676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Udata *u; 117776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 117876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 117976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u = luaS_newudata(L, size, NULL); 118076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setuvalue(L, L->top, u); 118176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 118276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 118376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return u + 1; 118476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 118576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 118676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 118776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 118876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *aux_upvalue (StkId fi, int n, TValue **val, 118976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman GCObject **owner) { 119076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttype(fi)) { 119176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TCCL: { /* C closure */ 119276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CClosure *f = clCvalue(fi); 119376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!(1 <= n && n <= f->nupvalues)) return NULL; 119476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *val = &f->upvalue[n-1]; 119576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (owner) *owner = obj2gco(f); 119676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ""; 119776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 119876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLCL: { /* Lua closure */ 119976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LClosure *f = clLvalue(fi); 120076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *name; 120176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Proto *p = f->p; 120276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!(1 <= n && n <= p->sizeupvalues)) return NULL; 120376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *val = f->upvals[n-1]->v; 120476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (owner) *owner = obj2gco(f->upvals[n - 1]); 120576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman name = p->upvalues[n-1].name; 120676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (name == NULL) ? "" : getstr(name); 120776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 120876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: return NULL; /* not a closure */ 120976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 121076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 121176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 121276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 121376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { 121476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *name; 121576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *val = NULL; /* to avoid warnings */ 121676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 121776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL); 121876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (name) { 121976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj2s(L, L->top, val); 122076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_incr_top(L); 122176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 122276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 122376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return name; 122476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 122576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 122676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 122776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { 122876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *name; 122976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *val = NULL; /* to avoid warnings */ 123076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman GCObject *owner = NULL; /* to avoid warnings */ 123176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId fi; 123276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_lock(L); 123376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fi = index2addr(L, funcindex); 123476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_checknelems(L, 1); 123576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman name = aux_upvalue(fi, n, &val, &owner); 123676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (name) { 123776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; 123876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setobj(L, val, L->top); 123976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_barrier(L, owner, L->top); 124076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 124176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_unlock(L); 124276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return name; 124376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 124476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 124576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 124676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { 124776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LClosure *f; 124876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId fi = index2addr(L, fidx); 124976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, ttisLclosure(fi), "Lua function expected"); 125076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman f = clLvalue(fi); 125176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index"); 125276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (pf) *pf = f; 125376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return &f->upvals[n - 1]; /* get its upvalue pointer */ 125476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 125576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 125676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 125776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { 125876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman StkId fi = index2addr(L, fidx); 125976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ttype(fi)) { 126076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TLCL: { /* lua closure */ 126176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return *getupvalref(L, fidx, n, NULL); 126276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 126376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_TCCL: { /* C closure */ 126476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CClosure *f = clCvalue(fi); 126576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index"); 126676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return &f->upvalue[n - 1]; 126776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 126876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 126976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman api_check(L, 0, "closure expected"); 127076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 127176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 127276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 127376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 127476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 127576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 127676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, 127776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int fidx2, int n2) { 127876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LClosure *f1; 127976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman UpVal **up1 = getupvalref(L, fidx1, n1, &f1); 128076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman UpVal **up2 = getupvalref(L, fidx2, n2, NULL); 128176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *up1 = *up2; 128276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_objbarrier(L, f1, *up2); 128376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 128476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1285