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