2
0

lvm.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /*
  2. ** $Id: lvm.c,v 1.10 1997/10/16 10:59:34 roberto Exp roberto $
  3. ** Lua virtual machine
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "lauxlib.h"
  9. #include "ldo.h"
  10. #include "lfunc.h"
  11. #include "lgc.h"
  12. #include "lmem.h"
  13. #include "lopcodes.h"
  14. #include "lstring.h"
  15. #include "ltable.h"
  16. #include "ltm.h"
  17. #include "luadebug.h"
  18. #include "lvm.h"
  19. #define skip_word(pc) (pc+=2)
  20. #define get_word(pc) (*(pc)+(*((pc)+1)<<8))
  21. #define next_word(pc) (pc+=2, get_word(pc-2))
  22. /* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */
  23. #define EXTRA_STACK 5
  24. static TaggedString *strconc (char *l, char *r)
  25. {
  26. size_t nl = strlen(l);
  27. char *buffer = luaM_buffer(nl+strlen(r)+1);
  28. strcpy(buffer, l);
  29. strcpy(buffer+nl, r);
  30. return luaS_new(buffer);
  31. }
  32. int luaV_tonumber (TObject *obj)
  33. {
  34. double t;
  35. char c;
  36. if (ttype(obj) != LUA_T_STRING)
  37. return 1;
  38. else if (sscanf(svalue(obj), "%lf %c",&t, &c) == 1) {
  39. nvalue(obj) = (real)t;
  40. ttype(obj) = LUA_T_NUMBER;
  41. return 0;
  42. }
  43. else
  44. return 2;
  45. }
  46. int luaV_tostring (TObject *obj)
  47. {
  48. if (ttype(obj) != LUA_T_NUMBER)
  49. return 1;
  50. else {
  51. char s[60];
  52. real f = nvalue(obj);
  53. int i;
  54. if ((real)(-MAX_INT) <= f && f <= (real)MAX_INT && (real)(i=(int)f) == f)
  55. sprintf (s, "%d", i);
  56. else
  57. sprintf (s, "%g", (double)nvalue(obj));
  58. tsvalue(obj) = luaS_new(s);
  59. ttype(obj) = LUA_T_STRING;
  60. return 0;
  61. }
  62. }
  63. void luaV_closure (int nelems)
  64. {
  65. Closure *c = luaF_newclosure(nelems);
  66. c->consts[0] = *(luaD_stack.top-1);
  67. memcpy(&c->consts[1], luaD_stack.top-(nelems+1), nelems*sizeof(TObject));
  68. luaD_stack.top -= nelems;
  69. ttype(luaD_stack.top-1) = LUA_T_FUNCTION;
  70. (luaD_stack.top-1)->value.cl = c;
  71. }
  72. /*
  73. ** Function to index a table.
  74. ** Receives the table at top-2 and the index at top-1.
  75. */
  76. void luaV_gettable (void)
  77. {
  78. TObject *im;
  79. if (ttype(luaD_stack.top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */
  80. im = luaT_getimbyObj(luaD_stack.top-2, IM_GETTABLE);
  81. else { /* object is a table... */
  82. int tg = (luaD_stack.top-2)->value.a->htag;
  83. im = luaT_getim(tg, IM_GETTABLE);
  84. if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */
  85. TObject *h = luaH_get(avalue(luaD_stack.top-2), luaD_stack.top-1);
  86. if (h != NULL && ttype(h) != LUA_T_NIL) {
  87. --luaD_stack.top;
  88. *(luaD_stack.top-1) = *h;
  89. }
  90. else if (ttype(im=luaT_getim(tg, IM_INDEX)) != LUA_T_NIL)
  91. luaD_callTM(im, 2, 1);
  92. else {
  93. --luaD_stack.top;
  94. ttype(luaD_stack.top-1) = LUA_T_NIL;
  95. }
  96. return;
  97. }
  98. /* else it has a "gettable" method, go through to next command */
  99. }
  100. /* object is not a table, or it has a "gettable" method */
  101. if (ttype(im) != LUA_T_NIL)
  102. luaD_callTM(im, 2, 1);
  103. else
  104. lua_error("indexed expression not a table");
  105. }
  106. /*
  107. ** Function to store indexed based on values at the luaD_stack.top
  108. ** mode = 0: raw store (without internal methods)
  109. ** mode = 1: normal store (with internal methods)
  110. ** mode = 2: "deep luaD_stack.stack" store (with internal methods)
  111. */
  112. void luaV_settable (TObject *t, int mode)
  113. {
  114. TObject *im = (mode == 0) ? NULL : luaT_getimbyObj(t, IM_SETTABLE);
  115. if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) {
  116. TObject *h = luaH_set(avalue(t), t+1);
  117. *h = *(luaD_stack.top-1);
  118. luaD_stack.top -= (mode == 2) ? 1 : 3;
  119. }
  120. else { /* object is not a table, and/or has a specific "settable" method */
  121. if (im && ttype(im) != LUA_T_NIL) {
  122. if (mode == 2) {
  123. *(luaD_stack.top+1) = *(luaD_stack.top-1);
  124. *(luaD_stack.top) = *(t+1);
  125. *(luaD_stack.top-1) = *t;
  126. luaD_stack.top += 2; /* WARNING: caller must assure stack space */
  127. }
  128. luaD_callTM(im, 3, 0);
  129. }
  130. else
  131. lua_error("indexed expression not a table");
  132. }
  133. }
  134. void luaV_getglobal (TaggedString *ts)
  135. {
  136. /* WARNING: caller must assure stack space */
  137. TObject *value = &ts->u.globalval;
  138. TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL);
  139. if (ttype(im) == LUA_T_NIL) { /* default behavior */
  140. *luaD_stack.top++ = *value;
  141. }
  142. else {
  143. ttype(luaD_stack.top) = LUA_T_STRING;
  144. tsvalue(luaD_stack.top) = ts;
  145. luaD_stack.top++;
  146. *luaD_stack.top++ = *value;
  147. luaD_callTM(im, 2, 1);
  148. }
  149. }
  150. void luaV_setglobal (TaggedString *ts)
  151. {
  152. TObject *oldvalue = &ts->u.globalval;
  153. TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL);
  154. if (ttype(im) == LUA_T_NIL) /* default behavior */
  155. luaS_rawsetglobal(ts, --luaD_stack.top);
  156. else {
  157. /* WARNING: caller must assure stack space */
  158. TObject newvalue = *(luaD_stack.top-1);
  159. ttype(luaD_stack.top-1) = LUA_T_STRING;
  160. tsvalue(luaD_stack.top-1) = ts;
  161. *luaD_stack.top++ = *oldvalue;
  162. *luaD_stack.top++ = newvalue;
  163. luaD_callTM(im, 3, 0);
  164. }
  165. }
  166. static void call_binTM (IMS event, char *msg)
  167. {
  168. TObject *im = luaT_getimbyObj(luaD_stack.top-2, event);/* try first operand */
  169. if (ttype(im) == LUA_T_NIL) {
  170. im = luaT_getimbyObj(luaD_stack.top-1, event); /* try second operand */
  171. if (ttype(im) == LUA_T_NIL) {
  172. im = luaT_getim(0, event); /* try a 'global' i.m. */
  173. if (ttype(im) == LUA_T_NIL)
  174. lua_error(msg);
  175. }
  176. }
  177. lua_pushstring(luaT_eventname[event]);
  178. luaD_callTM(im, 3, 1);
  179. }
  180. static void call_arith (IMS event)
  181. {
  182. call_binTM(event, "unexpected type at arithmetic operation");
  183. }
  184. static void comparison (lua_Type ttype_less, lua_Type ttype_equal,
  185. lua_Type ttype_great, IMS op)
  186. {
  187. TObject *l = luaD_stack.top-2;
  188. TObject *r = luaD_stack.top-1;
  189. int result;
  190. if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER)
  191. result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1;
  192. else if (ttype(l) == LUA_T_STRING && ttype(r) == LUA_T_STRING)
  193. result = strcoll(svalue(l), svalue(r));
  194. else {
  195. call_binTM(op, "unexpected type at comparison");
  196. return;
  197. }
  198. luaD_stack.top--;
  199. nvalue(luaD_stack.top-1) = 1;
  200. ttype(luaD_stack.top-1) = (result < 0) ? ttype_less :
  201. (result == 0) ? ttype_equal : ttype_great;
  202. }
  203. void luaV_pack (StkId firstel, int nvararg, TObject *tab)
  204. {
  205. TObject *firstelem = luaD_stack.stack+firstel;
  206. int i;
  207. if (nvararg < 0) nvararg = 0;
  208. avalue(tab) = luaH_new(nvararg+1); /* +1 for field 'n' */
  209. ttype(tab) = LUA_T_ARRAY;
  210. for (i=0; i<nvararg; i++) {
  211. TObject index;
  212. ttype(&index) = LUA_T_NUMBER;
  213. nvalue(&index) = i+1;
  214. *(luaH_set(avalue(tab), &index)) = *(firstelem+i);
  215. }
  216. /* store counter in field "n" */ {
  217. TObject index, extra;
  218. ttype(&index) = LUA_T_STRING;
  219. tsvalue(&index) = luaS_new("n");
  220. ttype(&extra) = LUA_T_NUMBER;
  221. nvalue(&extra) = nvararg;
  222. *(luaH_set(avalue(tab), &index)) = extra;
  223. }
  224. }
  225. static void adjust_varargs (StkId first_extra_arg)
  226. {
  227. TObject arg;
  228. luaV_pack(first_extra_arg,
  229. (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg);
  230. luaD_adjusttop(first_extra_arg);
  231. *luaD_stack.top++ = arg;
  232. }
  233. /*
  234. ** Execute the given opcode, until a RET. Parameters are between
  235. ** [luaD_stack.stack+base,luaD_stack.top). Returns n such that the the results are between
  236. ** [luaD_stack.stack+n,luaD_stack.top).
  237. */
  238. StkId luaV_execute (Closure *cl, StkId base)
  239. {
  240. Byte *pc = cl->consts[0].value.tf->code;
  241. TObject *consts = cl->consts[0].value.tf->consts;
  242. if (lua_callhook)
  243. luaD_callHook(base, LUA_T_MARK, 0);
  244. luaD_checkstack((*pc++)+EXTRA_STACK);
  245. while (1) {
  246. int aux;
  247. switch ((OpCode)(aux = *pc++)) {
  248. case PUSHNIL0:
  249. ttype(luaD_stack.top++) = LUA_T_NIL;
  250. break;
  251. case PUSHNIL:
  252. aux = *pc++;
  253. do {
  254. ttype(luaD_stack.top++) = LUA_T_NIL;
  255. } while (aux--);
  256. break;
  257. case PUSHNUMBER:
  258. aux = *pc++; goto pushnumber;
  259. case PUSHNUMBERW:
  260. aux = next_word(pc); goto pushnumber;
  261. case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2:
  262. aux -= PUSHNUMBER0;
  263. pushnumber:
  264. ttype(luaD_stack.top) = LUA_T_NUMBER;
  265. nvalue(luaD_stack.top) = aux;
  266. luaD_stack.top++;
  267. break;
  268. case PUSHLOCAL:
  269. aux = *pc++; goto pushlocal;
  270. case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3:
  271. case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
  272. aux -= PUSHLOCAL0;
  273. pushlocal:
  274. *luaD_stack.top++ = *((luaD_stack.stack+base) + aux);
  275. break;
  276. case GETGLOBALW:
  277. aux = next_word(pc); goto getglobal;
  278. case GETGLOBAL:
  279. aux = *pc++; goto getglobal;
  280. case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2: case GETGLOBAL3:
  281. case GETGLOBAL4: case GETGLOBAL5: case GETGLOBAL6: case GETGLOBAL7:
  282. aux -= GETGLOBAL0;
  283. getglobal:
  284. luaV_getglobal(tsvalue(&consts[aux]));
  285. break;
  286. case GETTABLE:
  287. luaV_gettable();
  288. break;
  289. case PUSHSELFW:
  290. aux = next_word(pc); goto pushself;
  291. case PUSHSELF:
  292. aux = *pc++;
  293. pushself: {
  294. TObject receiver = *(luaD_stack.top-1);
  295. *luaD_stack.top++ = consts[aux];
  296. luaV_gettable();
  297. *luaD_stack.top++ = receiver;
  298. break;
  299. }
  300. case PUSHCONSTANTW:
  301. aux = next_word(pc); goto pushconstant;
  302. case PUSHCONSTANT:
  303. aux = *pc++; goto pushconstant;
  304. case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2:
  305. case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5:
  306. case PUSHCONSTANT6: case PUSHCONSTANT7:
  307. aux -= PUSHCONSTANT0;
  308. pushconstant:
  309. *luaD_stack.top++ = consts[aux];
  310. break;
  311. case PUSHUPVALUE:
  312. aux = *pc++; goto pushupvalue;
  313. case PUSHUPVALUE0: case PUSHUPVALUE1:
  314. aux -= PUSHUPVALUE0;
  315. pushupvalue:
  316. *luaD_stack.top++ = cl->consts[aux+1];
  317. break;
  318. case SETLOCAL:
  319. aux = *pc++; goto setlocal;
  320. case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: case SETLOCAL3:
  321. case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7:
  322. aux -= SETLOCAL0;
  323. setlocal:
  324. *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top);
  325. break;
  326. case SETGLOBALW:
  327. aux = next_word(pc); goto setglobal;
  328. case SETGLOBAL:
  329. aux = *pc++; goto setglobal;
  330. case SETGLOBAL0: case SETGLOBAL1: case SETGLOBAL2: case SETGLOBAL3:
  331. case SETGLOBAL4: case SETGLOBAL5: case SETGLOBAL6: case SETGLOBAL7:
  332. aux -= SETGLOBAL0;
  333. setglobal:
  334. luaV_setglobal(tsvalue(&consts[aux]));
  335. break;
  336. case SETTABLE0:
  337. luaV_settable(luaD_stack.top-3, 1);
  338. break;
  339. case SETTABLE:
  340. luaV_settable(luaD_stack.top-3-(*pc++), 2);
  341. break;
  342. case SETLISTW:
  343. aux = next_word(pc); aux *= LFIELDS_PER_FLUSH; goto setlist;
  344. case SETLIST:
  345. aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist;
  346. case SETLIST0:
  347. aux = 0;
  348. setlist: {
  349. int n = *(pc++);
  350. TObject *arr = luaD_stack.top-n-1;
  351. for (; n; n--) {
  352. ttype(luaD_stack.top) = LUA_T_NUMBER;
  353. nvalue(luaD_stack.top) = n+aux;
  354. *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1);
  355. luaD_stack.top--;
  356. }
  357. break;
  358. }
  359. case SETMAP0:
  360. aux = 0; goto setmap;
  361. case SETMAP:
  362. aux = *pc++;
  363. setmap: {
  364. TObject *arr = luaD_stack.top-(2*aux)-3;
  365. do {
  366. *(luaH_set (avalue(arr), luaD_stack.top-2)) = *(luaD_stack.top-1);
  367. luaD_stack.top-=2;
  368. } while (aux--);
  369. break;
  370. }
  371. case POP:
  372. aux = *pc++; goto pop;
  373. case POP0: case POP1:
  374. aux -= POP0;
  375. pop:
  376. luaD_stack.top -= (aux+1);
  377. break;
  378. case ARGS:
  379. luaD_adjusttop(base+(*pc++));
  380. break;
  381. case VARARGS:
  382. luaC_checkGC();
  383. adjust_varargs(base+(*pc++));
  384. break;
  385. case CREATEARRAYW:
  386. aux = next_word(pc); goto createarray;
  387. case CREATEARRAY0: case CREATEARRAY1:
  388. aux -= CREATEARRAY0; goto createarray;
  389. case CREATEARRAY:
  390. aux = *pc++;
  391. createarray:
  392. luaC_checkGC();
  393. avalue(luaD_stack.top) = luaH_new(aux);
  394. ttype(luaD_stack.top) = LUA_T_ARRAY;
  395. luaD_stack.top++;
  396. break;
  397. case EQOP: case NEQOP: {
  398. int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1);
  399. luaD_stack.top--;
  400. if (aux == NEQOP) res = !res;
  401. ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL;
  402. nvalue(luaD_stack.top-1) = 1;
  403. break;
  404. }
  405. case LTOP:
  406. comparison(LUA_T_NUMBER, LUA_T_NIL, LUA_T_NIL, IM_LT);
  407. break;
  408. case LEOP:
  409. comparison(LUA_T_NUMBER, LUA_T_NUMBER, LUA_T_NIL, IM_LE);
  410. break;
  411. case GTOP:
  412. comparison(LUA_T_NIL, LUA_T_NIL, LUA_T_NUMBER, IM_GT);
  413. break;
  414. case GEOP:
  415. comparison(LUA_T_NIL, LUA_T_NUMBER, LUA_T_NUMBER, IM_GE);
  416. break;
  417. case ADDOP: {
  418. TObject *l = luaD_stack.top-2;
  419. TObject *r = luaD_stack.top-1;
  420. if (tonumber(r) || tonumber(l))
  421. call_arith(IM_ADD);
  422. else {
  423. nvalue(l) += nvalue(r);
  424. --luaD_stack.top;
  425. }
  426. break;
  427. }
  428. case SUBOP: {
  429. TObject *l = luaD_stack.top-2;
  430. TObject *r = luaD_stack.top-1;
  431. if (tonumber(r) || tonumber(l))
  432. call_arith(IM_SUB);
  433. else {
  434. nvalue(l) -= nvalue(r);
  435. --luaD_stack.top;
  436. }
  437. break;
  438. }
  439. case MULTOP: {
  440. TObject *l = luaD_stack.top-2;
  441. TObject *r = luaD_stack.top-1;
  442. if (tonumber(r) || tonumber(l))
  443. call_arith(IM_MUL);
  444. else {
  445. nvalue(l) *= nvalue(r);
  446. --luaD_stack.top;
  447. }
  448. break;
  449. }
  450. case DIVOP: {
  451. TObject *l = luaD_stack.top-2;
  452. TObject *r = luaD_stack.top-1;
  453. if (tonumber(r) || tonumber(l))
  454. call_arith(IM_DIV);
  455. else {
  456. nvalue(l) /= nvalue(r);
  457. --luaD_stack.top;
  458. }
  459. break;
  460. }
  461. case POWOP:
  462. call_arith(IM_POW);
  463. break;
  464. case CONCOP: {
  465. TObject *l = luaD_stack.top-2;
  466. TObject *r = luaD_stack.top-1;
  467. if (tostring(l) || tostring(r))
  468. call_binTM(IM_CONCAT, "unexpected type for concatenation");
  469. else {
  470. tsvalue(l) = strconc(svalue(l), svalue(r));
  471. --luaD_stack.top;
  472. }
  473. luaC_checkGC();
  474. break;
  475. }
  476. case MINUSOP:
  477. if (tonumber(luaD_stack.top-1)) {
  478. ttype(luaD_stack.top) = LUA_T_NIL;
  479. luaD_stack.top++;
  480. call_arith(IM_UNM);
  481. }
  482. else
  483. nvalue(luaD_stack.top-1) = - nvalue(luaD_stack.top-1);
  484. break;
  485. case NOTOP:
  486. ttype(luaD_stack.top-1) =
  487. (ttype(luaD_stack.top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL;
  488. nvalue(luaD_stack.top-1) = 1;
  489. break;
  490. case ONTJMPW:
  491. aux = next_word(pc); goto ontjmp;
  492. case ONTJMP:
  493. aux = *pc++;
  494. ontjmp:
  495. if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux;
  496. else luaD_stack.top--;
  497. break;
  498. case ONFJMPW:
  499. aux = next_word(pc); goto onfjmp;
  500. case ONFJMP:
  501. aux = *pc++;
  502. onfjmp:
  503. if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux;
  504. else luaD_stack.top--;
  505. break;
  506. case JMPW:
  507. aux = next_word(pc); goto jmp;
  508. case JMP:
  509. aux = *pc++;
  510. jmp:
  511. pc += aux;
  512. break;
  513. case IFFJMPW:
  514. aux = next_word(pc); goto iffjmp;
  515. case IFFJMP:
  516. aux = *pc++;
  517. iffjmp:
  518. if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux;
  519. break;
  520. case IFTUPJMPW:
  521. aux = next_word(pc); goto iftupjmp;
  522. case IFTUPJMP:
  523. aux = *pc++;
  524. iftupjmp:
  525. if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux;
  526. break;
  527. case IFFUPJMPW:
  528. aux = next_word(pc); goto iffupjmp;
  529. case IFFUPJMP:
  530. aux = *pc++;
  531. iffupjmp:
  532. if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux;
  533. break;
  534. case CLOSURE:
  535. aux = *pc++; goto closure;
  536. case CLOSURE0: case CLOSURE1:
  537. aux -= CLOSURE0;
  538. closure:
  539. luaV_closure(aux);
  540. luaC_checkGC();
  541. break;
  542. case CALLFUNC:
  543. aux = *pc++; goto callfunc;
  544. case CALLFUNC0: case CALLFUNC1:
  545. aux -= CALLFUNC0;
  546. callfunc: {
  547. StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++);
  548. luaD_call(newBase, aux);
  549. break;
  550. }
  551. case ENDCODE:
  552. luaD_stack.top = luaD_stack.stack + base;
  553. /* goes through */
  554. case RETCODE:
  555. if (lua_callhook)
  556. luaD_callHook(base, LUA_T_MARK, 1);
  557. return (base + ((aux==RETCODE) ? *pc : 0));
  558. case SETLINEW:
  559. aux = next_word(pc); goto setline;
  560. case SETLINE:
  561. aux = *pc++;
  562. setline:
  563. if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) {
  564. /* open space for LINE value */
  565. luaD_openstack((luaD_stack.top-luaD_stack.stack)-base);
  566. base++;
  567. (luaD_stack.stack+base-1)->ttype = LUA_T_LINE;
  568. }
  569. (luaD_stack.stack+base-1)->value.i = aux;
  570. if (lua_linehook)
  571. luaD_lineHook(aux);
  572. break;
  573. #ifdef DEBUG
  574. default:
  575. lua_error("internal error - opcode doesn't match");
  576. #endif
  577. }
  578. }
  579. }