lvm.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /*
  2. ** $Id: lvm.c,v 1.283 2003/03/31 13:00:25 roberto Exp roberto $
  3. ** Lua virtual machine
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdarg.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. /* needed only when `lua_number2str' uses `sprintf' */
  10. #include <stdio.h>
  11. #define lvm_c
  12. #include "lua.h"
  13. #include "ldebug.h"
  14. #include "ldo.h"
  15. #include "lfunc.h"
  16. #include "lgc.h"
  17. #include "lobject.h"
  18. #include "lopcodes.h"
  19. #include "lstate.h"
  20. #include "lstring.h"
  21. #include "ltable.h"
  22. #include "ltm.h"
  23. #include "lvm.h"
  24. /* function to convert a lua_Number to a string */
  25. #ifndef lua_number2str
  26. #define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
  27. #endif
  28. /* limit for table tag-method chains (to avoid loops) */
  29. #define MAXTAGLOOP 100
  30. const TObject *luaV_tonumber (const TObject *obj, TObject *n) {
  31. lua_Number num;
  32. if (ttisnumber(obj)) return obj;
  33. if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) {
  34. setnvalue(n, num);
  35. return n;
  36. }
  37. else
  38. return NULL;
  39. }
  40. int luaV_tostring (lua_State *L, StkId obj) {
  41. if (!ttisnumber(obj))
  42. return 0;
  43. else {
  44. char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */
  45. lua_number2str(s, nvalue(obj));
  46. setsvalue2s(obj, luaS_new(L, s));
  47. return 1;
  48. }
  49. }
  50. static void traceexec (lua_State *L) {
  51. lu_byte mask = L->hookmask;
  52. if (mask > LUA_MASKLINE) { /* instruction-hook set? */
  53. if (L->hookcount == 0) {
  54. resethookcount(L);
  55. luaD_callhook(L, LUA_HOOKCOUNT, -1);
  56. return;
  57. }
  58. }
  59. if (mask & LUA_MASKLINE) {
  60. CallInfo *ci = L->ci;
  61. Proto *p = ci_func(ci)->l.p;
  62. int newline = getline(p, pcRel(*ci->u.l.pc, p));
  63. if (!L->hookinit) {
  64. luaG_inithooks(L);
  65. return;
  66. }
  67. lua_assert(ci->state & CI_HASFRAME);
  68. if (pcRel(*ci->u.l.pc, p) == 0) /* tracing may be starting now? */
  69. ci->u.l.savedpc = *ci->u.l.pc; /* initialize `savedpc' */
  70. /* calls linehook when enters a new line or jumps back (loop) */
  71. if (*ci->u.l.pc <= ci->u.l.savedpc ||
  72. newline != getline(p, pcRel(ci->u.l.savedpc, p))) {
  73. luaD_callhook(L, LUA_HOOKLINE, newline);
  74. ci = L->ci; /* previous call may reallocate `ci' */
  75. }
  76. ci->u.l.savedpc = *ci->u.l.pc;
  77. }
  78. }
  79. static void callTMres (lua_State *L, const TObject *f,
  80. const TObject *p1, const TObject *p2) {
  81. setobj2s(L->top, f); /* push function */
  82. setobj2s(L->top+1, p1); /* 1st argument */
  83. setobj2s(L->top+2, p2); /* 2nd argument */
  84. luaD_checkstack(L, 3); /* cannot check before (could invalidate p1, p2) */
  85. L->top += 3;
  86. luaD_call(L, L->top - 3, 1);
  87. L->top--; /* result will be in L->top */
  88. }
  89. static void callTM (lua_State *L, const TObject *f,
  90. const TObject *p1, const TObject *p2, const TObject *p3) {
  91. setobj2s(L->top, f); /* push function */
  92. setobj2s(L->top+1, p1); /* 1st argument */
  93. setobj2s(L->top+2, p2); /* 2nd argument */
  94. setobj2s(L->top+3, p3); /* 3th argument */
  95. luaD_checkstack(L, 4); /* cannot check before (could invalidate p1...p3) */
  96. L->top += 4;
  97. luaD_call(L, L->top - 4, 0);
  98. }
  99. static const TObject *luaV_index (lua_State *L, const TObject *t,
  100. TObject *key, int loop) {
  101. const TObject *tm = fasttm(L, hvalue(t)->metatable, TM_INDEX);
  102. if (tm == NULL) return &luaO_nilobject; /* no TM */
  103. if (ttisfunction(tm)) {
  104. callTMres(L, tm, t, key);
  105. return L->top;
  106. }
  107. else return luaV_gettable(L, tm, key, loop);
  108. }
  109. static const TObject *luaV_getnotable (lua_State *L, const TObject *t,
  110. TObject *key, int loop) {
  111. const TObject *tm = luaT_gettmbyobj(L, t, TM_INDEX);
  112. if (ttisnil(tm))
  113. luaG_typeerror(L, t, "index");
  114. if (ttisfunction(tm)) {
  115. callTMres(L, tm, t, key);
  116. return L->top;
  117. }
  118. else return luaV_gettable(L, tm, key, loop);
  119. }
  120. /*
  121. ** Function to index a table.
  122. ** Receives the table at `t' and the key at `key'.
  123. ** leaves the result at `res'.
  124. */
  125. const TObject *luaV_gettable (lua_State *L, const TObject *t, TObject *key,
  126. int loop) {
  127. if (loop > MAXTAGLOOP)
  128. luaG_runerror(L, "loop in gettable");
  129. if (ttistable(t)) { /* `t' is a table? */
  130. Table *h = hvalue(t);
  131. const TObject *v = luaH_get(h, key); /* do a primitive get */
  132. if (!ttisnil(v)) return v;
  133. else return luaV_index(L, t, key, loop+1);
  134. }
  135. else return luaV_getnotable(L, t, key, loop+1);
  136. }
  137. /*
  138. ** Receives table at `t', key at `key' and value at `val'.
  139. */
  140. void luaV_settable (lua_State *L, const TObject *t, TObject *key, StkId val) {
  141. const TObject *tm;
  142. int loop = 0;
  143. do {
  144. if (ttistable(t)) { /* `t' is a table? */
  145. Table *h = hvalue(t);
  146. TObject *oldval = luaH_set(L, h, key); /* do a primitive set */
  147. if (!ttisnil(oldval) || /* result is no nil? */
  148. (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */
  149. setobj2t(oldval, val); /* write barrier */
  150. return;
  151. }
  152. /* else will try the tag method */
  153. }
  154. else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
  155. luaG_typeerror(L, t, "index");
  156. if (ttisfunction(tm)) {
  157. callTM(L, tm, t, key, val);
  158. return;
  159. }
  160. t = tm; /* else repeat with `tm' */
  161. } while (++loop <= MAXTAGLOOP);
  162. luaG_runerror(L, "loop in settable");
  163. }
  164. static int call_binTM (lua_State *L, const TObject *p1, const TObject *p2,
  165. StkId res, TMS event) {
  166. ptrdiff_t result = savestack(L, res);
  167. const TObject *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */
  168. if (ttisnil(tm))
  169. tm = luaT_gettmbyobj(L, p2, event); /* try second operand */
  170. if (!ttisfunction(tm)) return 0;
  171. callTMres(L, tm, p1, p2);
  172. res = restorestack(L, result); /* previous call may change stack */
  173. setobjs2s(res, L->top);
  174. return 1;
  175. }
  176. static const TObject *get_compTM (lua_State *L, Table *mt1, Table *mt2,
  177. TMS event) {
  178. const TObject *tm1 = fasttm(L, mt1, event);
  179. const TObject *tm2;
  180. if (tm1 == NULL) return NULL; /* no metamethod */
  181. if (mt1 == mt2) return tm1; /* same metatables => same metamethods */
  182. tm2 = fasttm(L, mt2, event);
  183. if (tm2 == NULL) return NULL; /* no metamethod */
  184. if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */
  185. return tm1;
  186. return NULL;
  187. }
  188. static int call_orderTM (lua_State *L, const TObject *p1, const TObject *p2,
  189. TMS event) {
  190. const TObject *tm1 = luaT_gettmbyobj(L, p1, event);
  191. const TObject *tm2;
  192. if (ttisnil(tm1)) return -1; /* no metamethod? */
  193. tm2 = luaT_gettmbyobj(L, p2, event);
  194. if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */
  195. return -1;
  196. callTMres(L, tm1, p1, p2);
  197. return !l_isfalse(L->top);
  198. }
  199. static int luaV_strcmp (const TString *ls, const TString *rs) {
  200. const char *l = getstr(ls);
  201. size_t ll = ls->tsv.len;
  202. const char *r = getstr(rs);
  203. size_t lr = rs->tsv.len;
  204. for (;;) {
  205. int temp = strcoll(l, r);
  206. if (temp != 0) return temp;
  207. else { /* strings are equal up to a `\0' */
  208. size_t len = strlen(l); /* index of first `\0' in both strings */
  209. if (len == lr) /* r is finished? */
  210. return (len == ll) ? 0 : 1;
  211. else if (len == ll) /* l is finished? */
  212. return -1; /* l is smaller than r (because r is not finished) */
  213. /* both strings longer than `len'; go on comparing (after the `\0') */
  214. len++;
  215. l += len; ll -= len; r += len; lr -= len;
  216. }
  217. }
  218. }
  219. int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r) {
  220. int res;
  221. if (ttype(l) != ttype(r))
  222. return luaG_ordererror(L, l, r);
  223. else if (ttisnumber(l))
  224. return nvalue(l) < nvalue(r);
  225. else if (ttisstring(l))
  226. return luaV_strcmp(tsvalue(l), tsvalue(r)) < 0;
  227. else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)
  228. return res;
  229. return luaG_ordererror(L, l, r);
  230. }
  231. static int luaV_lessequal (lua_State *L, const TObject *l, const TObject *r) {
  232. int res;
  233. if (ttype(l) != ttype(r))
  234. return luaG_ordererror(L, l, r);
  235. else if (ttisnumber(l))
  236. return nvalue(l) <= nvalue(r);
  237. else if (ttisstring(l))
  238. return luaV_strcmp(tsvalue(l), tsvalue(r)) <= 0;
  239. else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */
  240. return res;
  241. else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */
  242. return !res;
  243. return luaG_ordererror(L, l, r);
  244. }
  245. int luaV_equalval (lua_State *L, const TObject *t1, const TObject *t2) {
  246. const TObject *tm;
  247. lua_assert(ttype(t1) == ttype(t2));
  248. switch (ttype(t1)) {
  249. case LUA_TNIL: return 1;
  250. case LUA_TNUMBER: return nvalue(t1) == nvalue(t2);
  251. case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */
  252. case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);
  253. case LUA_TUSERDATA: {
  254. if (uvalue(t1) == uvalue(t2)) return 1;
  255. tm = get_compTM(L, uvalue(t1)->uv.metatable, uvalue(t2)->uv.metatable,
  256. TM_EQ);
  257. break; /* will try TM */
  258. }
  259. case LUA_TTABLE: {
  260. if (hvalue(t1) == hvalue(t2)) return 1;
  261. tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ);
  262. break; /* will try TM */
  263. }
  264. default: return gcvalue(t1) == gcvalue(t2);
  265. }
  266. if (tm == NULL) return 0; /* no TM? */
  267. callTMres(L, tm, t1, t2); /* call TM */
  268. return !l_isfalse(L->top);
  269. }
  270. void luaV_concat (lua_State *L, int total, int last) {
  271. do {
  272. StkId top = L->base + last + 1;
  273. int n = 2; /* number of elements handled in this pass (at least 2) */
  274. if (!tostring(L, top-2) || !tostring(L, top-1)) {
  275. if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))
  276. luaG_concaterror(L, top-2, top-1);
  277. } else if (tsvalue(top-1)->tsv.len > 0) { /* if len=0, do nothing */
  278. /* at least two string values; get as many as possible */
  279. lu_mem tl = cast(lu_mem, tsvalue(top-1)->tsv.len) +
  280. cast(lu_mem, tsvalue(top-2)->tsv.len);
  281. char *buffer;
  282. int i;
  283. while (n < total && tostring(L, top-n-1)) { /* collect total length */
  284. tl += tsvalue(top-n-1)->tsv.len;
  285. n++;
  286. }
  287. if (tl > MAX_SIZET) luaG_runerror(L, "string size overflow");
  288. buffer = luaZ_openspace(L, &G(L)->buff, tl);
  289. tl = 0;
  290. for (i=n; i>0; i--) { /* concat all strings */
  291. size_t l = tsvalue(top-i)->tsv.len;
  292. memcpy(buffer+tl, svalue(top-i), l);
  293. tl += l;
  294. }
  295. setsvalue2s(top-n, luaS_newlstr(L, buffer, tl));
  296. }
  297. total -= n-1; /* got `n' strings to create 1 new */
  298. last -= n-1;
  299. } while (total > 1); /* repeat until only 1 result left */
  300. }
  301. static void Arith (lua_State *L, StkId ra,
  302. const TObject *rb, const TObject *rc, TMS op) {
  303. TObject tempb, tempc;
  304. const TObject *b, *c;
  305. if ((b = luaV_tonumber(rb, &tempb)) != NULL &&
  306. (c = luaV_tonumber(rc, &tempc)) != NULL) {
  307. switch (op) {
  308. case TM_ADD: setnvalue(ra, nvalue(b) + nvalue(c)); break;
  309. case TM_SUB: setnvalue(ra, nvalue(b) - nvalue(c)); break;
  310. case TM_MUL: setnvalue(ra, nvalue(b) * nvalue(c)); break;
  311. case TM_DIV: setnvalue(ra, nvalue(b) / nvalue(c)); break;
  312. case TM_POW: {
  313. const TObject *f = luaH_getstr(hvalue(gt(L)), G(L)->tmname[TM_POW]);
  314. ptrdiff_t res = savestack(L, ra);
  315. if (!ttisfunction(f))
  316. luaG_runerror(L, "`__pow' (`^' operator) is not a function");
  317. callTMres(L, f, b, c);
  318. ra = restorestack(L, res); /* previous call may change stack */
  319. setobjs2s(ra, L->top);
  320. break;
  321. }
  322. default: lua_assert(0); break;
  323. }
  324. }
  325. else if (!call_binTM(L, rb, rc, ra, op))
  326. luaG_aritherror(L, rb, rc);
  327. }
  328. /*
  329. ** some macros for common tasks in `luaV_execute'
  330. */
  331. #define runtime_check(L, c) { if (!(c)) return 0; }
  332. #define RA(i) (base+GETARG_A(i))
  333. /* to be used after possible stack reallocation */
  334. #define XRA(i) (L->base+GETARG_A(i))
  335. #define RB(i) (base+GETARG_B(i))
  336. #define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK)
  337. #define RC(i) (base+GETARG_C(i))
  338. #define RKC(i) ((GETARG_C(i) < MAXSTACK) ? RC(i) : k+GETARG_C(i)-MAXSTACK)
  339. #define KBx(i) (k+GETARG_Bx(i))
  340. #define dojump(pc, i) ((pc) += (i))
  341. StkId luaV_execute (lua_State *L) {
  342. LClosure *cl;
  343. TObject *k;
  344. const Instruction *pc;
  345. callentry: /* entry point when calling new functions */
  346. L->ci->u.l.pc = &pc;
  347. if (L->hookmask & LUA_MASKCALL)
  348. luaD_callhook(L, LUA_HOOKCALL, -1);
  349. retentry: /* entry point when returning to old functions */
  350. lua_assert(L->ci->state == CI_SAVEDPC ||
  351. L->ci->state == (CI_SAVEDPC | CI_CALLING));
  352. L->ci->state = CI_HASFRAME; /* activate frame */
  353. pc = L->ci->u.l.savedpc;
  354. cl = &clvalue(L->base - 1)->l;
  355. k = cl->p->k;
  356. /* main loop of interpreter */
  357. for (;;) {
  358. const Instruction i = *pc++;
  359. StkId base, ra;
  360. if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&
  361. (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {
  362. traceexec(L);
  363. if (L->ci->state & CI_YIELD) { /* did hook yield? */
  364. L->ci->u.l.savedpc = pc - 1;
  365. L->ci->state = CI_YIELD | CI_SAVEDPC;
  366. return NULL;
  367. }
  368. }
  369. /* warning!! several calls may realloc the stack and invalidate `ra' */
  370. base = L->base;
  371. ra = RA(i);
  372. lua_assert(L->ci->state & CI_HASFRAME);
  373. lua_assert(base == L->ci->base);
  374. lua_assert(L->top <= L->stack + L->stacksize && L->top >= base);
  375. lua_assert(L->top == L->ci->top ||
  376. GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
  377. GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO);
  378. switch (GET_OPCODE(i)) {
  379. case OP_MOVE: {
  380. setobjs2s(ra, RB(i));
  381. break;
  382. }
  383. case OP_LOADK: {
  384. setobj2s(ra, KBx(i));
  385. break;
  386. }
  387. case OP_LOADBOOL: {
  388. setbvalue(ra, GETARG_B(i));
  389. if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
  390. break;
  391. }
  392. case OP_LOADNIL: {
  393. TObject *rb = RB(i);
  394. do {
  395. setnilvalue(rb--);
  396. } while (rb >= ra);
  397. break;
  398. }
  399. case OP_GETUPVAL: {
  400. int b = GETARG_B(i);
  401. setobj2s(ra, cl->upvals[b]->v);
  402. break;
  403. }
  404. case OP_GETGLOBAL: {
  405. TObject *rb = KBx(i);
  406. const TObject *v;
  407. lua_assert(ttisstring(rb) && ttistable(&cl->g));
  408. v = luaH_getstr(hvalue(&cl->g), tsvalue(rb));
  409. if (!ttisnil(v)) { setobj2s(ra, v); }
  410. else
  411. setobj2s(XRA(i), luaV_index(L, &cl->g, rb, 0));
  412. break;
  413. }
  414. case OP_GETTABLE: {
  415. StkId rb = RB(i);
  416. TObject *rc = RKC(i);
  417. if (ttistable(rb)) {
  418. const TObject *v = luaH_get(hvalue(rb), rc);
  419. if (!ttisnil(v)) { setobj2s(ra, v); }
  420. else
  421. setobj2s(XRA(i), luaV_index(L, rb, rc, 0));
  422. }
  423. else
  424. setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0));
  425. break;
  426. }
  427. case OP_SETGLOBAL: {
  428. lua_assert(ttisstring(KBx(i)) && ttistable(&cl->g));
  429. luaV_settable(L, &cl->g, KBx(i), ra);
  430. break;
  431. }
  432. case OP_SETUPVAL: {
  433. int b = GETARG_B(i);
  434. setobj(cl->upvals[b]->v, ra); /* write barrier */
  435. break;
  436. }
  437. case OP_SETTABLE: {
  438. luaV_settable(L, ra, RKB(i), RKC(i));
  439. break;
  440. }
  441. case OP_NEWTABLE: {
  442. int b = GETARG_B(i);
  443. b = fb2int(b);
  444. sethvalue(ra, luaH_new(L, b, GETARG_C(i)));
  445. luaC_checkGC(L);
  446. break;
  447. }
  448. case OP_SELF: {
  449. StkId rb = RB(i);
  450. TObject *rc = RKC(i);
  451. runtime_check(L, ttisstring(rc));
  452. setobjs2s(ra+1, rb);
  453. if (ttistable(rb)) {
  454. const TObject *v = luaH_getstr(hvalue(rb), tsvalue(rc));
  455. if (!ttisnil(v)) { setobj2s(ra, v); }
  456. else
  457. setobj2s(XRA(i), luaV_index(L, rb, rc, 0));
  458. }
  459. else
  460. setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0));
  461. break;
  462. }
  463. case OP_ADD: {
  464. TObject *rb = RKB(i);
  465. TObject *rc = RKC(i);
  466. if (ttisnumber(rb) && ttisnumber(rc)) {
  467. setnvalue(ra, nvalue(rb) + nvalue(rc));
  468. }
  469. else
  470. Arith(L, ra, rb, rc, TM_ADD);
  471. break;
  472. }
  473. case OP_SUB: {
  474. TObject *rb = RKB(i);
  475. TObject *rc = RKC(i);
  476. if (ttisnumber(rb) && ttisnumber(rc)) {
  477. setnvalue(ra, nvalue(rb) - nvalue(rc));
  478. }
  479. else
  480. Arith(L, ra, rb, rc, TM_SUB);
  481. break;
  482. }
  483. case OP_MUL: {
  484. TObject *rb = RKB(i);
  485. TObject *rc = RKC(i);
  486. if (ttisnumber(rb) && ttisnumber(rc)) {
  487. setnvalue(ra, nvalue(rb) * nvalue(rc));
  488. }
  489. else
  490. Arith(L, ra, rb, rc, TM_MUL);
  491. break;
  492. }
  493. case OP_DIV: {
  494. TObject *rb = RKB(i);
  495. TObject *rc = RKC(i);
  496. if (ttisnumber(rb) && ttisnumber(rc)) {
  497. setnvalue(ra, nvalue(rb) / nvalue(rc));
  498. }
  499. else
  500. Arith(L, ra, rb, rc, TM_DIV);
  501. break;
  502. }
  503. case OP_POW: {
  504. Arith(L, ra, RKB(i), RKC(i), TM_POW);
  505. break;
  506. }
  507. case OP_UNM: {
  508. const TObject *rb = RB(i);
  509. TObject temp;
  510. if (tonumber(rb, &temp)) {
  511. setnvalue(ra, -nvalue(rb));
  512. }
  513. else {
  514. setnilvalue(&temp);
  515. if (!call_binTM(L, RB(i), &temp, ra, TM_UNM))
  516. luaG_aritherror(L, RB(i), &temp);
  517. }
  518. break;
  519. }
  520. case OP_NOT: {
  521. int res = l_isfalse(RB(i)); /* next assignment may change this value */
  522. setbvalue(ra, res);
  523. break;
  524. }
  525. case OP_CONCAT: {
  526. int b = GETARG_B(i);
  527. int c = GETARG_C(i);
  528. luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */
  529. base = L->base;
  530. setobjs2s(RA(i), base+b);
  531. luaC_checkGC(L);
  532. break;
  533. }
  534. case OP_JMP: {
  535. dojump(pc, GETARG_sBx(i));
  536. break;
  537. }
  538. case OP_EQ: {
  539. if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
  540. else dojump(pc, GETARG_sBx(*pc) + 1);
  541. break;
  542. }
  543. case OP_LT: {
  544. if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
  545. else dojump(pc, GETARG_sBx(*pc) + 1);
  546. break;
  547. }
  548. case OP_LE: {
  549. if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++;
  550. else dojump(pc, GETARG_sBx(*pc) + 1);
  551. break;
  552. }
  553. case OP_TEST: {
  554. TObject *rb = RB(i);
  555. if (l_isfalse(rb) == GETARG_C(i)) pc++;
  556. else {
  557. setobjs2s(ra, rb);
  558. dojump(pc, GETARG_sBx(*pc) + 1);
  559. }
  560. break;
  561. }
  562. case OP_CALL:
  563. case OP_TAILCALL: {
  564. StkId firstResult;
  565. int b = GETARG_B(i);
  566. int nresults;
  567. if (b != 0) L->top = ra+b; /* else previous instruction set top */
  568. nresults = GETARG_C(i) - 1;
  569. firstResult = luaD_precall(L, ra);
  570. if (firstResult) {
  571. if (firstResult > L->top) { /* yield? */
  572. lua_assert(L->ci->state == (CI_C | CI_YIELD));
  573. (L->ci - 1)->u.l.savedpc = pc;
  574. (L->ci - 1)->state = CI_SAVEDPC;
  575. return NULL;
  576. }
  577. /* it was a C function (`precall' called it); adjust results */
  578. luaD_poscall(L, nresults, firstResult);
  579. if (nresults >= 0) L->top = L->ci->top;
  580. }
  581. else { /* it is a Lua function */
  582. if (GET_OPCODE(i) == OP_CALL) { /* regular call? */
  583. (L->ci-1)->u.l.savedpc = pc; /* save `pc' to return later */
  584. (L->ci-1)->state = (CI_SAVEDPC | CI_CALLING);
  585. }
  586. else { /* tail call: put new frame in place of previous one */
  587. int aux;
  588. base = (L->ci - 1)->base; /* `luaD_precall' may change the stack */
  589. ra = RA(i);
  590. if (L->openupval) luaF_close(L, base);
  591. for (aux = 0; ra+aux < L->top; aux++) /* move frame down */
  592. setobjs2s(base+aux-1, ra+aux);
  593. (L->ci - 1)->top = L->top = base+aux; /* correct top */
  594. lua_assert(L->ci->state & CI_SAVEDPC);
  595. (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc;
  596. (L->ci - 1)->u.l.tailcalls++; /* one more call lost */
  597. (L->ci - 1)->state = CI_SAVEDPC;
  598. L->ci--; /* remove new frame */
  599. L->base = L->ci->base;
  600. }
  601. goto callentry;
  602. }
  603. break;
  604. }
  605. case OP_RETURN: {
  606. CallInfo *ci = L->ci - 1; /* previous function frame */
  607. int b = GETARG_B(i);
  608. if (b != 0) L->top = ra+b-1;
  609. lua_assert(L->ci->state & CI_HASFRAME);
  610. if (L->openupval) luaF_close(L, base);
  611. L->ci->state = CI_SAVEDPC; /* deactivate current function */
  612. L->ci->u.l.savedpc = pc;
  613. /* previous function was running `here'? */
  614. if (!(ci->state & CI_CALLING)) {
  615. lua_assert((ci->state & CI_C) || ci->u.l.pc != &pc);
  616. return ra; /* no: return */
  617. }
  618. else { /* yes: continue its execution */
  619. int nresults;
  620. lua_assert(ci->u.l.pc == &pc &&
  621. ttisfunction(ci->base - 1) &&
  622. (ci->state & CI_SAVEDPC));
  623. lua_assert(GET_OPCODE(*(ci->u.l.savedpc - 1)) == OP_CALL);
  624. nresults = GETARG_C(*(ci->u.l.savedpc - 1)) - 1;
  625. luaD_poscall(L, nresults, ra);
  626. if (nresults >= 0) L->top = L->ci->top;
  627. goto retentry;
  628. }
  629. }
  630. case OP_FORLOOP: {
  631. lua_Number step, idx, limit;
  632. const TObject *plimit = ra+1;
  633. const TObject *pstep = ra+2;
  634. if (!ttisnumber(ra))
  635. luaG_runerror(L, "`for' initial value must be a number");
  636. if (!tonumber(plimit, ra+1))
  637. luaG_runerror(L, "`for' limit must be a number");
  638. if (!tonumber(pstep, ra+2))
  639. luaG_runerror(L, "`for' step must be a number");
  640. step = nvalue(pstep);
  641. idx = nvalue(ra) + step; /* increment index */
  642. limit = nvalue(plimit);
  643. if (step > 0 ? idx <= limit : idx >= limit) {
  644. dojump(pc, GETARG_sBx(i)); /* jump back */
  645. chgnvalue(ra, idx); /* update index */
  646. }
  647. break;
  648. }
  649. case OP_TFORLOOP: {
  650. int nvar = GETARG_C(i) + 1;
  651. StkId cb = ra + nvar + 2; /* call base */
  652. setobjs2s(cb, ra);
  653. setobjs2s(cb+1, ra+1);
  654. setobjs2s(cb+2, ra+2);
  655. L->top = cb+3; /* func. + 2 args (state and index) */
  656. luaD_call(L, cb, nvar);
  657. L->top = L->ci->top;
  658. ra = XRA(i) + 2; /* final position of first result */
  659. cb = ra + nvar;
  660. do { /* move results to proper positions */
  661. nvar--;
  662. setobjs2s(ra+nvar, cb+nvar);
  663. } while (nvar > 0);
  664. if (ttisnil(ra)) /* break loop? */
  665. pc++; /* skip jump (break loop) */
  666. else
  667. dojump(pc, GETARG_sBx(*pc) + 1); /* jump back */
  668. break;
  669. }
  670. case OP_TFORPREP: { /* for compatibility only */
  671. if (ttistable(ra)) {
  672. setobjs2s(ra+1, ra);
  673. setobj2s(ra, luaH_getstr(hvalue(gt(L)), luaS_new(L, "next")));
  674. }
  675. dojump(pc, GETARG_sBx(i));
  676. break;
  677. }
  678. case OP_SETLIST:
  679. case OP_SETLISTO: {
  680. int bc;
  681. int n;
  682. Table *h;
  683. runtime_check(L, ttistable(ra));
  684. h = hvalue(ra);
  685. bc = GETARG_Bx(i);
  686. if (GET_OPCODE(i) == OP_SETLIST)
  687. n = (bc&(LFIELDS_PER_FLUSH-1)) + 1;
  688. else {
  689. n = L->top - ra - 1;
  690. L->top = L->ci->top;
  691. }
  692. bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */
  693. for (; n > 0; n--)
  694. setobj2t(luaH_setnum(L, h, bc+n), ra+n); /* write barrier */
  695. break;
  696. }
  697. case OP_CLOSE: {
  698. luaF_close(L, ra);
  699. break;
  700. }
  701. case OP_CLOSURE: {
  702. Proto *p;
  703. Closure *ncl;
  704. int nup, j;
  705. p = cl->p->p[GETARG_Bx(i)];
  706. nup = p->nups;
  707. ncl = luaF_newLclosure(L, nup, &cl->g);
  708. ncl->l.p = p;
  709. for (j=0; j<nup; j++, pc++) {
  710. if (GET_OPCODE(*pc) == OP_GETUPVAL)
  711. ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)];
  712. else {
  713. lua_assert(GET_OPCODE(*pc) == OP_MOVE);
  714. ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc));
  715. }
  716. }
  717. setclvalue(ra, ncl);
  718. luaC_checkGC(L);
  719. break;
  720. }
  721. }
  722. }
  723. }