xref: /redis-3.2.3/deps/lua/src/lapi.c (revision 21d3294c)
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