1*572c4311Sfengbojiang /*
2*572c4311Sfengbojiang ** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $
3*572c4311Sfengbojiang ** Lua API
4*572c4311Sfengbojiang ** See Copyright Notice in lua.h
5*572c4311Sfengbojiang */
6*572c4311Sfengbojiang
7*572c4311Sfengbojiang
8*572c4311Sfengbojiang #include <assert.h>
9*572c4311Sfengbojiang #include <math.h>
10*572c4311Sfengbojiang #include <stdarg.h>
11*572c4311Sfengbojiang #include <string.h>
12*572c4311Sfengbojiang
13*572c4311Sfengbojiang #define lapi_c
14*572c4311Sfengbojiang #define LUA_CORE
15*572c4311Sfengbojiang
16*572c4311Sfengbojiang #include "lua.h"
17*572c4311Sfengbojiang
18*572c4311Sfengbojiang #include "lapi.h"
19*572c4311Sfengbojiang #include "ldebug.h"
20*572c4311Sfengbojiang #include "ldo.h"
21*572c4311Sfengbojiang #include "lfunc.h"
22*572c4311Sfengbojiang #include "lgc.h"
23*572c4311Sfengbojiang #include "lmem.h"
24*572c4311Sfengbojiang #include "lobject.h"
25*572c4311Sfengbojiang #include "lstate.h"
26*572c4311Sfengbojiang #include "lstring.h"
27*572c4311Sfengbojiang #include "ltable.h"
28*572c4311Sfengbojiang #include "ltm.h"
29*572c4311Sfengbojiang #include "lundump.h"
30*572c4311Sfengbojiang #include "lvm.h"
31*572c4311Sfengbojiang
32*572c4311Sfengbojiang
33*572c4311Sfengbojiang
34*572c4311Sfengbojiang const char lua_ident[] =
35*572c4311Sfengbojiang "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n"
36*572c4311Sfengbojiang "$Authors: " LUA_AUTHORS " $\n"
37*572c4311Sfengbojiang "$URL: www.lua.org $\n";
38*572c4311Sfengbojiang
39*572c4311Sfengbojiang
40*572c4311Sfengbojiang
41*572c4311Sfengbojiang #define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base))
42*572c4311Sfengbojiang
43*572c4311Sfengbojiang #define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject)
44*572c4311Sfengbojiang
45*572c4311Sfengbojiang #define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;}
46*572c4311Sfengbojiang
47*572c4311Sfengbojiang
48*572c4311Sfengbojiang
index2adr(lua_State * L,int idx)49*572c4311Sfengbojiang static TValue *index2adr (lua_State *L, int idx) {
50*572c4311Sfengbojiang if (idx > 0) {
51*572c4311Sfengbojiang TValue *o = L->base + (idx - 1);
52*572c4311Sfengbojiang api_check(L, idx <= L->ci->top - L->base);
53*572c4311Sfengbojiang if (o >= L->top) return cast(TValue *, luaO_nilobject);
54*572c4311Sfengbojiang else return o;
55*572c4311Sfengbojiang }
56*572c4311Sfengbojiang else if (idx > LUA_REGISTRYINDEX) {
57*572c4311Sfengbojiang api_check(L, idx != 0 && -idx <= L->top - L->base);
58*572c4311Sfengbojiang return L->top + idx;
59*572c4311Sfengbojiang }
60*572c4311Sfengbojiang else switch (idx) { /* pseudo-indices */
61*572c4311Sfengbojiang case LUA_REGISTRYINDEX: return registry(L);
62*572c4311Sfengbojiang case LUA_ENVIRONINDEX: {
63*572c4311Sfengbojiang Closure *func = curr_func(L);
64*572c4311Sfengbojiang sethvalue(L, &L->env, func->c.env);
65*572c4311Sfengbojiang return &L->env;
66*572c4311Sfengbojiang }
67*572c4311Sfengbojiang case LUA_GLOBALSINDEX: return gt(L);
68*572c4311Sfengbojiang default: {
69*572c4311Sfengbojiang Closure *func = curr_func(L);
70*572c4311Sfengbojiang idx = LUA_GLOBALSINDEX - idx;
71*572c4311Sfengbojiang return (idx <= func->c.nupvalues)
72*572c4311Sfengbojiang ? &func->c.upvalue[idx-1]
73*572c4311Sfengbojiang : cast(TValue *, luaO_nilobject);
74*572c4311Sfengbojiang }
75*572c4311Sfengbojiang }
76*572c4311Sfengbojiang }
77*572c4311Sfengbojiang
78*572c4311Sfengbojiang
getcurrenv(lua_State * L)79*572c4311Sfengbojiang static Table *getcurrenv (lua_State *L) {
80*572c4311Sfengbojiang if (L->ci == L->base_ci) /* no enclosing function? */
81*572c4311Sfengbojiang return hvalue(gt(L)); /* use global table as environment */
82*572c4311Sfengbojiang else {
83*572c4311Sfengbojiang Closure *func = curr_func(L);
84*572c4311Sfengbojiang return func->c.env;
85*572c4311Sfengbojiang }
86*572c4311Sfengbojiang }
87*572c4311Sfengbojiang
88*572c4311Sfengbojiang
luaA_pushobject(lua_State * L,const TValue * o)89*572c4311Sfengbojiang void luaA_pushobject (lua_State *L, const TValue *o) {
90*572c4311Sfengbojiang setobj2s(L, L->top, o);
91*572c4311Sfengbojiang api_incr_top(L);
92*572c4311Sfengbojiang }
93*572c4311Sfengbojiang
94*572c4311Sfengbojiang
lua_checkstack(lua_State * L,int size)95*572c4311Sfengbojiang LUA_API int lua_checkstack (lua_State *L, int size) {
96*572c4311Sfengbojiang int res = 1;
97*572c4311Sfengbojiang lua_lock(L);
98*572c4311Sfengbojiang if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)
99*572c4311Sfengbojiang res = 0; /* stack overflow */
100*572c4311Sfengbojiang else if (size > 0) {
101*572c4311Sfengbojiang luaD_checkstack(L, size);
102*572c4311Sfengbojiang if (L->ci->top < L->top + size)
103*572c4311Sfengbojiang L->ci->top = L->top + size;
104*572c4311Sfengbojiang }
105*572c4311Sfengbojiang lua_unlock(L);
106*572c4311Sfengbojiang return res;
107*572c4311Sfengbojiang }
108*572c4311Sfengbojiang
109*572c4311Sfengbojiang
lua_xmove(lua_State * from,lua_State * to,int n)110*572c4311Sfengbojiang LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
111*572c4311Sfengbojiang int i;
112*572c4311Sfengbojiang if (from == to) return;
113*572c4311Sfengbojiang lua_lock(to);
114*572c4311Sfengbojiang api_checknelems(from, n);
115*572c4311Sfengbojiang api_check(from, G(from) == G(to));
116*572c4311Sfengbojiang api_check(from, to->ci->top - to->top >= n);
117*572c4311Sfengbojiang from->top -= n;
118*572c4311Sfengbojiang for (i = 0; i < n; i++) {
119*572c4311Sfengbojiang setobj2s(to, to->top++, from->top + i);
120*572c4311Sfengbojiang }
121*572c4311Sfengbojiang lua_unlock(to);
122*572c4311Sfengbojiang }
123*572c4311Sfengbojiang
124*572c4311Sfengbojiang
lua_setlevel(lua_State * from,lua_State * to)125*572c4311Sfengbojiang LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
126*572c4311Sfengbojiang to->nCcalls = from->nCcalls;
127*572c4311Sfengbojiang }
128*572c4311Sfengbojiang
129*572c4311Sfengbojiang
lua_atpanic(lua_State * L,lua_CFunction panicf)130*572c4311Sfengbojiang LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
131*572c4311Sfengbojiang lua_CFunction old;
132*572c4311Sfengbojiang lua_lock(L);
133*572c4311Sfengbojiang old = G(L)->panic;
134*572c4311Sfengbojiang G(L)->panic = panicf;
135*572c4311Sfengbojiang lua_unlock(L);
136*572c4311Sfengbojiang return old;
137*572c4311Sfengbojiang }
138*572c4311Sfengbojiang
139*572c4311Sfengbojiang
lua_newthread(lua_State * L)140*572c4311Sfengbojiang LUA_API lua_State *lua_newthread (lua_State *L) {
141*572c4311Sfengbojiang lua_State *L1;
142*572c4311Sfengbojiang lua_lock(L);
143*572c4311Sfengbojiang luaC_checkGC(L);
144*572c4311Sfengbojiang L1 = luaE_newthread(L);
145*572c4311Sfengbojiang setthvalue(L, L->top, L1);
146*572c4311Sfengbojiang api_incr_top(L);
147*572c4311Sfengbojiang lua_unlock(L);
148*572c4311Sfengbojiang luai_userstatethread(L, L1);
149*572c4311Sfengbojiang return L1;
150*572c4311Sfengbojiang }
151*572c4311Sfengbojiang
152*572c4311Sfengbojiang
153*572c4311Sfengbojiang
154*572c4311Sfengbojiang /*
155*572c4311Sfengbojiang ** basic stack manipulation
156*572c4311Sfengbojiang */
157*572c4311Sfengbojiang
158*572c4311Sfengbojiang
lua_gettop(lua_State * L)159*572c4311Sfengbojiang LUA_API int lua_gettop (lua_State *L) {
160*572c4311Sfengbojiang return cast_int(L->top - L->base);
161*572c4311Sfengbojiang }
162*572c4311Sfengbojiang
163*572c4311Sfengbojiang
lua_settop(lua_State * L,int idx)164*572c4311Sfengbojiang LUA_API void lua_settop (lua_State *L, int idx) {
165*572c4311Sfengbojiang lua_lock(L);
166*572c4311Sfengbojiang if (idx >= 0) {
167*572c4311Sfengbojiang api_check(L, idx <= L->stack_last - L->base);
168*572c4311Sfengbojiang while (L->top < L->base + idx)
169*572c4311Sfengbojiang setnilvalue(L->top++);
170*572c4311Sfengbojiang L->top = L->base + idx;
171*572c4311Sfengbojiang }
172*572c4311Sfengbojiang else {
173*572c4311Sfengbojiang api_check(L, -(idx+1) <= (L->top - L->base));
174*572c4311Sfengbojiang L->top += idx+1; /* `subtract' index (index is negative) */
175*572c4311Sfengbojiang }
176*572c4311Sfengbojiang lua_unlock(L);
177*572c4311Sfengbojiang }
178*572c4311Sfengbojiang
179*572c4311Sfengbojiang
lua_remove(lua_State * L,int idx)180*572c4311Sfengbojiang LUA_API void lua_remove (lua_State *L, int idx) {
181*572c4311Sfengbojiang StkId p;
182*572c4311Sfengbojiang lua_lock(L);
183*572c4311Sfengbojiang p = index2adr(L, idx);
184*572c4311Sfengbojiang api_checkvalidindex(L, p);
185*572c4311Sfengbojiang while (++p < L->top) setobjs2s(L, p-1, p);
186*572c4311Sfengbojiang L->top--;
187*572c4311Sfengbojiang lua_unlock(L);
188*572c4311Sfengbojiang }
189*572c4311Sfengbojiang
190*572c4311Sfengbojiang
lua_insert(lua_State * L,int idx)191*572c4311Sfengbojiang LUA_API void lua_insert (lua_State *L, int idx) {
192*572c4311Sfengbojiang StkId p;
193*572c4311Sfengbojiang StkId q;
194*572c4311Sfengbojiang lua_lock(L);
195*572c4311Sfengbojiang p = index2adr(L, idx);
196*572c4311Sfengbojiang api_checkvalidindex(L, p);
197*572c4311Sfengbojiang for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);
198*572c4311Sfengbojiang setobjs2s(L, p, L->top);
199*572c4311Sfengbojiang lua_unlock(L);
200*572c4311Sfengbojiang }
201*572c4311Sfengbojiang
202*572c4311Sfengbojiang
lua_replace(lua_State * L,int idx)203*572c4311Sfengbojiang LUA_API void lua_replace (lua_State *L, int idx) {
204*572c4311Sfengbojiang StkId o;
205*572c4311Sfengbojiang lua_lock(L);
206*572c4311Sfengbojiang /* explicit test for incompatible code */
207*572c4311Sfengbojiang if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci)
208*572c4311Sfengbojiang luaG_runerror(L, "no calling environment");
209*572c4311Sfengbojiang api_checknelems(L, 1);
210*572c4311Sfengbojiang o = index2adr(L, idx);
211*572c4311Sfengbojiang api_checkvalidindex(L, o);
212*572c4311Sfengbojiang if (idx == LUA_ENVIRONINDEX) {
213*572c4311Sfengbojiang Closure *func = curr_func(L);
214*572c4311Sfengbojiang api_check(L, ttistable(L->top - 1));
215*572c4311Sfengbojiang func->c.env = hvalue(L->top - 1);
216*572c4311Sfengbojiang luaC_barrier(L, func, L->top - 1);
217*572c4311Sfengbojiang }
218*572c4311Sfengbojiang else {
219*572c4311Sfengbojiang setobj(L, o, L->top - 1);
220*572c4311Sfengbojiang if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
221*572c4311Sfengbojiang luaC_barrier(L, curr_func(L), L->top - 1);
222*572c4311Sfengbojiang }
223*572c4311Sfengbojiang L->top--;
224*572c4311Sfengbojiang lua_unlock(L);
225*572c4311Sfengbojiang }
226*572c4311Sfengbojiang
227*572c4311Sfengbojiang
lua_pushvalue(lua_State * L,int idx)228*572c4311Sfengbojiang LUA_API void lua_pushvalue (lua_State *L, int idx) {
229*572c4311Sfengbojiang lua_lock(L);
230*572c4311Sfengbojiang setobj2s(L, L->top, index2adr(L, idx));
231*572c4311Sfengbojiang api_incr_top(L);
232*572c4311Sfengbojiang lua_unlock(L);
233*572c4311Sfengbojiang }
234*572c4311Sfengbojiang
235*572c4311Sfengbojiang
236*572c4311Sfengbojiang
237*572c4311Sfengbojiang /*
238*572c4311Sfengbojiang ** access functions (stack -> C)
239*572c4311Sfengbojiang */
240*572c4311Sfengbojiang
241*572c4311Sfengbojiang
lua_type(lua_State * L,int idx)242*572c4311Sfengbojiang LUA_API int lua_type (lua_State *L, int idx) {
243*572c4311Sfengbojiang StkId o = index2adr(L, idx);
244*572c4311Sfengbojiang return (o == luaO_nilobject) ? LUA_TNONE : ttype(o);
245*572c4311Sfengbojiang }
246*572c4311Sfengbojiang
247*572c4311Sfengbojiang
lua_typename(lua_State * L,int t)248*572c4311Sfengbojiang LUA_API const char *lua_typename (lua_State *L, int t) {
249*572c4311Sfengbojiang UNUSED(L);
250*572c4311Sfengbojiang return (t == LUA_TNONE) ? "no value" : luaT_typenames[t];
251*572c4311Sfengbojiang }
252*572c4311Sfengbojiang
253*572c4311Sfengbojiang
lua_iscfunction(lua_State * L,int idx)254*572c4311Sfengbojiang LUA_API int lua_iscfunction (lua_State *L, int idx) {
255*572c4311Sfengbojiang StkId o = index2adr(L, idx);
256*572c4311Sfengbojiang return iscfunction(o);
257*572c4311Sfengbojiang }
258*572c4311Sfengbojiang
259*572c4311Sfengbojiang
lua_isnumber(lua_State * L,int idx)260*572c4311Sfengbojiang LUA_API int lua_isnumber (lua_State *L, int idx) {
261*572c4311Sfengbojiang TValue n;
262*572c4311Sfengbojiang const TValue *o = index2adr(L, idx);
263*572c4311Sfengbojiang return tonumber(o, &n);
264*572c4311Sfengbojiang }
265*572c4311Sfengbojiang
266*572c4311Sfengbojiang
lua_isstring(lua_State * L,int idx)267*572c4311Sfengbojiang LUA_API int lua_isstring (lua_State *L, int idx) {
268*572c4311Sfengbojiang int t = lua_type(L, idx);
269*572c4311Sfengbojiang return (t == LUA_TSTRING || t == LUA_TNUMBER);
270*572c4311Sfengbojiang }
271*572c4311Sfengbojiang
272*572c4311Sfengbojiang
lua_isuserdata(lua_State * L,int idx)273*572c4311Sfengbojiang LUA_API int lua_isuserdata (lua_State *L, int idx) {
274*572c4311Sfengbojiang const TValue *o = index2adr(L, idx);
275*572c4311Sfengbojiang return (ttisuserdata(o) || ttislightuserdata(o));
276*572c4311Sfengbojiang }
277*572c4311Sfengbojiang
278*572c4311Sfengbojiang
lua_rawequal(lua_State * L,int index1,int index2)279*572c4311Sfengbojiang LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
280*572c4311Sfengbojiang StkId o1 = index2adr(L, index1);
281*572c4311Sfengbojiang StkId o2 = index2adr(L, index2);
282*572c4311Sfengbojiang return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0
283*572c4311Sfengbojiang : luaO_rawequalObj(o1, o2);
284*572c4311Sfengbojiang }
285*572c4311Sfengbojiang
286*572c4311Sfengbojiang
lua_equal(lua_State * L,int index1,int index2)287*572c4311Sfengbojiang LUA_API int lua_equal (lua_State *L, int index1, int index2) {
288*572c4311Sfengbojiang StkId o1, o2;
289*572c4311Sfengbojiang int i;
290*572c4311Sfengbojiang lua_lock(L); /* may call tag method */
291*572c4311Sfengbojiang o1 = index2adr(L, index1);
292*572c4311Sfengbojiang o2 = index2adr(L, index2);
293*572c4311Sfengbojiang i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2);
294*572c4311Sfengbojiang lua_unlock(L);
295*572c4311Sfengbojiang return i;
296*572c4311Sfengbojiang }
297*572c4311Sfengbojiang
298*572c4311Sfengbojiang
lua_lessthan(lua_State * L,int index1,int index2)299*572c4311Sfengbojiang LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {
300*572c4311Sfengbojiang StkId o1, o2;
301*572c4311Sfengbojiang int i;
302*572c4311Sfengbojiang lua_lock(L); /* may call tag method */
303*572c4311Sfengbojiang o1 = index2adr(L, index1);
304*572c4311Sfengbojiang o2 = index2adr(L, index2);
305*572c4311Sfengbojiang i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0
306*572c4311Sfengbojiang : luaV_lessthan(L, o1, o2);
307*572c4311Sfengbojiang lua_unlock(L);
308*572c4311Sfengbojiang return i;
309*572c4311Sfengbojiang }
310*572c4311Sfengbojiang
311*572c4311Sfengbojiang
312*572c4311Sfengbojiang
lua_tonumber(lua_State * L,int idx)313*572c4311Sfengbojiang LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {
314*572c4311Sfengbojiang TValue n;
315*572c4311Sfengbojiang const TValue *o = index2adr(L, idx);
316*572c4311Sfengbojiang if (tonumber(o, &n))
317*572c4311Sfengbojiang return nvalue(o);
318*572c4311Sfengbojiang else
319*572c4311Sfengbojiang return 0;
320*572c4311Sfengbojiang }
321*572c4311Sfengbojiang
322*572c4311Sfengbojiang
lua_tointeger(lua_State * L,int idx)323*572c4311Sfengbojiang LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {
324*572c4311Sfengbojiang TValue n;
325*572c4311Sfengbojiang const TValue *o = index2adr(L, idx);
326*572c4311Sfengbojiang if (tonumber(o, &n)) {
327*572c4311Sfengbojiang lua_Integer res;
328*572c4311Sfengbojiang lua_Number num = nvalue(o);
329*572c4311Sfengbojiang lua_number2integer(res, num);
330*572c4311Sfengbojiang return res;
331*572c4311Sfengbojiang }
332*572c4311Sfengbojiang else
333*572c4311Sfengbojiang return 0;
334*572c4311Sfengbojiang }
335*572c4311Sfengbojiang
336*572c4311Sfengbojiang
lua_toboolean(lua_State * L,int idx)337*572c4311Sfengbojiang LUA_API int lua_toboolean (lua_State *L, int idx) {
338*572c4311Sfengbojiang const TValue *o = index2adr(L, idx);
339*572c4311Sfengbojiang return !l_isfalse(o);
340*572c4311Sfengbojiang }
341*572c4311Sfengbojiang
342*572c4311Sfengbojiang
lua_tolstring(lua_State * L,int idx,size_t * len)343*572c4311Sfengbojiang LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
344*572c4311Sfengbojiang StkId o = index2adr(L, idx);
345*572c4311Sfengbojiang if (!ttisstring(o)) {
346*572c4311Sfengbojiang lua_lock(L); /* `luaV_tostring' may create a new string */
347*572c4311Sfengbojiang if (!luaV_tostring(L, o)) { /* conversion failed? */
348*572c4311Sfengbojiang if (len != NULL) *len = 0;
349*572c4311Sfengbojiang lua_unlock(L);
350*572c4311Sfengbojiang return NULL;
351*572c4311Sfengbojiang }
352*572c4311Sfengbojiang luaC_checkGC(L);
353*572c4311Sfengbojiang o = index2adr(L, idx); /* previous call may reallocate the stack */
354*572c4311Sfengbojiang lua_unlock(L);
355*572c4311Sfengbojiang }
356*572c4311Sfengbojiang if (len != NULL) *len = tsvalue(o)->len;
357*572c4311Sfengbojiang return svalue(o);
358*572c4311Sfengbojiang }
359*572c4311Sfengbojiang
360*572c4311Sfengbojiang
lua_objlen(lua_State * L,int idx)361*572c4311Sfengbojiang LUA_API size_t lua_objlen (lua_State *L, int idx) {
362*572c4311Sfengbojiang StkId o = index2adr(L, idx);
363*572c4311Sfengbojiang switch (ttype(o)) {
364*572c4311Sfengbojiang case LUA_TSTRING: return tsvalue(o)->len;
365*572c4311Sfengbojiang case LUA_TUSERDATA: return uvalue(o)->len;
366*572c4311Sfengbojiang case LUA_TTABLE: return luaH_getn(hvalue(o));
367*572c4311Sfengbojiang case LUA_TNUMBER: {
368*572c4311Sfengbojiang size_t l;
369*572c4311Sfengbojiang lua_lock(L); /* `luaV_tostring' may create a new string */
370*572c4311Sfengbojiang l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0);
371*572c4311Sfengbojiang lua_unlock(L);
372*572c4311Sfengbojiang return l;
373*572c4311Sfengbojiang }
374*572c4311Sfengbojiang default: return 0;
375*572c4311Sfengbojiang }
376*572c4311Sfengbojiang }
377*572c4311Sfengbojiang
378*572c4311Sfengbojiang
lua_tocfunction(lua_State * L,int idx)379*572c4311Sfengbojiang LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
380*572c4311Sfengbojiang StkId o = index2adr(L, idx);
381*572c4311Sfengbojiang return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;
382*572c4311Sfengbojiang }
383*572c4311Sfengbojiang
384*572c4311Sfengbojiang
lua_touserdata(lua_State * L,int idx)385*572c4311Sfengbojiang LUA_API void *lua_touserdata (lua_State *L, int idx) {
386*572c4311Sfengbojiang StkId o = index2adr(L, idx);
387*572c4311Sfengbojiang switch (ttype(o)) {
388*572c4311Sfengbojiang case LUA_TUSERDATA: return (rawuvalue(o) + 1);
389*572c4311Sfengbojiang case LUA_TLIGHTUSERDATA: return pvalue(o);
390*572c4311Sfengbojiang default: return NULL;
391*572c4311Sfengbojiang }
392*572c4311Sfengbojiang }
393*572c4311Sfengbojiang
394*572c4311Sfengbojiang
lua_tothread(lua_State * L,int idx)395*572c4311Sfengbojiang LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
396*572c4311Sfengbojiang StkId o = index2adr(L, idx);
397*572c4311Sfengbojiang return (!ttisthread(o)) ? NULL : thvalue(o);
398*572c4311Sfengbojiang }
399*572c4311Sfengbojiang
400*572c4311Sfengbojiang
lua_topointer(lua_State * L,int idx)401*572c4311Sfengbojiang LUA_API const void *lua_topointer (lua_State *L, int idx) {
402*572c4311Sfengbojiang StkId o = index2adr(L, idx);
403*572c4311Sfengbojiang switch (ttype(o)) {
404*572c4311Sfengbojiang case LUA_TTABLE: return hvalue(o);
405*572c4311Sfengbojiang case LUA_TFUNCTION: return clvalue(o);
406*572c4311Sfengbojiang case LUA_TTHREAD: return thvalue(o);
407*572c4311Sfengbojiang case LUA_TUSERDATA:
408*572c4311Sfengbojiang case LUA_TLIGHTUSERDATA:
409*572c4311Sfengbojiang return lua_touserdata(L, idx);
410*572c4311Sfengbojiang default: return NULL;
411*572c4311Sfengbojiang }
412*572c4311Sfengbojiang }
413*572c4311Sfengbojiang
414*572c4311Sfengbojiang
415*572c4311Sfengbojiang
416*572c4311Sfengbojiang /*
417*572c4311Sfengbojiang ** push functions (C -> stack)
418*572c4311Sfengbojiang */
419*572c4311Sfengbojiang
420*572c4311Sfengbojiang
lua_pushnil(lua_State * L)421*572c4311Sfengbojiang LUA_API void lua_pushnil (lua_State *L) {
422*572c4311Sfengbojiang lua_lock(L);
423*572c4311Sfengbojiang setnilvalue(L->top);
424*572c4311Sfengbojiang api_incr_top(L);
425*572c4311Sfengbojiang lua_unlock(L);
426*572c4311Sfengbojiang }
427*572c4311Sfengbojiang
428*572c4311Sfengbojiang
lua_pushnumber(lua_State * L,lua_Number n)429*572c4311Sfengbojiang LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
430*572c4311Sfengbojiang lua_lock(L);
431*572c4311Sfengbojiang setnvalue(L->top, n);
432*572c4311Sfengbojiang api_incr_top(L);
433*572c4311Sfengbojiang lua_unlock(L);
434*572c4311Sfengbojiang }
435*572c4311Sfengbojiang
436*572c4311Sfengbojiang
lua_pushinteger(lua_State * L,lua_Integer n)437*572c4311Sfengbojiang LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
438*572c4311Sfengbojiang lua_lock(L);
439*572c4311Sfengbojiang setnvalue(L->top, cast_num(n));
440*572c4311Sfengbojiang api_incr_top(L);
441*572c4311Sfengbojiang lua_unlock(L);
442*572c4311Sfengbojiang }
443*572c4311Sfengbojiang
444*572c4311Sfengbojiang
lua_pushlstring(lua_State * L,const char * s,size_t len)445*572c4311Sfengbojiang LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
446*572c4311Sfengbojiang lua_lock(L);
447*572c4311Sfengbojiang luaC_checkGC(L);
448*572c4311Sfengbojiang setsvalue2s(L, L->top, luaS_newlstr(L, s, len));
449*572c4311Sfengbojiang api_incr_top(L);
450*572c4311Sfengbojiang lua_unlock(L);
451*572c4311Sfengbojiang }
452*572c4311Sfengbojiang
453*572c4311Sfengbojiang
lua_pushstring(lua_State * L,const char * s)454*572c4311Sfengbojiang LUA_API void lua_pushstring (lua_State *L, const char *s) {
455*572c4311Sfengbojiang if (s == NULL)
456*572c4311Sfengbojiang lua_pushnil(L);
457*572c4311Sfengbojiang else
458*572c4311Sfengbojiang lua_pushlstring(L, s, strlen(s));
459*572c4311Sfengbojiang }
460*572c4311Sfengbojiang
461*572c4311Sfengbojiang
lua_pushvfstring(lua_State * L,const char * fmt,va_list argp)462*572c4311Sfengbojiang LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
463*572c4311Sfengbojiang va_list argp) {
464*572c4311Sfengbojiang const char *ret;
465*572c4311Sfengbojiang lua_lock(L);
466*572c4311Sfengbojiang luaC_checkGC(L);
467*572c4311Sfengbojiang ret = luaO_pushvfstring(L, fmt, argp);
468*572c4311Sfengbojiang lua_unlock(L);
469*572c4311Sfengbojiang return ret;
470*572c4311Sfengbojiang }
471*572c4311Sfengbojiang
472*572c4311Sfengbojiang
lua_pushfstring(lua_State * L,const char * fmt,...)473*572c4311Sfengbojiang LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
474*572c4311Sfengbojiang const char *ret;
475*572c4311Sfengbojiang va_list argp;
476*572c4311Sfengbojiang lua_lock(L);
477*572c4311Sfengbojiang luaC_checkGC(L);
478*572c4311Sfengbojiang va_start(argp, fmt);
479*572c4311Sfengbojiang ret = luaO_pushvfstring(L, fmt, argp);
480*572c4311Sfengbojiang va_end(argp);
481*572c4311Sfengbojiang lua_unlock(L);
482*572c4311Sfengbojiang return ret;
483*572c4311Sfengbojiang }
484*572c4311Sfengbojiang
485*572c4311Sfengbojiang
lua_pushcclosure(lua_State * L,lua_CFunction fn,int n)486*572c4311Sfengbojiang LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
487*572c4311Sfengbojiang Closure *cl;
488*572c4311Sfengbojiang lua_lock(L);
489*572c4311Sfengbojiang luaC_checkGC(L);
490*572c4311Sfengbojiang api_checknelems(L, n);
491*572c4311Sfengbojiang cl = luaF_newCclosure(L, n, getcurrenv(L));
492*572c4311Sfengbojiang cl->c.f = fn;
493*572c4311Sfengbojiang L->top -= n;
494*572c4311Sfengbojiang while (n--)
495*572c4311Sfengbojiang setobj2n(L, &cl->c.upvalue[n], L->top+n);
496*572c4311Sfengbojiang setclvalue(L, L->top, cl);
497*572c4311Sfengbojiang lua_assert(iswhite(obj2gco(cl)));
498*572c4311Sfengbojiang api_incr_top(L);
499*572c4311Sfengbojiang lua_unlock(L);
500*572c4311Sfengbojiang }
501*572c4311Sfengbojiang
502*572c4311Sfengbojiang
lua_pushboolean(lua_State * L,int b)503*572c4311Sfengbojiang LUA_API void lua_pushboolean (lua_State *L, int b) {
504*572c4311Sfengbojiang lua_lock(L);
505*572c4311Sfengbojiang setbvalue(L->top, (b != 0)); /* ensure that true is 1 */
506*572c4311Sfengbojiang api_incr_top(L);
507*572c4311Sfengbojiang lua_unlock(L);
508*572c4311Sfengbojiang }
509*572c4311Sfengbojiang
510*572c4311Sfengbojiang
lua_pushlightuserdata(lua_State * L,void * p)511*572c4311Sfengbojiang LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
512*572c4311Sfengbojiang lua_lock(L);
513*572c4311Sfengbojiang setpvalue(L->top, p);
514*572c4311Sfengbojiang api_incr_top(L);
515*572c4311Sfengbojiang lua_unlock(L);
516*572c4311Sfengbojiang }
517*572c4311Sfengbojiang
518*572c4311Sfengbojiang
lua_pushthread(lua_State * L)519*572c4311Sfengbojiang LUA_API int lua_pushthread (lua_State *L) {
520*572c4311Sfengbojiang lua_lock(L);
521*572c4311Sfengbojiang setthvalue(L, L->top, L);
522*572c4311Sfengbojiang api_incr_top(L);
523*572c4311Sfengbojiang lua_unlock(L);
524*572c4311Sfengbojiang return (G(L)->mainthread == L);
525*572c4311Sfengbojiang }
526*572c4311Sfengbojiang
527*572c4311Sfengbojiang
528*572c4311Sfengbojiang
529*572c4311Sfengbojiang /*
530*572c4311Sfengbojiang ** get functions (Lua -> stack)
531*572c4311Sfengbojiang */
532*572c4311Sfengbojiang
533*572c4311Sfengbojiang
lua_gettable(lua_State * L,int idx)534*572c4311Sfengbojiang LUA_API void lua_gettable (lua_State *L, int idx) {
535*572c4311Sfengbojiang StkId t;
536*572c4311Sfengbojiang lua_lock(L);
537*572c4311Sfengbojiang t = index2adr(L, idx);
538*572c4311Sfengbojiang api_checkvalidindex(L, t);
539*572c4311Sfengbojiang luaV_gettable(L, t, L->top - 1, L->top - 1);
540*572c4311Sfengbojiang lua_unlock(L);
541*572c4311Sfengbojiang }
542*572c4311Sfengbojiang
543*572c4311Sfengbojiang
lua_getfield(lua_State * L,int idx,const char * k)544*572c4311Sfengbojiang LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
545*572c4311Sfengbojiang StkId t;
546*572c4311Sfengbojiang TValue key;
547*572c4311Sfengbojiang lua_lock(L);
548*572c4311Sfengbojiang t = index2adr(L, idx);
549*572c4311Sfengbojiang api_checkvalidindex(L, t);
550*572c4311Sfengbojiang setsvalue(L, &key, luaS_new(L, k));
551*572c4311Sfengbojiang luaV_gettable(L, t, &key, L->top);
552*572c4311Sfengbojiang api_incr_top(L);
553*572c4311Sfengbojiang lua_unlock(L);
554*572c4311Sfengbojiang }
555*572c4311Sfengbojiang
556*572c4311Sfengbojiang
lua_rawget(lua_State * L,int idx)557*572c4311Sfengbojiang LUA_API void lua_rawget (lua_State *L, int idx) {
558*572c4311Sfengbojiang StkId t;
559*572c4311Sfengbojiang lua_lock(L);
560*572c4311Sfengbojiang t = index2adr(L, idx);
561*572c4311Sfengbojiang api_check(L, ttistable(t));
562*572c4311Sfengbojiang setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
563*572c4311Sfengbojiang lua_unlock(L);
564*572c4311Sfengbojiang }
565*572c4311Sfengbojiang
566*572c4311Sfengbojiang
lua_rawgeti(lua_State * L,int idx,int n)567*572c4311Sfengbojiang LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
568*572c4311Sfengbojiang StkId o;
569*572c4311Sfengbojiang lua_lock(L);
570*572c4311Sfengbojiang o = index2adr(L, idx);
571*572c4311Sfengbojiang api_check(L, ttistable(o));
572*572c4311Sfengbojiang setobj2s(L, L->top, luaH_getnum(hvalue(o), n));
573*572c4311Sfengbojiang api_incr_top(L);
574*572c4311Sfengbojiang lua_unlock(L);
575*572c4311Sfengbojiang }
576*572c4311Sfengbojiang
577*572c4311Sfengbojiang
lua_createtable(lua_State * L,int narray,int nrec)578*572c4311Sfengbojiang LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
579*572c4311Sfengbojiang lua_lock(L);
580*572c4311Sfengbojiang luaC_checkGC(L);
581*572c4311Sfengbojiang sethvalue(L, L->top, luaH_new(L, narray, nrec));
582*572c4311Sfengbojiang api_incr_top(L);
583*572c4311Sfengbojiang lua_unlock(L);
584*572c4311Sfengbojiang }
585*572c4311Sfengbojiang
586*572c4311Sfengbojiang
lua_getmetatable(lua_State * L,int objindex)587*572c4311Sfengbojiang LUA_API int lua_getmetatable (lua_State *L, int objindex) {
588*572c4311Sfengbojiang const TValue *obj;
589*572c4311Sfengbojiang Table *mt = NULL;
590*572c4311Sfengbojiang int res;
591*572c4311Sfengbojiang lua_lock(L);
592*572c4311Sfengbojiang obj = index2adr(L, objindex);
593*572c4311Sfengbojiang switch (ttype(obj)) {
594*572c4311Sfengbojiang case LUA_TTABLE:
595*572c4311Sfengbojiang mt = hvalue(obj)->metatable;
596*572c4311Sfengbojiang break;
597*572c4311Sfengbojiang case LUA_TUSERDATA:
598*572c4311Sfengbojiang mt = uvalue(obj)->metatable;
599*572c4311Sfengbojiang break;
600*572c4311Sfengbojiang default:
601*572c4311Sfengbojiang mt = G(L)->mt[ttype(obj)];
602*572c4311Sfengbojiang break;
603*572c4311Sfengbojiang }
604*572c4311Sfengbojiang if (mt == NULL)
605*572c4311Sfengbojiang res = 0;
606*572c4311Sfengbojiang else {
607*572c4311Sfengbojiang sethvalue(L, L->top, mt);
608*572c4311Sfengbojiang api_incr_top(L);
609*572c4311Sfengbojiang res = 1;
610*572c4311Sfengbojiang }
611*572c4311Sfengbojiang lua_unlock(L);
612*572c4311Sfengbojiang return res;
613*572c4311Sfengbojiang }
614*572c4311Sfengbojiang
615*572c4311Sfengbojiang
lua_getfenv(lua_State * L,int idx)616*572c4311Sfengbojiang LUA_API void lua_getfenv (lua_State *L, int idx) {
617*572c4311Sfengbojiang StkId o;
618*572c4311Sfengbojiang lua_lock(L);
619*572c4311Sfengbojiang o = index2adr(L, idx);
620*572c4311Sfengbojiang api_checkvalidindex(L, o);
621*572c4311Sfengbojiang switch (ttype(o)) {
622*572c4311Sfengbojiang case LUA_TFUNCTION:
623*572c4311Sfengbojiang sethvalue(L, L->top, clvalue(o)->c.env);
624*572c4311Sfengbojiang break;
625*572c4311Sfengbojiang case LUA_TUSERDATA:
626*572c4311Sfengbojiang sethvalue(L, L->top, uvalue(o)->env);
627*572c4311Sfengbojiang break;
628*572c4311Sfengbojiang case LUA_TTHREAD:
629*572c4311Sfengbojiang setobj2s(L, L->top, gt(thvalue(o)));
630*572c4311Sfengbojiang break;
631*572c4311Sfengbojiang default:
632*572c4311Sfengbojiang setnilvalue(L->top);
633*572c4311Sfengbojiang break;
634*572c4311Sfengbojiang }
635*572c4311Sfengbojiang api_incr_top(L);
636*572c4311Sfengbojiang lua_unlock(L);
637*572c4311Sfengbojiang }
638*572c4311Sfengbojiang
639*572c4311Sfengbojiang
640*572c4311Sfengbojiang /*
641*572c4311Sfengbojiang ** set functions (stack -> Lua)
642*572c4311Sfengbojiang */
643*572c4311Sfengbojiang
644*572c4311Sfengbojiang
lua_settable(lua_State * L,int idx)645*572c4311Sfengbojiang LUA_API void lua_settable (lua_State *L, int idx) {
646*572c4311Sfengbojiang StkId t;
647*572c4311Sfengbojiang lua_lock(L);
648*572c4311Sfengbojiang api_checknelems(L, 2);
649*572c4311Sfengbojiang t = index2adr(L, idx);
650*572c4311Sfengbojiang api_checkvalidindex(L, t);
651*572c4311Sfengbojiang luaV_settable(L, t, L->top - 2, L->top - 1);
652*572c4311Sfengbojiang L->top -= 2; /* pop index and value */
653*572c4311Sfengbojiang lua_unlock(L);
654*572c4311Sfengbojiang }
655*572c4311Sfengbojiang
656*572c4311Sfengbojiang
lua_setfield(lua_State * L,int idx,const char * k)657*572c4311Sfengbojiang LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
658*572c4311Sfengbojiang StkId t;
659*572c4311Sfengbojiang TValue key;
660*572c4311Sfengbojiang lua_lock(L);
661*572c4311Sfengbojiang api_checknelems(L, 1);
662*572c4311Sfengbojiang t = index2adr(L, idx);
663*572c4311Sfengbojiang api_checkvalidindex(L, t);
664*572c4311Sfengbojiang setsvalue(L, &key, luaS_new(L, k));
665*572c4311Sfengbojiang luaV_settable(L, t, &key, L->top - 1);
666*572c4311Sfengbojiang L->top--; /* pop value */
667*572c4311Sfengbojiang lua_unlock(L);
668*572c4311Sfengbojiang }
669*572c4311Sfengbojiang
670*572c4311Sfengbojiang
lua_rawset(lua_State * L,int idx)671*572c4311Sfengbojiang LUA_API void lua_rawset (lua_State *L, int idx) {
672*572c4311Sfengbojiang StkId t;
673*572c4311Sfengbojiang lua_lock(L);
674*572c4311Sfengbojiang api_checknelems(L, 2);
675*572c4311Sfengbojiang t = index2adr(L, idx);
676*572c4311Sfengbojiang api_check(L, ttistable(t));
677*572c4311Sfengbojiang setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
678*572c4311Sfengbojiang luaC_barriert(L, hvalue(t), L->top-1);
679*572c4311Sfengbojiang L->top -= 2;
680*572c4311Sfengbojiang lua_unlock(L);
681*572c4311Sfengbojiang }
682*572c4311Sfengbojiang
683*572c4311Sfengbojiang
lua_rawseti(lua_State * L,int idx,int n)684*572c4311Sfengbojiang LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
685*572c4311Sfengbojiang StkId o;
686*572c4311Sfengbojiang lua_lock(L);
687*572c4311Sfengbojiang api_checknelems(L, 1);
688*572c4311Sfengbojiang o = index2adr(L, idx);
689*572c4311Sfengbojiang api_check(L, ttistable(o));
690*572c4311Sfengbojiang setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);
691*572c4311Sfengbojiang luaC_barriert(L, hvalue(o), L->top-1);
692*572c4311Sfengbojiang L->top--;
693*572c4311Sfengbojiang lua_unlock(L);
694*572c4311Sfengbojiang }
695*572c4311Sfengbojiang
696*572c4311Sfengbojiang
lua_setmetatable(lua_State * L,int objindex)697*572c4311Sfengbojiang LUA_API int lua_setmetatable (lua_State *L, int objindex) {
698*572c4311Sfengbojiang TValue *obj;
699*572c4311Sfengbojiang Table *mt;
700*572c4311Sfengbojiang lua_lock(L);
701*572c4311Sfengbojiang api_checknelems(L, 1);
702*572c4311Sfengbojiang obj = index2adr(L, objindex);
703*572c4311Sfengbojiang api_checkvalidindex(L, obj);
704*572c4311Sfengbojiang if (ttisnil(L->top - 1))
705*572c4311Sfengbojiang mt = NULL;
706*572c4311Sfengbojiang else {
707*572c4311Sfengbojiang api_check(L, ttistable(L->top - 1));
708*572c4311Sfengbojiang mt = hvalue(L->top - 1);
709*572c4311Sfengbojiang }
710*572c4311Sfengbojiang switch (ttype(obj)) {
711*572c4311Sfengbojiang case LUA_TTABLE: {
712*572c4311Sfengbojiang hvalue(obj)->metatable = mt;
713*572c4311Sfengbojiang if (mt)
714*572c4311Sfengbojiang luaC_objbarriert(L, hvalue(obj), mt);
715*572c4311Sfengbojiang break;
716*572c4311Sfengbojiang }
717*572c4311Sfengbojiang case LUA_TUSERDATA: {
718*572c4311Sfengbojiang uvalue(obj)->metatable = mt;
719*572c4311Sfengbojiang if (mt)
720*572c4311Sfengbojiang luaC_objbarrier(L, rawuvalue(obj), mt);
721*572c4311Sfengbojiang break;
722*572c4311Sfengbojiang }
723*572c4311Sfengbojiang default: {
724*572c4311Sfengbojiang G(L)->mt[ttype(obj)] = mt;
725*572c4311Sfengbojiang break;
726*572c4311Sfengbojiang }
727*572c4311Sfengbojiang }
728*572c4311Sfengbojiang L->top--;
729*572c4311Sfengbojiang lua_unlock(L);
730*572c4311Sfengbojiang return 1;
731*572c4311Sfengbojiang }
732*572c4311Sfengbojiang
733*572c4311Sfengbojiang
lua_setfenv(lua_State * L,int idx)734*572c4311Sfengbojiang LUA_API int lua_setfenv (lua_State *L, int idx) {
735*572c4311Sfengbojiang StkId o;
736*572c4311Sfengbojiang int res = 1;
737*572c4311Sfengbojiang lua_lock(L);
738*572c4311Sfengbojiang api_checknelems(L, 1);
739*572c4311Sfengbojiang o = index2adr(L, idx);
740*572c4311Sfengbojiang api_checkvalidindex(L, o);
741*572c4311Sfengbojiang api_check(L, ttistable(L->top - 1));
742*572c4311Sfengbojiang switch (ttype(o)) {
743*572c4311Sfengbojiang case LUA_TFUNCTION:
744*572c4311Sfengbojiang clvalue(o)->c.env = hvalue(L->top - 1);
745*572c4311Sfengbojiang break;
746*572c4311Sfengbojiang case LUA_TUSERDATA:
747*572c4311Sfengbojiang uvalue(o)->env = hvalue(L->top - 1);
748*572c4311Sfengbojiang break;
749*572c4311Sfengbojiang case LUA_TTHREAD:
750*572c4311Sfengbojiang sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1));
751*572c4311Sfengbojiang break;
752*572c4311Sfengbojiang default:
753*572c4311Sfengbojiang res = 0;
754*572c4311Sfengbojiang break;
755*572c4311Sfengbojiang }
756*572c4311Sfengbojiang if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
757*572c4311Sfengbojiang L->top--;
758*572c4311Sfengbojiang lua_unlock(L);
759*572c4311Sfengbojiang return res;
760*572c4311Sfengbojiang }
761*572c4311Sfengbojiang
762*572c4311Sfengbojiang
763*572c4311Sfengbojiang /*
764*572c4311Sfengbojiang ** `load' and `call' functions (run Lua code)
765*572c4311Sfengbojiang */
766*572c4311Sfengbojiang
767*572c4311Sfengbojiang
768*572c4311Sfengbojiang #define adjustresults(L,nres) \
769*572c4311Sfengbojiang { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; }
770*572c4311Sfengbojiang
771*572c4311Sfengbojiang
772*572c4311Sfengbojiang #define checkresults(L,na,nr) \
773*572c4311Sfengbojiang api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)))
774*572c4311Sfengbojiang
775*572c4311Sfengbojiang
lua_call(lua_State * L,int nargs,int nresults)776*572c4311Sfengbojiang LUA_API void lua_call (lua_State *L, int nargs, int nresults) {
777*572c4311Sfengbojiang StkId func;
778*572c4311Sfengbojiang lua_lock(L);
779*572c4311Sfengbojiang api_checknelems(L, nargs+1);
780*572c4311Sfengbojiang checkresults(L, nargs, nresults);
781*572c4311Sfengbojiang func = L->top - (nargs+1);
782*572c4311Sfengbojiang luaD_call(L, func, nresults);
783*572c4311Sfengbojiang adjustresults(L, nresults);
784*572c4311Sfengbojiang lua_unlock(L);
785*572c4311Sfengbojiang }
786*572c4311Sfengbojiang
787*572c4311Sfengbojiang
788*572c4311Sfengbojiang
789*572c4311Sfengbojiang /*
790*572c4311Sfengbojiang ** Execute a protected call.
791*572c4311Sfengbojiang */
792*572c4311Sfengbojiang struct CallS { /* data to `f_call' */
793*572c4311Sfengbojiang StkId func;
794*572c4311Sfengbojiang int nresults;
795*572c4311Sfengbojiang };
796*572c4311Sfengbojiang
797*572c4311Sfengbojiang
f_call(lua_State * L,void * ud)798*572c4311Sfengbojiang static void f_call (lua_State *L, void *ud) {
799*572c4311Sfengbojiang struct CallS *c = cast(struct CallS *, ud);
800*572c4311Sfengbojiang luaD_call(L, c->func, c->nresults);
801*572c4311Sfengbojiang }
802*572c4311Sfengbojiang
803*572c4311Sfengbojiang
804*572c4311Sfengbojiang
lua_pcall(lua_State * L,int nargs,int nresults,int errfunc)805*572c4311Sfengbojiang LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) {
806*572c4311Sfengbojiang struct CallS c;
807*572c4311Sfengbojiang int status;
808*572c4311Sfengbojiang ptrdiff_t func;
809*572c4311Sfengbojiang lua_lock(L);
810*572c4311Sfengbojiang api_checknelems(L, nargs+1);
811*572c4311Sfengbojiang checkresults(L, nargs, nresults);
812*572c4311Sfengbojiang if (errfunc == 0)
813*572c4311Sfengbojiang func = 0;
814*572c4311Sfengbojiang else {
815*572c4311Sfengbojiang StkId o = index2adr(L, errfunc);
816*572c4311Sfengbojiang api_checkvalidindex(L, o);
817*572c4311Sfengbojiang func = savestack(L, o);
818*572c4311Sfengbojiang }
819*572c4311Sfengbojiang c.func = L->top - (nargs+1); /* function to be called */
820*572c4311Sfengbojiang c.nresults = nresults;
821*572c4311Sfengbojiang status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
822*572c4311Sfengbojiang adjustresults(L, nresults);
823*572c4311Sfengbojiang lua_unlock(L);
824*572c4311Sfengbojiang return status;
825*572c4311Sfengbojiang }
826*572c4311Sfengbojiang
827*572c4311Sfengbojiang
828*572c4311Sfengbojiang /*
829*572c4311Sfengbojiang ** Execute a protected C call.
830*572c4311Sfengbojiang */
831*572c4311Sfengbojiang struct CCallS { /* data to `f_Ccall' */
832*572c4311Sfengbojiang lua_CFunction func;
833*572c4311Sfengbojiang void *ud;
834*572c4311Sfengbojiang };
835*572c4311Sfengbojiang
836*572c4311Sfengbojiang
f_Ccall(lua_State * L,void * ud)837*572c4311Sfengbojiang static void f_Ccall (lua_State *L, void *ud) {
838*572c4311Sfengbojiang struct CCallS *c = cast(struct CCallS *, ud);
839*572c4311Sfengbojiang Closure *cl;
840*572c4311Sfengbojiang cl = luaF_newCclosure(L, 0, getcurrenv(L));
841*572c4311Sfengbojiang cl->c.f = c->func;
842*572c4311Sfengbojiang setclvalue(L, L->top, cl); /* push function */
843*572c4311Sfengbojiang api_incr_top(L);
844*572c4311Sfengbojiang setpvalue(L->top, c->ud); /* push only argument */
845*572c4311Sfengbojiang api_incr_top(L);
846*572c4311Sfengbojiang luaD_call(L, L->top - 2, 0);
847*572c4311Sfengbojiang }
848*572c4311Sfengbojiang
849*572c4311Sfengbojiang
lua_cpcall(lua_State * L,lua_CFunction func,void * ud)850*572c4311Sfengbojiang LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {
851*572c4311Sfengbojiang struct CCallS c;
852*572c4311Sfengbojiang int status;
853*572c4311Sfengbojiang lua_lock(L);
854*572c4311Sfengbojiang c.func = func;
855*572c4311Sfengbojiang c.ud = ud;
856*572c4311Sfengbojiang status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0);
857*572c4311Sfengbojiang lua_unlock(L);
858*572c4311Sfengbojiang return status;
859*572c4311Sfengbojiang }
860*572c4311Sfengbojiang
861*572c4311Sfengbojiang
lua_load(lua_State * L,lua_Reader reader,void * data,const char * chunkname)862*572c4311Sfengbojiang LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
863*572c4311Sfengbojiang const char *chunkname) {
864*572c4311Sfengbojiang ZIO z;
865*572c4311Sfengbojiang int status;
866*572c4311Sfengbojiang lua_lock(L);
867*572c4311Sfengbojiang if (!chunkname) chunkname = "?";
868*572c4311Sfengbojiang luaZ_init(L, &z, reader, data);
869*572c4311Sfengbojiang status = luaD_protectedparser(L, &z, chunkname);
870*572c4311Sfengbojiang lua_unlock(L);
871*572c4311Sfengbojiang return status;
872*572c4311Sfengbojiang }
873*572c4311Sfengbojiang
874*572c4311Sfengbojiang
lua_dump(lua_State * L,lua_Writer writer,void * data)875*572c4311Sfengbojiang LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
876*572c4311Sfengbojiang int status;
877*572c4311Sfengbojiang TValue *o;
878*572c4311Sfengbojiang lua_lock(L);
879*572c4311Sfengbojiang api_checknelems(L, 1);
880*572c4311Sfengbojiang o = L->top - 1;
881*572c4311Sfengbojiang if (isLfunction(o))
882*572c4311Sfengbojiang status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0);
883*572c4311Sfengbojiang else
884*572c4311Sfengbojiang status = 1;
885*572c4311Sfengbojiang lua_unlock(L);
886*572c4311Sfengbojiang return status;
887*572c4311Sfengbojiang }
888*572c4311Sfengbojiang
889*572c4311Sfengbojiang
lua_status(lua_State * L)890*572c4311Sfengbojiang LUA_API int lua_status (lua_State *L) {
891*572c4311Sfengbojiang return L->status;
892*572c4311Sfengbojiang }
893*572c4311Sfengbojiang
894*572c4311Sfengbojiang
895*572c4311Sfengbojiang /*
896*572c4311Sfengbojiang ** Garbage-collection function
897*572c4311Sfengbojiang */
898*572c4311Sfengbojiang
lua_gc(lua_State * L,int what,int data)899*572c4311Sfengbojiang LUA_API int lua_gc (lua_State *L, int what, int data) {
900*572c4311Sfengbojiang int res = 0;
901*572c4311Sfengbojiang global_State *g;
902*572c4311Sfengbojiang lua_lock(L);
903*572c4311Sfengbojiang g = G(L);
904*572c4311Sfengbojiang switch (what) {
905*572c4311Sfengbojiang case LUA_GCSTOP: {
906*572c4311Sfengbojiang g->GCthreshold = MAX_LUMEM;
907*572c4311Sfengbojiang break;
908*572c4311Sfengbojiang }
909*572c4311Sfengbojiang case LUA_GCRESTART: {
910*572c4311Sfengbojiang g->GCthreshold = g->totalbytes;
911*572c4311Sfengbojiang break;
912*572c4311Sfengbojiang }
913*572c4311Sfengbojiang case LUA_GCCOLLECT: {
914*572c4311Sfengbojiang luaC_fullgc(L);
915*572c4311Sfengbojiang break;
916*572c4311Sfengbojiang }
917*572c4311Sfengbojiang case LUA_GCCOUNT: {
918*572c4311Sfengbojiang /* GC values are expressed in Kbytes: #bytes/2^10 */
919*572c4311Sfengbojiang res = cast_int(g->totalbytes >> 10);
920*572c4311Sfengbojiang break;
921*572c4311Sfengbojiang }
922*572c4311Sfengbojiang case LUA_GCCOUNTB: {
923*572c4311Sfengbojiang res = cast_int(g->totalbytes & 0x3ff);
924*572c4311Sfengbojiang break;
925*572c4311Sfengbojiang }
926*572c4311Sfengbojiang case LUA_GCSTEP: {
927*572c4311Sfengbojiang lu_mem a = (cast(lu_mem, data) << 10);
928*572c4311Sfengbojiang if (a <= g->totalbytes)
929*572c4311Sfengbojiang g->GCthreshold = g->totalbytes - a;
930*572c4311Sfengbojiang else
931*572c4311Sfengbojiang g->GCthreshold = 0;
932*572c4311Sfengbojiang while (g->GCthreshold <= g->totalbytes) {
933*572c4311Sfengbojiang luaC_step(L);
934*572c4311Sfengbojiang if (g->gcstate == GCSpause) { /* end of cycle? */
935*572c4311Sfengbojiang res = 1; /* signal it */
936*572c4311Sfengbojiang break;
937*572c4311Sfengbojiang }
938*572c4311Sfengbojiang }
939*572c4311Sfengbojiang break;
940*572c4311Sfengbojiang }
941*572c4311Sfengbojiang case LUA_GCSETPAUSE: {
942*572c4311Sfengbojiang res = g->gcpause;
943*572c4311Sfengbojiang g->gcpause = data;
944*572c4311Sfengbojiang break;
945*572c4311Sfengbojiang }
946*572c4311Sfengbojiang case LUA_GCSETSTEPMUL: {
947*572c4311Sfengbojiang res = g->gcstepmul;
948*572c4311Sfengbojiang g->gcstepmul = data;
949*572c4311Sfengbojiang break;
950*572c4311Sfengbojiang }
951*572c4311Sfengbojiang default: res = -1; /* invalid option */
952*572c4311Sfengbojiang }
953*572c4311Sfengbojiang lua_unlock(L);
954*572c4311Sfengbojiang return res;
955*572c4311Sfengbojiang }
956*572c4311Sfengbojiang
957*572c4311Sfengbojiang
958*572c4311Sfengbojiang
959*572c4311Sfengbojiang /*
960*572c4311Sfengbojiang ** miscellaneous functions
961*572c4311Sfengbojiang */
962*572c4311Sfengbojiang
963*572c4311Sfengbojiang
lua_error(lua_State * L)964*572c4311Sfengbojiang LUA_API int lua_error (lua_State *L) {
965*572c4311Sfengbojiang lua_lock(L);
966*572c4311Sfengbojiang api_checknelems(L, 1);
967*572c4311Sfengbojiang luaG_errormsg(L);
968*572c4311Sfengbojiang lua_unlock(L);
969*572c4311Sfengbojiang return 0; /* to avoid warnings */
970*572c4311Sfengbojiang }
971*572c4311Sfengbojiang
972*572c4311Sfengbojiang
lua_next(lua_State * L,int idx)973*572c4311Sfengbojiang LUA_API int lua_next (lua_State *L, int idx) {
974*572c4311Sfengbojiang StkId t;
975*572c4311Sfengbojiang int more;
976*572c4311Sfengbojiang lua_lock(L);
977*572c4311Sfengbojiang t = index2adr(L, idx);
978*572c4311Sfengbojiang api_check(L, ttistable(t));
979*572c4311Sfengbojiang more = luaH_next(L, hvalue(t), L->top - 1);
980*572c4311Sfengbojiang if (more) {
981*572c4311Sfengbojiang api_incr_top(L);
982*572c4311Sfengbojiang }
983*572c4311Sfengbojiang else /* no more elements */
984*572c4311Sfengbojiang L->top -= 1; /* remove key */
985*572c4311Sfengbojiang lua_unlock(L);
986*572c4311Sfengbojiang return more;
987*572c4311Sfengbojiang }
988*572c4311Sfengbojiang
989*572c4311Sfengbojiang
lua_concat(lua_State * L,int n)990*572c4311Sfengbojiang LUA_API void lua_concat (lua_State *L, int n) {
991*572c4311Sfengbojiang lua_lock(L);
992*572c4311Sfengbojiang api_checknelems(L, n);
993*572c4311Sfengbojiang if (n >= 2) {
994*572c4311Sfengbojiang luaC_checkGC(L);
995*572c4311Sfengbojiang luaV_concat(L, n, cast_int(L->top - L->base) - 1);
996*572c4311Sfengbojiang L->top -= (n-1);
997*572c4311Sfengbojiang }
998*572c4311Sfengbojiang else if (n == 0) { /* push empty string */
999*572c4311Sfengbojiang setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));
1000*572c4311Sfengbojiang api_incr_top(L);
1001*572c4311Sfengbojiang }
1002*572c4311Sfengbojiang /* else n == 1; nothing to do */
1003*572c4311Sfengbojiang lua_unlock(L);
1004*572c4311Sfengbojiang }
1005*572c4311Sfengbojiang
1006*572c4311Sfengbojiang
lua_getallocf(lua_State * L,void ** ud)1007*572c4311Sfengbojiang LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
1008*572c4311Sfengbojiang lua_Alloc f;
1009*572c4311Sfengbojiang lua_lock(L);
1010*572c4311Sfengbojiang if (ud) *ud = G(L)->ud;
1011*572c4311Sfengbojiang f = G(L)->frealloc;
1012*572c4311Sfengbojiang lua_unlock(L);
1013*572c4311Sfengbojiang return f;
1014*572c4311Sfengbojiang }
1015*572c4311Sfengbojiang
1016*572c4311Sfengbojiang
lua_setallocf(lua_State * L,lua_Alloc f,void * ud)1017*572c4311Sfengbojiang LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
1018*572c4311Sfengbojiang lua_lock(L);
1019*572c4311Sfengbojiang G(L)->ud = ud;
1020*572c4311Sfengbojiang G(L)->frealloc = f;
1021*572c4311Sfengbojiang lua_unlock(L);
1022*572c4311Sfengbojiang }
1023*572c4311Sfengbojiang
1024*572c4311Sfengbojiang
lua_newuserdata(lua_State * L,size_t size)1025*572c4311Sfengbojiang LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
1026*572c4311Sfengbojiang Udata *u;
1027*572c4311Sfengbojiang lua_lock(L);
1028*572c4311Sfengbojiang luaC_checkGC(L);
1029*572c4311Sfengbojiang u = luaS_newudata(L, size, getcurrenv(L));
1030*572c4311Sfengbojiang setuvalue(L, L->top, u);
1031*572c4311Sfengbojiang api_incr_top(L);
1032*572c4311Sfengbojiang lua_unlock(L);
1033*572c4311Sfengbojiang return u + 1;
1034*572c4311Sfengbojiang }
1035*572c4311Sfengbojiang
1036*572c4311Sfengbojiang
1037*572c4311Sfengbojiang
1038*572c4311Sfengbojiang
aux_upvalue(StkId fi,int n,TValue ** val)1039*572c4311Sfengbojiang static const char *aux_upvalue (StkId fi, int n, TValue **val) {
1040*572c4311Sfengbojiang Closure *f;
1041*572c4311Sfengbojiang if (!ttisfunction(fi)) return NULL;
1042*572c4311Sfengbojiang f = clvalue(fi);
1043*572c4311Sfengbojiang if (f->c.isC) {
1044*572c4311Sfengbojiang if (!(1 <= n && n <= f->c.nupvalues)) return NULL;
1045*572c4311Sfengbojiang *val = &f->c.upvalue[n-1];
1046*572c4311Sfengbojiang return "";
1047*572c4311Sfengbojiang }
1048*572c4311Sfengbojiang else {
1049*572c4311Sfengbojiang Proto *p = f->l.p;
1050*572c4311Sfengbojiang if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
1051*572c4311Sfengbojiang *val = f->l.upvals[n-1]->v;
1052*572c4311Sfengbojiang return getstr(p->upvalues[n-1]);
1053*572c4311Sfengbojiang }
1054*572c4311Sfengbojiang }
1055*572c4311Sfengbojiang
1056*572c4311Sfengbojiang
lua_getupvalue(lua_State * L,int funcindex,int n)1057*572c4311Sfengbojiang LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
1058*572c4311Sfengbojiang const char *name;
1059*572c4311Sfengbojiang TValue *val;
1060*572c4311Sfengbojiang lua_lock(L);
1061*572c4311Sfengbojiang name = aux_upvalue(index2adr(L, funcindex), n, &val);
1062*572c4311Sfengbojiang if (name) {
1063*572c4311Sfengbojiang setobj2s(L, L->top, val);
1064*572c4311Sfengbojiang api_incr_top(L);
1065*572c4311Sfengbojiang }
1066*572c4311Sfengbojiang lua_unlock(L);
1067*572c4311Sfengbojiang return name;
1068*572c4311Sfengbojiang }
1069*572c4311Sfengbojiang
1070*572c4311Sfengbojiang
lua_setupvalue(lua_State * L,int funcindex,int n)1071*572c4311Sfengbojiang LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
1072*572c4311Sfengbojiang const char *name;
1073*572c4311Sfengbojiang TValue *val;
1074*572c4311Sfengbojiang StkId fi;
1075*572c4311Sfengbojiang lua_lock(L);
1076*572c4311Sfengbojiang fi = index2adr(L, funcindex);
1077*572c4311Sfengbojiang api_checknelems(L, 1);
1078*572c4311Sfengbojiang name = aux_upvalue(fi, n, &val);
1079*572c4311Sfengbojiang if (name) {
1080*572c4311Sfengbojiang L->top--;
1081*572c4311Sfengbojiang setobj(L, val, L->top);
1082*572c4311Sfengbojiang luaC_barrier(L, clvalue(fi), L->top);
1083*572c4311Sfengbojiang }
1084*572c4311Sfengbojiang lua_unlock(L);
1085*572c4311Sfengbojiang return name;
1086*572c4311Sfengbojiang }
1087*572c4311Sfengbojiang
1088