lvm.c 16 KB

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