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