1*22ce4affSfengbojiang /* BEGIN CSTYLED */
2*22ce4affSfengbojiang /*
3*22ce4affSfengbojiang ** $Id: lapi.c,v 2.171.1.1 2013/04/12 18:48:47 roberto Exp $
4*22ce4affSfengbojiang ** Lua API
5*22ce4affSfengbojiang ** See Copyright Notice in lua.h
6*22ce4affSfengbojiang */
7*22ce4affSfengbojiang
8*22ce4affSfengbojiang
9*22ce4affSfengbojiang #define lapi_c
10*22ce4affSfengbojiang #define LUA_CORE
11*22ce4affSfengbojiang
12*22ce4affSfengbojiang #include <sys/lua/lua.h>
13*22ce4affSfengbojiang
14*22ce4affSfengbojiang #include "lapi.h"
15*22ce4affSfengbojiang #include "ldebug.h"
16*22ce4affSfengbojiang #include "ldo.h"
17*22ce4affSfengbojiang #include "lfunc.h"
18*22ce4affSfengbojiang #include "lgc.h"
19*22ce4affSfengbojiang #include "lmem.h"
20*22ce4affSfengbojiang #include "lobject.h"
21*22ce4affSfengbojiang #include "lstate.h"
22*22ce4affSfengbojiang #include "lstring.h"
23*22ce4affSfengbojiang #include "ltable.h"
24*22ce4affSfengbojiang #include "ltm.h"
25*22ce4affSfengbojiang #include "lvm.h"
26*22ce4affSfengbojiang
27*22ce4affSfengbojiang
28*22ce4affSfengbojiang
29*22ce4affSfengbojiang const char lua_ident[] =
30*22ce4affSfengbojiang "$LuaVersion: " LUA_COPYRIGHT " $"
31*22ce4affSfengbojiang "$LuaAuthors: " LUA_AUTHORS " $";
32*22ce4affSfengbojiang
33*22ce4affSfengbojiang
34*22ce4affSfengbojiang /* value at a non-valid index */
35*22ce4affSfengbojiang #define NONVALIDVALUE cast(TValue *, luaO_nilobject)
36*22ce4affSfengbojiang
37*22ce4affSfengbojiang /* corresponding test */
38*22ce4affSfengbojiang #define isvalid(o) ((o) != luaO_nilobject)
39*22ce4affSfengbojiang
40*22ce4affSfengbojiang /* test for pseudo index */
41*22ce4affSfengbojiang #define ispseudo(i) ((i) <= LUA_REGISTRYINDEX)
42*22ce4affSfengbojiang
43*22ce4affSfengbojiang /* test for valid but not pseudo index */
44*22ce4affSfengbojiang #define isstackindex(i, o) (isvalid(o) && !ispseudo(i))
45*22ce4affSfengbojiang
46*22ce4affSfengbojiang #define api_checkvalidindex(L, o) api_check(L, isvalid(o), "invalid index")
47*22ce4affSfengbojiang
48*22ce4affSfengbojiang #define api_checkstackindex(L, i, o) \
49*22ce4affSfengbojiang api_check(L, isstackindex(i, o), "index not in the stack")
50*22ce4affSfengbojiang
51*22ce4affSfengbojiang
index2addr(lua_State * L,int idx)52*22ce4affSfengbojiang static TValue *index2addr (lua_State *L, int idx) {
53*22ce4affSfengbojiang CallInfo *ci = L->ci;
54*22ce4affSfengbojiang if (idx > 0) {
55*22ce4affSfengbojiang TValue *o = ci->func + idx;
56*22ce4affSfengbojiang api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");
57*22ce4affSfengbojiang if (o >= L->top) return NONVALIDVALUE;
58*22ce4affSfengbojiang else return o;
59*22ce4affSfengbojiang }
60*22ce4affSfengbojiang else if (!ispseudo(idx)) { /* negative index */
61*22ce4affSfengbojiang api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
62*22ce4affSfengbojiang return L->top + idx;
63*22ce4affSfengbojiang }
64*22ce4affSfengbojiang else if (idx == LUA_REGISTRYINDEX)
65*22ce4affSfengbojiang return &G(L)->l_registry;
66*22ce4affSfengbojiang else { /* upvalues */
67*22ce4affSfengbojiang idx = LUA_REGISTRYINDEX - idx;
68*22ce4affSfengbojiang api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
69*22ce4affSfengbojiang if (ttislcf(ci->func)) /* light C function? */
70*22ce4affSfengbojiang return NONVALIDVALUE; /* it has no upvalues */
71*22ce4affSfengbojiang else {
72*22ce4affSfengbojiang CClosure *func = clCvalue(ci->func);
73*22ce4affSfengbojiang return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;
74*22ce4affSfengbojiang }
75*22ce4affSfengbojiang }
76*22ce4affSfengbojiang }
77*22ce4affSfengbojiang
78*22ce4affSfengbojiang
79*22ce4affSfengbojiang /*
80*22ce4affSfengbojiang ** to be called by 'lua_checkstack' in protected mode, to grow stack
81*22ce4affSfengbojiang ** capturing memory errors
82*22ce4affSfengbojiang */
growstack(lua_State * L,void * ud)83*22ce4affSfengbojiang static void growstack (lua_State *L, void *ud) {
84*22ce4affSfengbojiang int size = *(int *)ud;
85*22ce4affSfengbojiang luaD_growstack(L, size);
86*22ce4affSfengbojiang }
87*22ce4affSfengbojiang
88*22ce4affSfengbojiang
lua_checkstack(lua_State * L,int size)89*22ce4affSfengbojiang LUA_API int lua_checkstack (lua_State *L, int size) {
90*22ce4affSfengbojiang int res;
91*22ce4affSfengbojiang CallInfo *ci = L->ci;
92*22ce4affSfengbojiang lua_lock(L);
93*22ce4affSfengbojiang if (L->stack_last - L->top > size) /* stack large enough? */
94*22ce4affSfengbojiang res = 1; /* yes; check is OK */
95*22ce4affSfengbojiang else { /* no; need to grow stack */
96*22ce4affSfengbojiang int inuse = cast_int(L->top - L->stack) + EXTRA_STACK;
97*22ce4affSfengbojiang if (inuse > LUAI_MAXSTACK - size) /* can grow without overflow? */
98*22ce4affSfengbojiang res = 0; /* no */
99*22ce4affSfengbojiang else /* try to grow stack */
100*22ce4affSfengbojiang res = (luaD_rawrunprotected(L, &growstack, &size) == LUA_OK);
101*22ce4affSfengbojiang }
102*22ce4affSfengbojiang if (res && ci->top < L->top + size)
103*22ce4affSfengbojiang ci->top = L->top + size; /* adjust frame top */
104*22ce4affSfengbojiang lua_unlock(L);
105*22ce4affSfengbojiang return res;
106*22ce4affSfengbojiang }
107*22ce4affSfengbojiang
108*22ce4affSfengbojiang
lua_xmove(lua_State * from,lua_State * to,int n)109*22ce4affSfengbojiang LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
110*22ce4affSfengbojiang int i;
111*22ce4affSfengbojiang if (from == to) return;
112*22ce4affSfengbojiang lua_lock(to);
113*22ce4affSfengbojiang api_checknelems(from, n);
114*22ce4affSfengbojiang api_check(from, G(from) == G(to), "moving among independent states");
115*22ce4affSfengbojiang api_check(from, to->ci->top - to->top >= n, "not enough elements to move");
116*22ce4affSfengbojiang from->top -= n;
117*22ce4affSfengbojiang for (i = 0; i < n; i++) {
118*22ce4affSfengbojiang setobj2s(to, to->top++, from->top + i);
119*22ce4affSfengbojiang }
120*22ce4affSfengbojiang lua_unlock(to);
121*22ce4affSfengbojiang }
122*22ce4affSfengbojiang
123*22ce4affSfengbojiang
lua_atpanic(lua_State * L,lua_CFunction panicf)124*22ce4affSfengbojiang LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
125*22ce4affSfengbojiang lua_CFunction old;
126*22ce4affSfengbojiang lua_lock(L);
127*22ce4affSfengbojiang old = G(L)->panic;
128*22ce4affSfengbojiang G(L)->panic = panicf;
129*22ce4affSfengbojiang lua_unlock(L);
130*22ce4affSfengbojiang return old;
131*22ce4affSfengbojiang }
132*22ce4affSfengbojiang
133*22ce4affSfengbojiang
lua_version(lua_State * L)134*22ce4affSfengbojiang LUA_API const lua_Number *lua_version (lua_State *L) {
135*22ce4affSfengbojiang static const lua_Number version = LUA_VERSION_NUM;
136*22ce4affSfengbojiang if (L == NULL) return &version;
137*22ce4affSfengbojiang else return G(L)->version;
138*22ce4affSfengbojiang }
139*22ce4affSfengbojiang
140*22ce4affSfengbojiang
141*22ce4affSfengbojiang
142*22ce4affSfengbojiang /*
143*22ce4affSfengbojiang ** basic stack manipulation
144*22ce4affSfengbojiang */
145*22ce4affSfengbojiang
146*22ce4affSfengbojiang
147*22ce4affSfengbojiang /*
148*22ce4affSfengbojiang ** convert an acceptable stack index into an absolute index
149*22ce4affSfengbojiang */
lua_absindex(lua_State * L,int idx)150*22ce4affSfengbojiang LUA_API int lua_absindex (lua_State *L, int idx) {
151*22ce4affSfengbojiang return (idx > 0 || ispseudo(idx))
152*22ce4affSfengbojiang ? idx
153*22ce4affSfengbojiang : cast_int(L->top - L->ci->func + idx);
154*22ce4affSfengbojiang }
155*22ce4affSfengbojiang
156*22ce4affSfengbojiang
lua_gettop(lua_State * L)157*22ce4affSfengbojiang LUA_API int lua_gettop (lua_State *L) {
158*22ce4affSfengbojiang return cast_int(L->top - (L->ci->func + 1));
159*22ce4affSfengbojiang }
160*22ce4affSfengbojiang
161*22ce4affSfengbojiang
lua_settop(lua_State * L,int idx)162*22ce4affSfengbojiang LUA_API void lua_settop (lua_State *L, int idx) {
163*22ce4affSfengbojiang StkId func = L->ci->func;
164*22ce4affSfengbojiang lua_lock(L);
165*22ce4affSfengbojiang if (idx >= 0) {
166*22ce4affSfengbojiang api_check(L, idx <= L->stack_last - (func + 1), "new top too large");
167*22ce4affSfengbojiang while (L->top < (func + 1) + idx)
168*22ce4affSfengbojiang setnilvalue(L->top++);
169*22ce4affSfengbojiang L->top = (func + 1) + idx;
170*22ce4affSfengbojiang }
171*22ce4affSfengbojiang else {
172*22ce4affSfengbojiang api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
173*22ce4affSfengbojiang L->top += idx+1; /* `subtract' index (index is negative) */
174*22ce4affSfengbojiang }
175*22ce4affSfengbojiang lua_unlock(L);
176*22ce4affSfengbojiang }
177*22ce4affSfengbojiang
178*22ce4affSfengbojiang
lua_remove(lua_State * L,int idx)179*22ce4affSfengbojiang LUA_API void lua_remove (lua_State *L, int idx) {
180*22ce4affSfengbojiang StkId p;
181*22ce4affSfengbojiang lua_lock(L);
182*22ce4affSfengbojiang p = index2addr(L, idx);
183*22ce4affSfengbojiang api_checkstackindex(L, idx, p);
184*22ce4affSfengbojiang while (++p < L->top) setobjs2s(L, p-1, p);
185*22ce4affSfengbojiang L->top--;
186*22ce4affSfengbojiang lua_unlock(L);
187*22ce4affSfengbojiang }
188*22ce4affSfengbojiang
189*22ce4affSfengbojiang
lua_insert(lua_State * L,int idx)190*22ce4affSfengbojiang LUA_API void lua_insert (lua_State *L, int idx) {
191*22ce4affSfengbojiang StkId p;
192*22ce4affSfengbojiang StkId q;
193*22ce4affSfengbojiang lua_lock(L);
194*22ce4affSfengbojiang p = index2addr(L, idx);
195*22ce4affSfengbojiang api_checkstackindex(L, idx, p);
196*22ce4affSfengbojiang for (q = L->top; q > p; q--) /* use L->top as a temporary */
197*22ce4affSfengbojiang setobjs2s(L, q, q - 1);
198*22ce4affSfengbojiang setobjs2s(L, p, L->top);
199*22ce4affSfengbojiang lua_unlock(L);
200*22ce4affSfengbojiang }
201*22ce4affSfengbojiang
202*22ce4affSfengbojiang
moveto(lua_State * L,TValue * fr,int idx)203*22ce4affSfengbojiang static void moveto (lua_State *L, TValue *fr, int idx) {
204*22ce4affSfengbojiang TValue *to = index2addr(L, idx);
205*22ce4affSfengbojiang api_checkvalidindex(L, to);
206*22ce4affSfengbojiang setobj(L, to, fr);
207*22ce4affSfengbojiang if (idx < LUA_REGISTRYINDEX) /* function upvalue? */
208*22ce4affSfengbojiang luaC_barrier(L, clCvalue(L->ci->func), fr);
209*22ce4affSfengbojiang /* LUA_REGISTRYINDEX does not need gc barrier
210*22ce4affSfengbojiang (collector revisits it before finishing collection) */
211*22ce4affSfengbojiang }
212*22ce4affSfengbojiang
213*22ce4affSfengbojiang
lua_replace(lua_State * L,int idx)214*22ce4affSfengbojiang LUA_API void lua_replace (lua_State *L, int idx) {
215*22ce4affSfengbojiang lua_lock(L);
216*22ce4affSfengbojiang api_checknelems(L, 1);
217*22ce4affSfengbojiang moveto(L, L->top - 1, idx);
218*22ce4affSfengbojiang L->top--;
219*22ce4affSfengbojiang lua_unlock(L);
220*22ce4affSfengbojiang }
221*22ce4affSfengbojiang
222*22ce4affSfengbojiang
lua_copy(lua_State * L,int fromidx,int toidx)223*22ce4affSfengbojiang LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
224*22ce4affSfengbojiang TValue *fr;
225*22ce4affSfengbojiang lua_lock(L);
226*22ce4affSfengbojiang fr = index2addr(L, fromidx);
227*22ce4affSfengbojiang moveto(L, fr, toidx);
228*22ce4affSfengbojiang lua_unlock(L);
229*22ce4affSfengbojiang }
230*22ce4affSfengbojiang
231*22ce4affSfengbojiang
lua_pushvalue(lua_State * L,int idx)232*22ce4affSfengbojiang LUA_API void lua_pushvalue (lua_State *L, int idx) {
233*22ce4affSfengbojiang lua_lock(L);
234*22ce4affSfengbojiang setobj2s(L, L->top, index2addr(L, idx));
235*22ce4affSfengbojiang api_incr_top(L);
236*22ce4affSfengbojiang lua_unlock(L);
237*22ce4affSfengbojiang }
238*22ce4affSfengbojiang
239*22ce4affSfengbojiang
240*22ce4affSfengbojiang
241*22ce4affSfengbojiang /*
242*22ce4affSfengbojiang ** access functions (stack -> C)
243*22ce4affSfengbojiang */
244*22ce4affSfengbojiang
245*22ce4affSfengbojiang
lua_type(lua_State * L,int idx)246*22ce4affSfengbojiang LUA_API int lua_type (lua_State *L, int idx) {
247*22ce4affSfengbojiang StkId o = index2addr(L, idx);
248*22ce4affSfengbojiang return (isvalid(o) ? ttypenv(o) : LUA_TNONE);
249*22ce4affSfengbojiang }
250*22ce4affSfengbojiang
251*22ce4affSfengbojiang
lua_typename(lua_State * L,int t)252*22ce4affSfengbojiang LUA_API const char *lua_typename (lua_State *L, int t) {
253*22ce4affSfengbojiang UNUSED(L);
254*22ce4affSfengbojiang return ttypename(t);
255*22ce4affSfengbojiang }
256*22ce4affSfengbojiang
257*22ce4affSfengbojiang
lua_iscfunction(lua_State * L,int idx)258*22ce4affSfengbojiang LUA_API int lua_iscfunction (lua_State *L, int idx) {
259*22ce4affSfengbojiang StkId o = index2addr(L, idx);
260*22ce4affSfengbojiang return (ttislcf(o) || (ttisCclosure(o)));
261*22ce4affSfengbojiang }
262*22ce4affSfengbojiang
263*22ce4affSfengbojiang
lua_isnumber(lua_State * L,int idx)264*22ce4affSfengbojiang LUA_API int lua_isnumber (lua_State *L, int idx) {
265*22ce4affSfengbojiang TValue n;
266*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
267*22ce4affSfengbojiang return tonumber(o, &n);
268*22ce4affSfengbojiang }
269*22ce4affSfengbojiang
270*22ce4affSfengbojiang
lua_isstring(lua_State * L,int idx)271*22ce4affSfengbojiang LUA_API int lua_isstring (lua_State *L, int idx) {
272*22ce4affSfengbojiang int t = lua_type(L, idx);
273*22ce4affSfengbojiang return (t == LUA_TSTRING || t == LUA_TNUMBER);
274*22ce4affSfengbojiang }
275*22ce4affSfengbojiang
276*22ce4affSfengbojiang
lua_isuserdata(lua_State * L,int idx)277*22ce4affSfengbojiang LUA_API int lua_isuserdata (lua_State *L, int idx) {
278*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
279*22ce4affSfengbojiang return (ttisuserdata(o) || ttislightuserdata(o));
280*22ce4affSfengbojiang }
281*22ce4affSfengbojiang
282*22ce4affSfengbojiang
lua_rawequal(lua_State * L,int index1,int index2)283*22ce4affSfengbojiang LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
284*22ce4affSfengbojiang StkId o1 = index2addr(L, index1);
285*22ce4affSfengbojiang StkId o2 = index2addr(L, index2);
286*22ce4affSfengbojiang return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0;
287*22ce4affSfengbojiang }
288*22ce4affSfengbojiang
289*22ce4affSfengbojiang
lua_arith(lua_State * L,int op)290*22ce4affSfengbojiang LUA_API void lua_arith (lua_State *L, int op) {
291*22ce4affSfengbojiang StkId o1; /* 1st operand */
292*22ce4affSfengbojiang StkId o2; /* 2nd operand */
293*22ce4affSfengbojiang lua_lock(L);
294*22ce4affSfengbojiang if (op != LUA_OPUNM) /* all other operations expect two operands */
295*22ce4affSfengbojiang api_checknelems(L, 2);
296*22ce4affSfengbojiang else { /* for unary minus, add fake 2nd operand */
297*22ce4affSfengbojiang api_checknelems(L, 1);
298*22ce4affSfengbojiang setobjs2s(L, L->top, L->top - 1);
299*22ce4affSfengbojiang L->top++;
300*22ce4affSfengbojiang }
301*22ce4affSfengbojiang o1 = L->top - 2;
302*22ce4affSfengbojiang o2 = L->top - 1;
303*22ce4affSfengbojiang if (ttisnumber(o1) && ttisnumber(o2)) {
304*22ce4affSfengbojiang setnvalue(o1, luaO_arith(op, nvalue(o1), nvalue(o2)));
305*22ce4affSfengbojiang }
306*22ce4affSfengbojiang else
307*22ce4affSfengbojiang luaV_arith(L, o1, o1, o2, cast(TMS, op - LUA_OPADD + TM_ADD));
308*22ce4affSfengbojiang L->top--;
309*22ce4affSfengbojiang lua_unlock(L);
310*22ce4affSfengbojiang }
311*22ce4affSfengbojiang
312*22ce4affSfengbojiang
lua_compare(lua_State * L,int index1,int index2,int op)313*22ce4affSfengbojiang LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
314*22ce4affSfengbojiang StkId o1, o2;
315*22ce4affSfengbojiang int i = 0;
316*22ce4affSfengbojiang lua_lock(L); /* may call tag method */
317*22ce4affSfengbojiang o1 = index2addr(L, index1);
318*22ce4affSfengbojiang o2 = index2addr(L, index2);
319*22ce4affSfengbojiang if (isvalid(o1) && isvalid(o2)) {
320*22ce4affSfengbojiang switch (op) {
321*22ce4affSfengbojiang case LUA_OPEQ: i = equalobj(L, o1, o2); break;
322*22ce4affSfengbojiang case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;
323*22ce4affSfengbojiang case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;
324*22ce4affSfengbojiang default: api_check(L, 0, "invalid option");
325*22ce4affSfengbojiang }
326*22ce4affSfengbojiang }
327*22ce4affSfengbojiang lua_unlock(L);
328*22ce4affSfengbojiang return i;
329*22ce4affSfengbojiang }
330*22ce4affSfengbojiang
331*22ce4affSfengbojiang
lua_tonumberx(lua_State * L,int idx,int * isnum)332*22ce4affSfengbojiang LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum) {
333*22ce4affSfengbojiang TValue n;
334*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
335*22ce4affSfengbojiang if (tonumber(o, &n)) {
336*22ce4affSfengbojiang if (isnum) *isnum = 1;
337*22ce4affSfengbojiang return nvalue(o);
338*22ce4affSfengbojiang }
339*22ce4affSfengbojiang else {
340*22ce4affSfengbojiang if (isnum) *isnum = 0;
341*22ce4affSfengbojiang return 0;
342*22ce4affSfengbojiang }
343*22ce4affSfengbojiang }
344*22ce4affSfengbojiang
345*22ce4affSfengbojiang
lua_tointegerx(lua_State * L,int idx,int * isnum)346*22ce4affSfengbojiang LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum) {
347*22ce4affSfengbojiang TValue n;
348*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
349*22ce4affSfengbojiang if (tonumber(o, &n)) {
350*22ce4affSfengbojiang lua_Integer res;
351*22ce4affSfengbojiang lua_Number num = nvalue(o);
352*22ce4affSfengbojiang lua_number2integer(res, num);
353*22ce4affSfengbojiang if (isnum) *isnum = 1;
354*22ce4affSfengbojiang return res;
355*22ce4affSfengbojiang }
356*22ce4affSfengbojiang else {
357*22ce4affSfengbojiang if (isnum) *isnum = 0;
358*22ce4affSfengbojiang return 0;
359*22ce4affSfengbojiang }
360*22ce4affSfengbojiang }
361*22ce4affSfengbojiang
362*22ce4affSfengbojiang
lua_tounsignedx(lua_State * L,int idx,int * isnum)363*22ce4affSfengbojiang LUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *isnum) {
364*22ce4affSfengbojiang TValue n;
365*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
366*22ce4affSfengbojiang if (tonumber(o, &n)) {
367*22ce4affSfengbojiang lua_Unsigned res;
368*22ce4affSfengbojiang lua_Number num = nvalue(o);
369*22ce4affSfengbojiang lua_number2unsigned(res, num);
370*22ce4affSfengbojiang if (isnum) *isnum = 1;
371*22ce4affSfengbojiang return res;
372*22ce4affSfengbojiang }
373*22ce4affSfengbojiang else {
374*22ce4affSfengbojiang if (isnum) *isnum = 0;
375*22ce4affSfengbojiang return 0;
376*22ce4affSfengbojiang }
377*22ce4affSfengbojiang }
378*22ce4affSfengbojiang
379*22ce4affSfengbojiang
lua_toboolean(lua_State * L,int idx)380*22ce4affSfengbojiang LUA_API int lua_toboolean (lua_State *L, int idx) {
381*22ce4affSfengbojiang const TValue *o = index2addr(L, idx);
382*22ce4affSfengbojiang return !l_isfalse(o);
383*22ce4affSfengbojiang }
384*22ce4affSfengbojiang
385*22ce4affSfengbojiang
lua_tolstring(lua_State * L,int idx,size_t * len)386*22ce4affSfengbojiang LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
387*22ce4affSfengbojiang StkId o = index2addr(L, idx);
388*22ce4affSfengbojiang if (!ttisstring(o)) {
389*22ce4affSfengbojiang lua_lock(L); /* `luaV_tostring' may create a new string */
390*22ce4affSfengbojiang if (!luaV_tostring(L, o)) { /* conversion failed? */
391*22ce4affSfengbojiang if (len != NULL) *len = 0;
392*22ce4affSfengbojiang lua_unlock(L);
393*22ce4affSfengbojiang return NULL;
394*22ce4affSfengbojiang }
395*22ce4affSfengbojiang luaC_checkGC(L);
396*22ce4affSfengbojiang o = index2addr(L, idx); /* previous call may reallocate the stack */
397*22ce4affSfengbojiang lua_unlock(L);
398*22ce4affSfengbojiang }
399*22ce4affSfengbojiang if (len != NULL) *len = tsvalue(o)->len;
400*22ce4affSfengbojiang return svalue(o);
401*22ce4affSfengbojiang }
402*22ce4affSfengbojiang
403*22ce4affSfengbojiang
lua_rawlen(lua_State * L,int idx)404*22ce4affSfengbojiang LUA_API size_t lua_rawlen (lua_State *L, int idx) {
405*22ce4affSfengbojiang StkId o = index2addr(L, idx);
406*22ce4affSfengbojiang switch (ttypenv(o)) {
407*22ce4affSfengbojiang case LUA_TSTRING: return tsvalue(o)->len;
408*22ce4affSfengbojiang case LUA_TUSERDATA: return uvalue(o)->len;
409*22ce4affSfengbojiang case LUA_TTABLE: return luaH_getn(hvalue(o));
410*22ce4affSfengbojiang default: return 0;
411*22ce4affSfengbojiang }
412*22ce4affSfengbojiang }
413*22ce4affSfengbojiang
414*22ce4affSfengbojiang
lua_tocfunction(lua_State * L,int idx)415*22ce4affSfengbojiang LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
416*22ce4affSfengbojiang StkId o = index2addr(L, idx);
417*22ce4affSfengbojiang if (ttislcf(o)) return fvalue(o);
418*22ce4affSfengbojiang else if (ttisCclosure(o))
419*22ce4affSfengbojiang return clCvalue(o)->f;
420*22ce4affSfengbojiang else return NULL; /* not a C function */
421*22ce4affSfengbojiang }
422*22ce4affSfengbojiang
423*22ce4affSfengbojiang
lua_touserdata(lua_State * L,int idx)424*22ce4affSfengbojiang LUA_API void *lua_touserdata (lua_State *L, int idx) {
425*22ce4affSfengbojiang StkId o = index2addr(L, idx);
426*22ce4affSfengbojiang switch (ttypenv(o)) {
427*22ce4affSfengbojiang case LUA_TUSERDATA: return ((void *)(rawuvalue(o) + 1));
428*22ce4affSfengbojiang case LUA_TLIGHTUSERDATA: return pvalue(o);
429*22ce4affSfengbojiang default: return NULL;
430*22ce4affSfengbojiang }
431*22ce4affSfengbojiang }
432*22ce4affSfengbojiang
433*22ce4affSfengbojiang
lua_tothread(lua_State * L,int idx)434*22ce4affSfengbojiang LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
435*22ce4affSfengbojiang StkId o = index2addr(L, idx);
436*22ce4affSfengbojiang return (!ttisthread(o)) ? NULL : thvalue(o);
437*22ce4affSfengbojiang }
438*22ce4affSfengbojiang
439*22ce4affSfengbojiang
lua_topointer(lua_State * L,int idx)440*22ce4affSfengbojiang LUA_API const void *lua_topointer (lua_State *L, int idx) {
441*22ce4affSfengbojiang StkId o = index2addr(L, idx);
442*22ce4affSfengbojiang switch (ttype(o)) {
443*22ce4affSfengbojiang case LUA_TTABLE: return hvalue(o);
444*22ce4affSfengbojiang case LUA_TLCL: return clLvalue(o);
445*22ce4affSfengbojiang case LUA_TCCL: return clCvalue(o);
446*22ce4affSfengbojiang case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o)));
447*22ce4affSfengbojiang case LUA_TTHREAD: return thvalue(o);
448*22ce4affSfengbojiang case LUA_TUSERDATA:
449*22ce4affSfengbojiang case LUA_TLIGHTUSERDATA:
450*22ce4affSfengbojiang return lua_touserdata(L, idx);
451*22ce4affSfengbojiang default: return NULL;
452*22ce4affSfengbojiang }
453*22ce4affSfengbojiang }
454*22ce4affSfengbojiang
455*22ce4affSfengbojiang
456*22ce4affSfengbojiang
457*22ce4affSfengbojiang /*
458*22ce4affSfengbojiang ** push functions (C -> stack)
459*22ce4affSfengbojiang */
460*22ce4affSfengbojiang
461*22ce4affSfengbojiang
lua_pushnil(lua_State * L)462*22ce4affSfengbojiang LUA_API void lua_pushnil (lua_State *L) {
463*22ce4affSfengbojiang lua_lock(L);
464*22ce4affSfengbojiang setnilvalue(L->top);
465*22ce4affSfengbojiang api_incr_top(L);
466*22ce4affSfengbojiang lua_unlock(L);
467*22ce4affSfengbojiang }
468*22ce4affSfengbojiang
469*22ce4affSfengbojiang
lua_pushnumber(lua_State * L,lua_Number n)470*22ce4affSfengbojiang LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
471*22ce4affSfengbojiang lua_lock(L);
472*22ce4affSfengbojiang setnvalue(L->top, n);
473*22ce4affSfengbojiang luai_checknum(L, L->top,
474*22ce4affSfengbojiang luaG_runerror(L, "C API - attempt to push a signaling NaN"));
475*22ce4affSfengbojiang api_incr_top(L);
476*22ce4affSfengbojiang lua_unlock(L);
477*22ce4affSfengbojiang }
478*22ce4affSfengbojiang
479*22ce4affSfengbojiang
lua_pushinteger(lua_State * L,lua_Integer n)480*22ce4affSfengbojiang LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
481*22ce4affSfengbojiang lua_lock(L);
482*22ce4affSfengbojiang setnvalue(L->top, cast_num(n));
483*22ce4affSfengbojiang api_incr_top(L);
484*22ce4affSfengbojiang lua_unlock(L);
485*22ce4affSfengbojiang }
486*22ce4affSfengbojiang
487*22ce4affSfengbojiang
lua_pushunsigned(lua_State * L,lua_Unsigned u)488*22ce4affSfengbojiang LUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) {
489*22ce4affSfengbojiang lua_Number n;
490*22ce4affSfengbojiang lua_lock(L);
491*22ce4affSfengbojiang n = lua_unsigned2number(u);
492*22ce4affSfengbojiang setnvalue(L->top, n);
493*22ce4affSfengbojiang api_incr_top(L);
494*22ce4affSfengbojiang lua_unlock(L);
495*22ce4affSfengbojiang }
496*22ce4affSfengbojiang
497*22ce4affSfengbojiang
lua_pushlstring(lua_State * L,const char * s,size_t len)498*22ce4affSfengbojiang LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
499*22ce4affSfengbojiang TString *ts;
500*22ce4affSfengbojiang lua_lock(L);
501*22ce4affSfengbojiang luaC_checkGC(L);
502*22ce4affSfengbojiang ts = luaS_newlstr(L, s, len);
503*22ce4affSfengbojiang setsvalue2s(L, L->top, ts);
504*22ce4affSfengbojiang api_incr_top(L);
505*22ce4affSfengbojiang lua_unlock(L);
506*22ce4affSfengbojiang return getstr(ts);
507*22ce4affSfengbojiang }
508*22ce4affSfengbojiang
509*22ce4affSfengbojiang
lua_pushstring(lua_State * L,const char * s)510*22ce4affSfengbojiang LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
511*22ce4affSfengbojiang if (s == NULL) {
512*22ce4affSfengbojiang lua_pushnil(L);
513*22ce4affSfengbojiang return NULL;
514*22ce4affSfengbojiang }
515*22ce4affSfengbojiang else {
516*22ce4affSfengbojiang TString *ts;
517*22ce4affSfengbojiang lua_lock(L);
518*22ce4affSfengbojiang luaC_checkGC(L);
519*22ce4affSfengbojiang ts = luaS_new(L, s);
520*22ce4affSfengbojiang setsvalue2s(L, L->top, ts);
521*22ce4affSfengbojiang api_incr_top(L);
522*22ce4affSfengbojiang lua_unlock(L);
523*22ce4affSfengbojiang return getstr(ts);
524*22ce4affSfengbojiang }
525*22ce4affSfengbojiang }
526*22ce4affSfengbojiang
527*22ce4affSfengbojiang
lua_pushvfstring(lua_State * L,const char * fmt,va_list argp)528*22ce4affSfengbojiang LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
529*22ce4affSfengbojiang va_list argp) {
530*22ce4affSfengbojiang const char *ret;
531*22ce4affSfengbojiang lua_lock(L);
532*22ce4affSfengbojiang luaC_checkGC(L);
533*22ce4affSfengbojiang ret = luaO_pushvfstring(L, fmt, argp);
534*22ce4affSfengbojiang lua_unlock(L);
535*22ce4affSfengbojiang return ret;
536*22ce4affSfengbojiang }
537*22ce4affSfengbojiang
538*22ce4affSfengbojiang
lua_pushfstring(lua_State * L,const char * fmt,...)539*22ce4affSfengbojiang LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
540*22ce4affSfengbojiang const char *ret;
541*22ce4affSfengbojiang va_list argp;
542*22ce4affSfengbojiang lua_lock(L);
543*22ce4affSfengbojiang luaC_checkGC(L);
544*22ce4affSfengbojiang va_start(argp, fmt);
545*22ce4affSfengbojiang ret = luaO_pushvfstring(L, fmt, argp);
546*22ce4affSfengbojiang va_end(argp);
547*22ce4affSfengbojiang lua_unlock(L);
548*22ce4affSfengbojiang return ret;
549*22ce4affSfengbojiang }
550*22ce4affSfengbojiang
551*22ce4affSfengbojiang
lua_pushcclosure(lua_State * L,lua_CFunction fn,int n)552*22ce4affSfengbojiang LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
553*22ce4affSfengbojiang lua_lock(L);
554*22ce4affSfengbojiang if (n == 0) {
555*22ce4affSfengbojiang setfvalue(L->top, fn);
556*22ce4affSfengbojiang }
557*22ce4affSfengbojiang else {
558*22ce4affSfengbojiang Closure *cl;
559*22ce4affSfengbojiang api_checknelems(L, n);
560*22ce4affSfengbojiang api_check(L, n <= MAXUPVAL, "upvalue index too large");
561*22ce4affSfengbojiang luaC_checkGC(L);
562*22ce4affSfengbojiang cl = luaF_newCclosure(L, n);
563*22ce4affSfengbojiang cl->c.f = fn;
564*22ce4affSfengbojiang L->top -= n;
565*22ce4affSfengbojiang while (n--)
566*22ce4affSfengbojiang setobj2n(L, &cl->c.upvalue[n], L->top + n);
567*22ce4affSfengbojiang setclCvalue(L, L->top, cl);
568*22ce4affSfengbojiang }
569*22ce4affSfengbojiang api_incr_top(L);
570*22ce4affSfengbojiang lua_unlock(L);
571*22ce4affSfengbojiang }
572*22ce4affSfengbojiang
573*22ce4affSfengbojiang
lua_pushboolean(lua_State * L,int b)574*22ce4affSfengbojiang LUA_API void lua_pushboolean (lua_State *L, int b) {
575*22ce4affSfengbojiang lua_lock(L);
576*22ce4affSfengbojiang setbvalue(L->top, (b != 0)); /* ensure that true is 1 */
577*22ce4affSfengbojiang api_incr_top(L);
578*22ce4affSfengbojiang lua_unlock(L);
579*22ce4affSfengbojiang }
580*22ce4affSfengbojiang
581*22ce4affSfengbojiang
lua_pushlightuserdata(lua_State * L,void * p)582*22ce4affSfengbojiang LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
583*22ce4affSfengbojiang lua_lock(L);
584*22ce4affSfengbojiang setpvalue(L->top, p);
585*22ce4affSfengbojiang api_incr_top(L);
586*22ce4affSfengbojiang lua_unlock(L);
587*22ce4affSfengbojiang }
588*22ce4affSfengbojiang
589*22ce4affSfengbojiang
lua_pushthread(lua_State * L)590*22ce4affSfengbojiang LUA_API int lua_pushthread (lua_State *L) {
591*22ce4affSfengbojiang lua_lock(L);
592*22ce4affSfengbojiang setthvalue(L, L->top, L);
593*22ce4affSfengbojiang api_incr_top(L);
594*22ce4affSfengbojiang lua_unlock(L);
595*22ce4affSfengbojiang return (G(L)->mainthread == L);
596*22ce4affSfengbojiang }
597*22ce4affSfengbojiang
598*22ce4affSfengbojiang
599*22ce4affSfengbojiang
600*22ce4affSfengbojiang /*
601*22ce4affSfengbojiang ** get functions (Lua -> stack)
602*22ce4affSfengbojiang */
603*22ce4affSfengbojiang
604*22ce4affSfengbojiang
lua_getglobal(lua_State * L,const char * var)605*22ce4affSfengbojiang LUA_API void lua_getglobal (lua_State *L, const char *var) {
606*22ce4affSfengbojiang Table *reg = hvalue(&G(L)->l_registry);
607*22ce4affSfengbojiang const TValue *gt; /* global table */
608*22ce4affSfengbojiang lua_lock(L);
609*22ce4affSfengbojiang gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
610*22ce4affSfengbojiang setsvalue2s(L, L->top++, luaS_new(L, var));
611*22ce4affSfengbojiang luaV_gettable(L, gt, L->top - 1, L->top - 1);
612*22ce4affSfengbojiang lua_unlock(L);
613*22ce4affSfengbojiang }
614*22ce4affSfengbojiang
615*22ce4affSfengbojiang
lua_gettable(lua_State * L,int idx)616*22ce4affSfengbojiang LUA_API void lua_gettable (lua_State *L, int idx) {
617*22ce4affSfengbojiang StkId t;
618*22ce4affSfengbojiang lua_lock(L);
619*22ce4affSfengbojiang t = index2addr(L, idx);
620*22ce4affSfengbojiang luaV_gettable(L, t, L->top - 1, L->top - 1);
621*22ce4affSfengbojiang lua_unlock(L);
622*22ce4affSfengbojiang }
623*22ce4affSfengbojiang
624*22ce4affSfengbojiang
lua_getfield(lua_State * L,int idx,const char * k)625*22ce4affSfengbojiang LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
626*22ce4affSfengbojiang StkId t;
627*22ce4affSfengbojiang lua_lock(L);
628*22ce4affSfengbojiang t = index2addr(L, idx);
629*22ce4affSfengbojiang setsvalue2s(L, L->top, luaS_new(L, k));
630*22ce4affSfengbojiang api_incr_top(L);
631*22ce4affSfengbojiang luaV_gettable(L, t, L->top - 1, L->top - 1);
632*22ce4affSfengbojiang lua_unlock(L);
633*22ce4affSfengbojiang }
634*22ce4affSfengbojiang
635*22ce4affSfengbojiang
lua_rawget(lua_State * L,int idx)636*22ce4affSfengbojiang LUA_API void lua_rawget (lua_State *L, int idx) {
637*22ce4affSfengbojiang StkId t;
638*22ce4affSfengbojiang lua_lock(L);
639*22ce4affSfengbojiang t = index2addr(L, idx);
640*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
641*22ce4affSfengbojiang setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
642*22ce4affSfengbojiang lua_unlock(L);
643*22ce4affSfengbojiang }
644*22ce4affSfengbojiang
645*22ce4affSfengbojiang
lua_rawgeti(lua_State * L,int idx,int n)646*22ce4affSfengbojiang LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
647*22ce4affSfengbojiang StkId t;
648*22ce4affSfengbojiang lua_lock(L);
649*22ce4affSfengbojiang t = index2addr(L, idx);
650*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
651*22ce4affSfengbojiang setobj2s(L, L->top, luaH_getint(hvalue(t), n));
652*22ce4affSfengbojiang api_incr_top(L);
653*22ce4affSfengbojiang lua_unlock(L);
654*22ce4affSfengbojiang }
655*22ce4affSfengbojiang
656*22ce4affSfengbojiang
lua_rawgetp(lua_State * L,int idx,const void * p)657*22ce4affSfengbojiang LUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) {
658*22ce4affSfengbojiang StkId t;
659*22ce4affSfengbojiang TValue k;
660*22ce4affSfengbojiang lua_lock(L);
661*22ce4affSfengbojiang t = index2addr(L, idx);
662*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
663*22ce4affSfengbojiang setpvalue(&k, cast(void *, p));
664*22ce4affSfengbojiang setobj2s(L, L->top, luaH_get(hvalue(t), &k));
665*22ce4affSfengbojiang api_incr_top(L);
666*22ce4affSfengbojiang lua_unlock(L);
667*22ce4affSfengbojiang }
668*22ce4affSfengbojiang
669*22ce4affSfengbojiang
lua_createtable(lua_State * L,int narray,int nrec)670*22ce4affSfengbojiang LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
671*22ce4affSfengbojiang Table *t;
672*22ce4affSfengbojiang lua_lock(L);
673*22ce4affSfengbojiang luaC_checkGC(L);
674*22ce4affSfengbojiang t = luaH_new(L);
675*22ce4affSfengbojiang sethvalue(L, L->top, t);
676*22ce4affSfengbojiang api_incr_top(L);
677*22ce4affSfengbojiang if (narray > 0 || nrec > 0)
678*22ce4affSfengbojiang luaH_resize(L, t, narray, nrec);
679*22ce4affSfengbojiang lua_unlock(L);
680*22ce4affSfengbojiang }
681*22ce4affSfengbojiang
682*22ce4affSfengbojiang
lua_getmetatable(lua_State * L,int objindex)683*22ce4affSfengbojiang LUA_API int lua_getmetatable (lua_State *L, int objindex) {
684*22ce4affSfengbojiang const TValue *obj;
685*22ce4affSfengbojiang Table *mt = NULL;
686*22ce4affSfengbojiang int res;
687*22ce4affSfengbojiang lua_lock(L);
688*22ce4affSfengbojiang obj = index2addr(L, objindex);
689*22ce4affSfengbojiang switch (ttypenv(obj)) {
690*22ce4affSfengbojiang case LUA_TTABLE:
691*22ce4affSfengbojiang mt = hvalue(obj)->metatable;
692*22ce4affSfengbojiang break;
693*22ce4affSfengbojiang case LUA_TUSERDATA:
694*22ce4affSfengbojiang mt = uvalue(obj)->metatable;
695*22ce4affSfengbojiang break;
696*22ce4affSfengbojiang default:
697*22ce4affSfengbojiang mt = G(L)->mt[ttypenv(obj)];
698*22ce4affSfengbojiang break;
699*22ce4affSfengbojiang }
700*22ce4affSfengbojiang if (mt == NULL)
701*22ce4affSfengbojiang res = 0;
702*22ce4affSfengbojiang else {
703*22ce4affSfengbojiang sethvalue(L, L->top, mt);
704*22ce4affSfengbojiang api_incr_top(L);
705*22ce4affSfengbojiang res = 1;
706*22ce4affSfengbojiang }
707*22ce4affSfengbojiang lua_unlock(L);
708*22ce4affSfengbojiang return res;
709*22ce4affSfengbojiang }
710*22ce4affSfengbojiang
711*22ce4affSfengbojiang
lua_getuservalue(lua_State * L,int idx)712*22ce4affSfengbojiang LUA_API void lua_getuservalue (lua_State *L, int idx) {
713*22ce4affSfengbojiang StkId o;
714*22ce4affSfengbojiang lua_lock(L);
715*22ce4affSfengbojiang o = index2addr(L, idx);
716*22ce4affSfengbojiang api_check(L, ttisuserdata(o), "userdata expected");
717*22ce4affSfengbojiang if (uvalue(o)->env) {
718*22ce4affSfengbojiang sethvalue(L, L->top, uvalue(o)->env);
719*22ce4affSfengbojiang } else
720*22ce4affSfengbojiang setnilvalue(L->top);
721*22ce4affSfengbojiang api_incr_top(L);
722*22ce4affSfengbojiang lua_unlock(L);
723*22ce4affSfengbojiang }
724*22ce4affSfengbojiang
725*22ce4affSfengbojiang
726*22ce4affSfengbojiang /*
727*22ce4affSfengbojiang ** set functions (stack -> Lua)
728*22ce4affSfengbojiang */
729*22ce4affSfengbojiang
730*22ce4affSfengbojiang
lua_setglobal(lua_State * L,const char * var)731*22ce4affSfengbojiang LUA_API void lua_setglobal (lua_State *L, const char *var) {
732*22ce4affSfengbojiang Table *reg = hvalue(&G(L)->l_registry);
733*22ce4affSfengbojiang const TValue *gt; /* global table */
734*22ce4affSfengbojiang lua_lock(L);
735*22ce4affSfengbojiang api_checknelems(L, 1);
736*22ce4affSfengbojiang gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
737*22ce4affSfengbojiang setsvalue2s(L, L->top++, luaS_new(L, var));
738*22ce4affSfengbojiang luaV_settable(L, gt, L->top - 1, L->top - 2);
739*22ce4affSfengbojiang L->top -= 2; /* pop value and key */
740*22ce4affSfengbojiang lua_unlock(L);
741*22ce4affSfengbojiang }
742*22ce4affSfengbojiang
743*22ce4affSfengbojiang
lua_settable(lua_State * L,int idx)744*22ce4affSfengbojiang LUA_API void lua_settable (lua_State *L, int idx) {
745*22ce4affSfengbojiang StkId t;
746*22ce4affSfengbojiang lua_lock(L);
747*22ce4affSfengbojiang api_checknelems(L, 2);
748*22ce4affSfengbojiang t = index2addr(L, idx);
749*22ce4affSfengbojiang luaV_settable(L, t, L->top - 2, L->top - 1);
750*22ce4affSfengbojiang L->top -= 2; /* pop index and value */
751*22ce4affSfengbojiang lua_unlock(L);
752*22ce4affSfengbojiang }
753*22ce4affSfengbojiang
754*22ce4affSfengbojiang
lua_setfield(lua_State * L,int idx,const char * k)755*22ce4affSfengbojiang LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
756*22ce4affSfengbojiang StkId t;
757*22ce4affSfengbojiang lua_lock(L);
758*22ce4affSfengbojiang api_checknelems(L, 1);
759*22ce4affSfengbojiang t = index2addr(L, idx);
760*22ce4affSfengbojiang setsvalue2s(L, L->top++, luaS_new(L, k));
761*22ce4affSfengbojiang luaV_settable(L, t, L->top - 1, L->top - 2);
762*22ce4affSfengbojiang L->top -= 2; /* pop value and key */
763*22ce4affSfengbojiang lua_unlock(L);
764*22ce4affSfengbojiang }
765*22ce4affSfengbojiang
766*22ce4affSfengbojiang
lua_rawset(lua_State * L,int idx)767*22ce4affSfengbojiang LUA_API void lua_rawset (lua_State *L, int idx) {
768*22ce4affSfengbojiang StkId t;
769*22ce4affSfengbojiang lua_lock(L);
770*22ce4affSfengbojiang api_checknelems(L, 2);
771*22ce4affSfengbojiang t = index2addr(L, idx);
772*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
773*22ce4affSfengbojiang setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
774*22ce4affSfengbojiang invalidateTMcache(hvalue(t));
775*22ce4affSfengbojiang luaC_barrierback(L, gcvalue(t), L->top-1);
776*22ce4affSfengbojiang L->top -= 2;
777*22ce4affSfengbojiang lua_unlock(L);
778*22ce4affSfengbojiang }
779*22ce4affSfengbojiang
780*22ce4affSfengbojiang
lua_rawseti(lua_State * L,int idx,int n)781*22ce4affSfengbojiang LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
782*22ce4affSfengbojiang StkId t;
783*22ce4affSfengbojiang lua_lock(L);
784*22ce4affSfengbojiang api_checknelems(L, 1);
785*22ce4affSfengbojiang t = index2addr(L, idx);
786*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
787*22ce4affSfengbojiang luaH_setint(L, hvalue(t), n, L->top - 1);
788*22ce4affSfengbojiang luaC_barrierback(L, gcvalue(t), L->top-1);
789*22ce4affSfengbojiang L->top--;
790*22ce4affSfengbojiang lua_unlock(L);
791*22ce4affSfengbojiang }
792*22ce4affSfengbojiang
793*22ce4affSfengbojiang
lua_rawsetp(lua_State * L,int idx,const void * p)794*22ce4affSfengbojiang LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
795*22ce4affSfengbojiang StkId t;
796*22ce4affSfengbojiang TValue k;
797*22ce4affSfengbojiang lua_lock(L);
798*22ce4affSfengbojiang api_checknelems(L, 1);
799*22ce4affSfengbojiang t = index2addr(L, idx);
800*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
801*22ce4affSfengbojiang setpvalue(&k, cast(void *, p));
802*22ce4affSfengbojiang setobj2t(L, luaH_set(L, hvalue(t), &k), L->top - 1);
803*22ce4affSfengbojiang luaC_barrierback(L, gcvalue(t), L->top - 1);
804*22ce4affSfengbojiang L->top--;
805*22ce4affSfengbojiang lua_unlock(L);
806*22ce4affSfengbojiang }
807*22ce4affSfengbojiang
808*22ce4affSfengbojiang
lua_setmetatable(lua_State * L,int objindex)809*22ce4affSfengbojiang LUA_API int lua_setmetatable (lua_State *L, int objindex) {
810*22ce4affSfengbojiang TValue *obj;
811*22ce4affSfengbojiang Table *mt;
812*22ce4affSfengbojiang lua_lock(L);
813*22ce4affSfengbojiang api_checknelems(L, 1);
814*22ce4affSfengbojiang obj = index2addr(L, objindex);
815*22ce4affSfengbojiang if (ttisnil(L->top - 1))
816*22ce4affSfengbojiang mt = NULL;
817*22ce4affSfengbojiang else {
818*22ce4affSfengbojiang api_check(L, ttistable(L->top - 1), "table expected");
819*22ce4affSfengbojiang mt = hvalue(L->top - 1);
820*22ce4affSfengbojiang }
821*22ce4affSfengbojiang switch (ttypenv(obj)) {
822*22ce4affSfengbojiang case LUA_TTABLE: {
823*22ce4affSfengbojiang hvalue(obj)->metatable = mt;
824*22ce4affSfengbojiang if (mt) {
825*22ce4affSfengbojiang luaC_objbarrierback(L, gcvalue(obj), mt);
826*22ce4affSfengbojiang luaC_checkfinalizer(L, gcvalue(obj), mt);
827*22ce4affSfengbojiang }
828*22ce4affSfengbojiang break;
829*22ce4affSfengbojiang }
830*22ce4affSfengbojiang case LUA_TUSERDATA: {
831*22ce4affSfengbojiang uvalue(obj)->metatable = mt;
832*22ce4affSfengbojiang if (mt) {
833*22ce4affSfengbojiang luaC_objbarrier(L, rawuvalue(obj), mt);
834*22ce4affSfengbojiang luaC_checkfinalizer(L, gcvalue(obj), mt);
835*22ce4affSfengbojiang }
836*22ce4affSfengbojiang break;
837*22ce4affSfengbojiang }
838*22ce4affSfengbojiang default: {
839*22ce4affSfengbojiang G(L)->mt[ttypenv(obj)] = mt;
840*22ce4affSfengbojiang break;
841*22ce4affSfengbojiang }
842*22ce4affSfengbojiang }
843*22ce4affSfengbojiang L->top--;
844*22ce4affSfengbojiang lua_unlock(L);
845*22ce4affSfengbojiang return 1;
846*22ce4affSfengbojiang }
847*22ce4affSfengbojiang
848*22ce4affSfengbojiang
lua_setuservalue(lua_State * L,int idx)849*22ce4affSfengbojiang LUA_API void lua_setuservalue (lua_State *L, int idx) {
850*22ce4affSfengbojiang StkId o;
851*22ce4affSfengbojiang lua_lock(L);
852*22ce4affSfengbojiang api_checknelems(L, 1);
853*22ce4affSfengbojiang o = index2addr(L, idx);
854*22ce4affSfengbojiang api_check(L, ttisuserdata(o), "userdata expected");
855*22ce4affSfengbojiang if (ttisnil(L->top - 1))
856*22ce4affSfengbojiang uvalue(o)->env = NULL;
857*22ce4affSfengbojiang else {
858*22ce4affSfengbojiang api_check(L, ttistable(L->top - 1), "table expected");
859*22ce4affSfengbojiang uvalue(o)->env = hvalue(L->top - 1);
860*22ce4affSfengbojiang luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
861*22ce4affSfengbojiang }
862*22ce4affSfengbojiang L->top--;
863*22ce4affSfengbojiang lua_unlock(L);
864*22ce4affSfengbojiang }
865*22ce4affSfengbojiang
866*22ce4affSfengbojiang
867*22ce4affSfengbojiang /*
868*22ce4affSfengbojiang ** `load' and `call' functions (run Lua code)
869*22ce4affSfengbojiang */
870*22ce4affSfengbojiang
871*22ce4affSfengbojiang
872*22ce4affSfengbojiang #define checkresults(L,na,nr) \
873*22ce4affSfengbojiang api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \
874*22ce4affSfengbojiang "results from function overflow current stack size")
875*22ce4affSfengbojiang
876*22ce4affSfengbojiang
lua_getctx(lua_State * L,int * ctx)877*22ce4affSfengbojiang LUA_API int lua_getctx (lua_State *L, int *ctx) {
878*22ce4affSfengbojiang if (L->ci->callstatus & CIST_YIELDED) {
879*22ce4affSfengbojiang if (ctx) *ctx = L->ci->u.c.ctx;
880*22ce4affSfengbojiang return L->ci->u.c.status;
881*22ce4affSfengbojiang }
882*22ce4affSfengbojiang else return LUA_OK;
883*22ce4affSfengbojiang }
884*22ce4affSfengbojiang
885*22ce4affSfengbojiang
lua_callk(lua_State * L,int nargs,int nresults,int ctx,lua_CFunction k)886*22ce4affSfengbojiang LUA_API void lua_callk (lua_State *L, int nargs, int nresults, int ctx,
887*22ce4affSfengbojiang lua_CFunction k) {
888*22ce4affSfengbojiang StkId func;
889*22ce4affSfengbojiang lua_lock(L);
890*22ce4affSfengbojiang api_check(L, k == NULL || !isLua(L->ci),
891*22ce4affSfengbojiang "cannot use continuations inside hooks");
892*22ce4affSfengbojiang api_checknelems(L, nargs+1);
893*22ce4affSfengbojiang api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
894*22ce4affSfengbojiang checkresults(L, nargs, nresults);
895*22ce4affSfengbojiang func = L->top - (nargs+1);
896*22ce4affSfengbojiang if (k != NULL && L->nny == 0) { /* need to prepare continuation? */
897*22ce4affSfengbojiang L->ci->u.c.k = k; /* save continuation */
898*22ce4affSfengbojiang L->ci->u.c.ctx = ctx; /* save context */
899*22ce4affSfengbojiang luaD_call(L, func, nresults, 1); /* do the call */
900*22ce4affSfengbojiang }
901*22ce4affSfengbojiang else /* no continuation or no yieldable */
902*22ce4affSfengbojiang luaD_call(L, func, nresults, 0); /* just do the call */
903*22ce4affSfengbojiang adjustresults(L, nresults);
904*22ce4affSfengbojiang lua_unlock(L);
905*22ce4affSfengbojiang }
906*22ce4affSfengbojiang
907*22ce4affSfengbojiang
908*22ce4affSfengbojiang
909*22ce4affSfengbojiang /*
910*22ce4affSfengbojiang ** Execute a protected call.
911*22ce4affSfengbojiang */
912*22ce4affSfengbojiang struct CallS { /* data to `f_call' */
913*22ce4affSfengbojiang StkId func;
914*22ce4affSfengbojiang int nresults;
915*22ce4affSfengbojiang };
916*22ce4affSfengbojiang
917*22ce4affSfengbojiang
f_call(lua_State * L,void * ud)918*22ce4affSfengbojiang static void f_call (lua_State *L, void *ud) {
919*22ce4affSfengbojiang struct CallS *c = cast(struct CallS *, ud);
920*22ce4affSfengbojiang luaD_call(L, c->func, c->nresults, 0);
921*22ce4affSfengbojiang }
922*22ce4affSfengbojiang
923*22ce4affSfengbojiang
924*22ce4affSfengbojiang
lua_pcallk(lua_State * L,int nargs,int nresults,int errfunc,int ctx,lua_CFunction k)925*22ce4affSfengbojiang LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,
926*22ce4affSfengbojiang int ctx, lua_CFunction k) {
927*22ce4affSfengbojiang struct CallS c;
928*22ce4affSfengbojiang int status;
929*22ce4affSfengbojiang ptrdiff_t func;
930*22ce4affSfengbojiang lua_lock(L);
931*22ce4affSfengbojiang api_check(L, k == NULL || !isLua(L->ci),
932*22ce4affSfengbojiang "cannot use continuations inside hooks");
933*22ce4affSfengbojiang api_checknelems(L, nargs+1);
934*22ce4affSfengbojiang api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
935*22ce4affSfengbojiang checkresults(L, nargs, nresults);
936*22ce4affSfengbojiang if (errfunc == 0)
937*22ce4affSfengbojiang func = 0;
938*22ce4affSfengbojiang else {
939*22ce4affSfengbojiang StkId o = index2addr(L, errfunc);
940*22ce4affSfengbojiang api_checkstackindex(L, errfunc, o);
941*22ce4affSfengbojiang func = savestack(L, o);
942*22ce4affSfengbojiang }
943*22ce4affSfengbojiang c.func = L->top - (nargs+1); /* function to be called */
944*22ce4affSfengbojiang if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */
945*22ce4affSfengbojiang c.nresults = nresults; /* do a 'conventional' protected call */
946*22ce4affSfengbojiang status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
947*22ce4affSfengbojiang }
948*22ce4affSfengbojiang else { /* prepare continuation (call is already protected by 'resume') */
949*22ce4affSfengbojiang CallInfo *ci = L->ci;
950*22ce4affSfengbojiang ci->u.c.k = k; /* save continuation */
951*22ce4affSfengbojiang ci->u.c.ctx = ctx; /* save context */
952*22ce4affSfengbojiang /* save information for error recovery */
953*22ce4affSfengbojiang ci->extra = savestack(L, c.func);
954*22ce4affSfengbojiang ci->u.c.old_allowhook = L->allowhook;
955*22ce4affSfengbojiang ci->u.c.old_errfunc = L->errfunc;
956*22ce4affSfengbojiang L->errfunc = func;
957*22ce4affSfengbojiang /* mark that function may do error recovery */
958*22ce4affSfengbojiang ci->callstatus |= CIST_YPCALL;
959*22ce4affSfengbojiang luaD_call(L, c.func, nresults, 1); /* do the call */
960*22ce4affSfengbojiang ci->callstatus &= ~CIST_YPCALL;
961*22ce4affSfengbojiang L->errfunc = ci->u.c.old_errfunc;
962*22ce4affSfengbojiang status = LUA_OK; /* if it is here, there were no errors */
963*22ce4affSfengbojiang }
964*22ce4affSfengbojiang adjustresults(L, nresults);
965*22ce4affSfengbojiang lua_unlock(L);
966*22ce4affSfengbojiang return status;
967*22ce4affSfengbojiang }
968*22ce4affSfengbojiang
969*22ce4affSfengbojiang
lua_load(lua_State * L,lua_Reader reader,void * data,const char * chunkname,const char * mode)970*22ce4affSfengbojiang LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
971*22ce4affSfengbojiang const char *chunkname, const char *mode) {
972*22ce4affSfengbojiang ZIO z;
973*22ce4affSfengbojiang int status;
974*22ce4affSfengbojiang lua_lock(L);
975*22ce4affSfengbojiang if (!chunkname) chunkname = "?";
976*22ce4affSfengbojiang luaZ_init(L, &z, reader, data);
977*22ce4affSfengbojiang status = luaD_protectedparser(L, &z, chunkname, mode);
978*22ce4affSfengbojiang if (status == LUA_OK) { /* no errors? */
979*22ce4affSfengbojiang LClosure *f = clLvalue(L->top - 1); /* get newly created function */
980*22ce4affSfengbojiang if (f->nupvalues == 1) { /* does it have one upvalue? */
981*22ce4affSfengbojiang /* get global table from registry */
982*22ce4affSfengbojiang Table *reg = hvalue(&G(L)->l_registry);
983*22ce4affSfengbojiang const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
984*22ce4affSfengbojiang /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
985*22ce4affSfengbojiang setobj(L, f->upvals[0]->v, gt);
986*22ce4affSfengbojiang luaC_barrier(L, f->upvals[0], gt);
987*22ce4affSfengbojiang }
988*22ce4affSfengbojiang }
989*22ce4affSfengbojiang lua_unlock(L);
990*22ce4affSfengbojiang return status;
991*22ce4affSfengbojiang }
992*22ce4affSfengbojiang
993*22ce4affSfengbojiang #if defined(LUA_USE_DUMP)
lua_dump(lua_State * L,lua_Writer writer,void * data)994*22ce4affSfengbojiang LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
995*22ce4affSfengbojiang int status;
996*22ce4affSfengbojiang TValue *o;
997*22ce4affSfengbojiang lua_lock(L);
998*22ce4affSfengbojiang api_checknelems(L, 1);
999*22ce4affSfengbojiang o = L->top - 1;
1000*22ce4affSfengbojiang if (isLfunction(o))
1001*22ce4affSfengbojiang status = luaU_dump(L, getproto(o), writer, data, 0);
1002*22ce4affSfengbojiang else
1003*22ce4affSfengbojiang status = 1;
1004*22ce4affSfengbojiang lua_unlock(L);
1005*22ce4affSfengbojiang return status;
1006*22ce4affSfengbojiang }
1007*22ce4affSfengbojiang #endif
1008*22ce4affSfengbojiang
lua_status(lua_State * L)1009*22ce4affSfengbojiang LUA_API int lua_status (lua_State *L) {
1010*22ce4affSfengbojiang return L->status;
1011*22ce4affSfengbojiang }
1012*22ce4affSfengbojiang
1013*22ce4affSfengbojiang
1014*22ce4affSfengbojiang /*
1015*22ce4affSfengbojiang ** Garbage-collection function
1016*22ce4affSfengbojiang */
1017*22ce4affSfengbojiang
lua_gc(lua_State * L,int what,int data)1018*22ce4affSfengbojiang LUA_API int lua_gc (lua_State *L, int what, int data) {
1019*22ce4affSfengbojiang int res = 0;
1020*22ce4affSfengbojiang global_State *g;
1021*22ce4affSfengbojiang lua_lock(L);
1022*22ce4affSfengbojiang g = G(L);
1023*22ce4affSfengbojiang switch (what) {
1024*22ce4affSfengbojiang case LUA_GCSTOP: {
1025*22ce4affSfengbojiang g->gcrunning = 0;
1026*22ce4affSfengbojiang break;
1027*22ce4affSfengbojiang }
1028*22ce4affSfengbojiang case LUA_GCRESTART: {
1029*22ce4affSfengbojiang luaE_setdebt(g, 0);
1030*22ce4affSfengbojiang g->gcrunning = 1;
1031*22ce4affSfengbojiang break;
1032*22ce4affSfengbojiang }
1033*22ce4affSfengbojiang case LUA_GCCOLLECT: {
1034*22ce4affSfengbojiang luaC_fullgc(L, 0);
1035*22ce4affSfengbojiang break;
1036*22ce4affSfengbojiang }
1037*22ce4affSfengbojiang case LUA_GCCOUNT: {
1038*22ce4affSfengbojiang /* GC values are expressed in Kbytes: #bytes/2^10 */
1039*22ce4affSfengbojiang res = cast_int(gettotalbytes(g) >> 10);
1040*22ce4affSfengbojiang break;
1041*22ce4affSfengbojiang }
1042*22ce4affSfengbojiang case LUA_GCCOUNTB: {
1043*22ce4affSfengbojiang res = cast_int(gettotalbytes(g) & 0x3ff);
1044*22ce4affSfengbojiang break;
1045*22ce4affSfengbojiang }
1046*22ce4affSfengbojiang case LUA_GCSTEP: {
1047*22ce4affSfengbojiang if (g->gckind == KGC_GEN) { /* generational mode? */
1048*22ce4affSfengbojiang res = (g->GCestimate == 0); /* true if it will do major collection */
1049*22ce4affSfengbojiang luaC_forcestep(L); /* do a single step */
1050*22ce4affSfengbojiang }
1051*22ce4affSfengbojiang else {
1052*22ce4affSfengbojiang lu_mem debt = cast(lu_mem, data) * 1024 - GCSTEPSIZE;
1053*22ce4affSfengbojiang if (g->gcrunning)
1054*22ce4affSfengbojiang debt += g->GCdebt; /* include current debt */
1055*22ce4affSfengbojiang luaE_setdebt(g, debt);
1056*22ce4affSfengbojiang luaC_forcestep(L);
1057*22ce4affSfengbojiang if (g->gcstate == GCSpause) /* end of cycle? */
1058*22ce4affSfengbojiang res = 1; /* signal it */
1059*22ce4affSfengbojiang }
1060*22ce4affSfengbojiang break;
1061*22ce4affSfengbojiang }
1062*22ce4affSfengbojiang case LUA_GCSETPAUSE: {
1063*22ce4affSfengbojiang res = g->gcpause;
1064*22ce4affSfengbojiang g->gcpause = data;
1065*22ce4affSfengbojiang break;
1066*22ce4affSfengbojiang }
1067*22ce4affSfengbojiang case LUA_GCSETMAJORINC: {
1068*22ce4affSfengbojiang res = g->gcmajorinc;
1069*22ce4affSfengbojiang g->gcmajorinc = data;
1070*22ce4affSfengbojiang break;
1071*22ce4affSfengbojiang }
1072*22ce4affSfengbojiang case LUA_GCSETSTEPMUL: {
1073*22ce4affSfengbojiang res = g->gcstepmul;
1074*22ce4affSfengbojiang g->gcstepmul = data;
1075*22ce4affSfengbojiang break;
1076*22ce4affSfengbojiang }
1077*22ce4affSfengbojiang case LUA_GCISRUNNING: {
1078*22ce4affSfengbojiang res = g->gcrunning;
1079*22ce4affSfengbojiang break;
1080*22ce4affSfengbojiang }
1081*22ce4affSfengbojiang case LUA_GCGEN: { /* change collector to generational mode */
1082*22ce4affSfengbojiang luaC_changemode(L, KGC_GEN);
1083*22ce4affSfengbojiang break;
1084*22ce4affSfengbojiang }
1085*22ce4affSfengbojiang case LUA_GCINC: { /* change collector to incremental mode */
1086*22ce4affSfengbojiang luaC_changemode(L, KGC_NORMAL);
1087*22ce4affSfengbojiang break;
1088*22ce4affSfengbojiang }
1089*22ce4affSfengbojiang default: res = -1; /* invalid option */
1090*22ce4affSfengbojiang }
1091*22ce4affSfengbojiang lua_unlock(L);
1092*22ce4affSfengbojiang return res;
1093*22ce4affSfengbojiang }
1094*22ce4affSfengbojiang
1095*22ce4affSfengbojiang
1096*22ce4affSfengbojiang
1097*22ce4affSfengbojiang /*
1098*22ce4affSfengbojiang ** miscellaneous functions
1099*22ce4affSfengbojiang */
1100*22ce4affSfengbojiang
1101*22ce4affSfengbojiang
lua_error(lua_State * L)1102*22ce4affSfengbojiang LUA_API int lua_error (lua_State *L) {
1103*22ce4affSfengbojiang lua_lock(L);
1104*22ce4affSfengbojiang api_checknelems(L, 1);
1105*22ce4affSfengbojiang luaG_errormsg(L);
1106*22ce4affSfengbojiang /* code unreachable; will unlock when control actually leaves the kernel */
1107*22ce4affSfengbojiang return 0; /* to avoid warnings */
1108*22ce4affSfengbojiang }
1109*22ce4affSfengbojiang
1110*22ce4affSfengbojiang
lua_next(lua_State * L,int idx)1111*22ce4affSfengbojiang LUA_API int lua_next (lua_State *L, int idx) {
1112*22ce4affSfengbojiang StkId t;
1113*22ce4affSfengbojiang int more;
1114*22ce4affSfengbojiang lua_lock(L);
1115*22ce4affSfengbojiang t = index2addr(L, idx);
1116*22ce4affSfengbojiang api_check(L, ttistable(t), "table expected");
1117*22ce4affSfengbojiang more = luaH_next(L, hvalue(t), L->top - 1);
1118*22ce4affSfengbojiang if (more) {
1119*22ce4affSfengbojiang api_incr_top(L);
1120*22ce4affSfengbojiang }
1121*22ce4affSfengbojiang else /* no more elements */
1122*22ce4affSfengbojiang L->top -= 1; /* remove key */
1123*22ce4affSfengbojiang lua_unlock(L);
1124*22ce4affSfengbojiang return more;
1125*22ce4affSfengbojiang }
1126*22ce4affSfengbojiang
1127*22ce4affSfengbojiang
lua_concat(lua_State * L,int n)1128*22ce4affSfengbojiang LUA_API void lua_concat (lua_State *L, int n) {
1129*22ce4affSfengbojiang lua_lock(L);
1130*22ce4affSfengbojiang api_checknelems(L, n);
1131*22ce4affSfengbojiang if (n >= 2) {
1132*22ce4affSfengbojiang luaC_checkGC(L);
1133*22ce4affSfengbojiang luaV_concat(L, n);
1134*22ce4affSfengbojiang }
1135*22ce4affSfengbojiang else if (n == 0) { /* push empty string */
1136*22ce4affSfengbojiang setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));
1137*22ce4affSfengbojiang api_incr_top(L);
1138*22ce4affSfengbojiang }
1139*22ce4affSfengbojiang /* else n == 1; nothing to do */
1140*22ce4affSfengbojiang lua_unlock(L);
1141*22ce4affSfengbojiang }
1142*22ce4affSfengbojiang
1143*22ce4affSfengbojiang
lua_len(lua_State * L,int idx)1144*22ce4affSfengbojiang LUA_API void lua_len (lua_State *L, int idx) {
1145*22ce4affSfengbojiang StkId t;
1146*22ce4affSfengbojiang lua_lock(L);
1147*22ce4affSfengbojiang t = index2addr(L, idx);
1148*22ce4affSfengbojiang luaV_objlen(L, L->top, t);
1149*22ce4affSfengbojiang api_incr_top(L);
1150*22ce4affSfengbojiang lua_unlock(L);
1151*22ce4affSfengbojiang }
1152*22ce4affSfengbojiang
1153*22ce4affSfengbojiang
lua_getallocf(lua_State * L,void ** ud)1154*22ce4affSfengbojiang LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
1155*22ce4affSfengbojiang lua_Alloc f;
1156*22ce4affSfengbojiang lua_lock(L);
1157*22ce4affSfengbojiang if (ud) *ud = G(L)->ud;
1158*22ce4affSfengbojiang f = G(L)->frealloc;
1159*22ce4affSfengbojiang lua_unlock(L);
1160*22ce4affSfengbojiang return f;
1161*22ce4affSfengbojiang }
1162*22ce4affSfengbojiang
1163*22ce4affSfengbojiang
lua_setallocf(lua_State * L,lua_Alloc f,void * ud)1164*22ce4affSfengbojiang LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
1165*22ce4affSfengbojiang lua_lock(L);
1166*22ce4affSfengbojiang G(L)->ud = ud;
1167*22ce4affSfengbojiang G(L)->frealloc = f;
1168*22ce4affSfengbojiang lua_unlock(L);
1169*22ce4affSfengbojiang }
1170*22ce4affSfengbojiang
1171*22ce4affSfengbojiang
lua_newuserdata(lua_State * L,size_t size)1172*22ce4affSfengbojiang LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
1173*22ce4affSfengbojiang Udata *u;
1174*22ce4affSfengbojiang lua_lock(L);
1175*22ce4affSfengbojiang luaC_checkGC(L);
1176*22ce4affSfengbojiang u = luaS_newudata(L, size, NULL);
1177*22ce4affSfengbojiang setuvalue(L, L->top, u);
1178*22ce4affSfengbojiang api_incr_top(L);
1179*22ce4affSfengbojiang lua_unlock(L);
1180*22ce4affSfengbojiang return u + 1;
1181*22ce4affSfengbojiang }
1182*22ce4affSfengbojiang
1183*22ce4affSfengbojiang
1184*22ce4affSfengbojiang
aux_upvalue(StkId fi,int n,TValue ** val,GCObject ** owner)1185*22ce4affSfengbojiang static const char *aux_upvalue (StkId fi, int n, TValue **val,
1186*22ce4affSfengbojiang GCObject **owner) {
1187*22ce4affSfengbojiang switch (ttype(fi)) {
1188*22ce4affSfengbojiang case LUA_TCCL: { /* C closure */
1189*22ce4affSfengbojiang CClosure *f = clCvalue(fi);
1190*22ce4affSfengbojiang if (!(1 <= n && n <= f->nupvalues)) return NULL;
1191*22ce4affSfengbojiang *val = &f->upvalue[n-1];
1192*22ce4affSfengbojiang if (owner) *owner = obj2gco(f);
1193*22ce4affSfengbojiang return "";
1194*22ce4affSfengbojiang }
1195*22ce4affSfengbojiang case LUA_TLCL: { /* Lua closure */
1196*22ce4affSfengbojiang LClosure *f = clLvalue(fi);
1197*22ce4affSfengbojiang TString *name;
1198*22ce4affSfengbojiang Proto *p = f->p;
1199*22ce4affSfengbojiang if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
1200*22ce4affSfengbojiang *val = f->upvals[n-1]->v;
1201*22ce4affSfengbojiang if (owner) *owner = obj2gco(f->upvals[n - 1]);
1202*22ce4affSfengbojiang name = p->upvalues[n-1].name;
1203*22ce4affSfengbojiang return (name == NULL) ? "" : getstr(name);
1204*22ce4affSfengbojiang }
1205*22ce4affSfengbojiang default: return NULL; /* not a closure */
1206*22ce4affSfengbojiang }
1207*22ce4affSfengbojiang }
1208*22ce4affSfengbojiang
1209*22ce4affSfengbojiang
lua_getupvalue(lua_State * L,int funcindex,int n)1210*22ce4affSfengbojiang LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
1211*22ce4affSfengbojiang const char *name;
1212*22ce4affSfengbojiang TValue *val = NULL; /* to avoid warnings */
1213*22ce4affSfengbojiang lua_lock(L);
1214*22ce4affSfengbojiang name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL);
1215*22ce4affSfengbojiang if (name) {
1216*22ce4affSfengbojiang setobj2s(L, L->top, val);
1217*22ce4affSfengbojiang api_incr_top(L);
1218*22ce4affSfengbojiang }
1219*22ce4affSfengbojiang lua_unlock(L);
1220*22ce4affSfengbojiang return name;
1221*22ce4affSfengbojiang }
1222*22ce4affSfengbojiang
1223*22ce4affSfengbojiang
lua_setupvalue(lua_State * L,int funcindex,int n)1224*22ce4affSfengbojiang LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
1225*22ce4affSfengbojiang const char *name;
1226*22ce4affSfengbojiang TValue *val = NULL; /* to avoid warnings */
1227*22ce4affSfengbojiang GCObject *owner = NULL; /* to avoid warnings */
1228*22ce4affSfengbojiang StkId fi;
1229*22ce4affSfengbojiang lua_lock(L);
1230*22ce4affSfengbojiang fi = index2addr(L, funcindex);
1231*22ce4affSfengbojiang api_checknelems(L, 1);
1232*22ce4affSfengbojiang name = aux_upvalue(fi, n, &val, &owner);
1233*22ce4affSfengbojiang if (name) {
1234*22ce4affSfengbojiang L->top--;
1235*22ce4affSfengbojiang setobj(L, val, L->top);
1236*22ce4affSfengbojiang luaC_barrier(L, owner, L->top);
1237*22ce4affSfengbojiang }
1238*22ce4affSfengbojiang lua_unlock(L);
1239*22ce4affSfengbojiang return name;
1240*22ce4affSfengbojiang }
1241*22ce4affSfengbojiang
1242*22ce4affSfengbojiang
getupvalref(lua_State * L,int fidx,int n,LClosure ** pf)1243*22ce4affSfengbojiang static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {
1244*22ce4affSfengbojiang LClosure *f;
1245*22ce4affSfengbojiang StkId fi = index2addr(L, fidx);
1246*22ce4affSfengbojiang api_check(L, ttisLclosure(fi), "Lua function expected");
1247*22ce4affSfengbojiang f = clLvalue(fi);
1248*22ce4affSfengbojiang api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index");
1249*22ce4affSfengbojiang if (pf) *pf = f;
1250*22ce4affSfengbojiang return &f->upvals[n - 1]; /* get its upvalue pointer */
1251*22ce4affSfengbojiang }
1252*22ce4affSfengbojiang
1253*22ce4affSfengbojiang
lua_upvalueid(lua_State * L,int fidx,int n)1254*22ce4affSfengbojiang LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {
1255*22ce4affSfengbojiang StkId fi = index2addr(L, fidx);
1256*22ce4affSfengbojiang switch (ttype(fi)) {
1257*22ce4affSfengbojiang case LUA_TLCL: { /* lua closure */
1258*22ce4affSfengbojiang return *getupvalref(L, fidx, n, NULL);
1259*22ce4affSfengbojiang }
1260*22ce4affSfengbojiang case LUA_TCCL: { /* C closure */
1261*22ce4affSfengbojiang CClosure *f = clCvalue(fi);
1262*22ce4affSfengbojiang api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index");
1263*22ce4affSfengbojiang return &f->upvalue[n - 1];
1264*22ce4affSfengbojiang }
1265*22ce4affSfengbojiang default: {
1266*22ce4affSfengbojiang api_check(L, 0, "closure expected");
1267*22ce4affSfengbojiang return NULL;
1268*22ce4affSfengbojiang }
1269*22ce4affSfengbojiang }
1270*22ce4affSfengbojiang }
1271*22ce4affSfengbojiang
1272*22ce4affSfengbojiang
lua_upvaluejoin(lua_State * L,int fidx1,int n1,int fidx2,int n2)1273*22ce4affSfengbojiang LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,
1274*22ce4affSfengbojiang int fidx2, int n2) {
1275*22ce4affSfengbojiang LClosure *f1;
1276*22ce4affSfengbojiang UpVal **up1 = getupvalref(L, fidx1, n1, &f1);
1277*22ce4affSfengbojiang UpVal **up2 = getupvalref(L, fidx2, n2, NULL);
1278*22ce4affSfengbojiang *up1 = *up2;
1279*22ce4affSfengbojiang luaC_objbarrier(L, f1, *up2);
1280*22ce4affSfengbojiang }
1281*22ce4affSfengbojiang
1282*22ce4affSfengbojiang #if defined(_KERNEL)
1283*22ce4affSfengbojiang
1284*22ce4affSfengbojiang static int __init
lua_init(void)1285*22ce4affSfengbojiang lua_init(void)
1286*22ce4affSfengbojiang {
1287*22ce4affSfengbojiang return (0);
1288*22ce4affSfengbojiang }
1289*22ce4affSfengbojiang
1290*22ce4affSfengbojiang static void __exit
lua_fini(void)1291*22ce4affSfengbojiang lua_fini(void)
1292*22ce4affSfengbojiang {
1293*22ce4affSfengbojiang }
1294*22ce4affSfengbojiang
1295*22ce4affSfengbojiang module_init(lua_init);
1296*22ce4affSfengbojiang module_exit(lua_fini);
1297*22ce4affSfengbojiang
1298*22ce4affSfengbojiang #endif
1299*22ce4affSfengbojiang /* END CSTYLED */
1300*22ce4affSfengbojiang
1301*22ce4affSfengbojiang ZFS_MODULE_DESCRIPTION("Lua Interpreter for ZFS");
1302*22ce4affSfengbojiang ZFS_MODULE_AUTHOR("Lua.org");
1303*22ce4affSfengbojiang ZFS_MODULE_LICENSE("Dual MIT/GPL");
1304*22ce4affSfengbojiang ZFS_MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
1305*22ce4affSfengbojiang
1306*22ce4affSfengbojiang EXPORT_SYMBOL(lua_absindex);
1307*22ce4affSfengbojiang EXPORT_SYMBOL(lua_atpanic);
1308*22ce4affSfengbojiang EXPORT_SYMBOL(lua_checkstack);
1309*22ce4affSfengbojiang EXPORT_SYMBOL(lua_close);
1310*22ce4affSfengbojiang EXPORT_SYMBOL(lua_createtable);
1311*22ce4affSfengbojiang EXPORT_SYMBOL(lua_error);
1312*22ce4affSfengbojiang EXPORT_SYMBOL(lua_getfield);
1313*22ce4affSfengbojiang EXPORT_SYMBOL(lua_gettable);
1314*22ce4affSfengbojiang EXPORT_SYMBOL(lua_gettop);
1315*22ce4affSfengbojiang EXPORT_SYMBOL(lua_isnumber);
1316*22ce4affSfengbojiang EXPORT_SYMBOL(lua_isstring);
1317*22ce4affSfengbojiang EXPORT_SYMBOL(lua_newstate);
1318*22ce4affSfengbojiang EXPORT_SYMBOL(lua_newuserdata);
1319*22ce4affSfengbojiang EXPORT_SYMBOL(lua_next);
1320*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pcallk);
1321*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushboolean);
1322*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushcclosure);
1323*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushfstring);
1324*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushinteger);
1325*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushlightuserdata);
1326*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushnil);
1327*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushnumber);
1328*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushstring);
1329*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushvalue);
1330*22ce4affSfengbojiang EXPORT_SYMBOL(lua_pushvfstring);
1331*22ce4affSfengbojiang EXPORT_SYMBOL(lua_remove);
1332*22ce4affSfengbojiang EXPORT_SYMBOL(lua_replace);
1333*22ce4affSfengbojiang EXPORT_SYMBOL(lua_setfield);
1334*22ce4affSfengbojiang EXPORT_SYMBOL(lua_setglobal);
1335*22ce4affSfengbojiang EXPORT_SYMBOL(lua_sethook);
1336*22ce4affSfengbojiang EXPORT_SYMBOL(lua_setmetatable);
1337*22ce4affSfengbojiang EXPORT_SYMBOL(lua_settable);
1338*22ce4affSfengbojiang EXPORT_SYMBOL(lua_settop);
1339*22ce4affSfengbojiang EXPORT_SYMBOL(lua_toboolean);
1340*22ce4affSfengbojiang EXPORT_SYMBOL(lua_tointegerx);
1341*22ce4affSfengbojiang EXPORT_SYMBOL(lua_tolstring);
1342*22ce4affSfengbojiang EXPORT_SYMBOL(lua_tonumberx);
1343*22ce4affSfengbojiang EXPORT_SYMBOL(lua_touserdata);
1344*22ce4affSfengbojiang EXPORT_SYMBOL(lua_type);
1345*22ce4affSfengbojiang EXPORT_SYMBOL(lua_typename);
1346