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