lua.stx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. %{
  2. char *rcs_luastx = "$Id: lua.stx,v 1.2 1993/12/22 21:19:23 roberto Exp roberto $";
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "opcode.h"
  7. #include "hash.h"
  8. #include "inout.h"
  9. #include "table.h"
  10. #include "lua.h"
  11. #ifndef ALIGNMENT
  12. #define ALIGNMENT (sizeof(void *))
  13. #endif
  14. #ifndef MAXCODE
  15. #define MAXCODE 1024
  16. #endif
  17. static long buffer[MAXCODE];
  18. static Byte *code = (Byte *)buffer;
  19. static long mainbuffer[MAXCODE];
  20. static Byte *maincode = (Byte *)mainbuffer;
  21. static Byte *basepc;
  22. static Byte *pc;
  23. #define MAXVAR 32
  24. static long varbuffer[MAXVAR];
  25. static Byte nvarbuffer=0; /* number of variables at a list */
  26. static Word localvar[STACKGAP];
  27. static Byte nlocalvar=0; /* number of local variables */
  28. static int ntemp; /* number of temporary var into stack */
  29. static int err; /* flag to indicate error */
  30. /* Internal functions */
  31. #define align(n) align_n(sizeof(n))
  32. static void code_byte (Byte c)
  33. {
  34. if (pc-basepc>MAXCODE-1)
  35. {
  36. lua_error ("code buffer overflow");
  37. err = 1;
  38. }
  39. *pc++ = c;
  40. }
  41. static void code_word (Word n)
  42. {
  43. if (pc-basepc>MAXCODE-sizeof(Word))
  44. {
  45. lua_error ("code buffer overflow");
  46. err = 1;
  47. }
  48. *((Word *)pc) = n;
  49. pc += sizeof(Word);
  50. }
  51. static void code_float (float n)
  52. {
  53. if (pc-basepc>MAXCODE-sizeof(float))
  54. {
  55. lua_error ("code buffer overflow");
  56. err = 1;
  57. }
  58. *((float *)pc) = n;
  59. pc += sizeof(float);
  60. }
  61. static void incr_ntemp (void)
  62. {
  63. if (ntemp+nlocalvar+MAXVAR+1 < STACKGAP)
  64. ntemp++;
  65. else
  66. {
  67. lua_error ("stack overflow");
  68. err = 1;
  69. }
  70. }
  71. static void add_nlocalvar (int n)
  72. {
  73. if (ntemp+nlocalvar+MAXVAR+n < STACKGAP)
  74. nlocalvar += n;
  75. else
  76. {
  77. lua_error ("too many local variables or expression too complicate");
  78. err = 1;
  79. }
  80. }
  81. static void incr_nvarbuffer (void)
  82. {
  83. if (nvarbuffer < MAXVAR-1)
  84. nvarbuffer++;
  85. else
  86. {
  87. lua_error ("variable buffer overflow");
  88. err = 1;
  89. }
  90. }
  91. static void align_n (unsigned size)
  92. {
  93. if (size > ALIGNMENT) size = ALIGNMENT;
  94. while (((pc+1-code)%size) != 0) /* +1 to include BYTECODE */
  95. code_byte (NOP);
  96. }
  97. static void code_number (float f)
  98. { Word i = (Word)f;
  99. if (f == (float)i) /* f has an (short) integer value */
  100. {
  101. if (i <= 2) code_byte(PUSH0 + i);
  102. else if (i <= 255)
  103. {
  104. code_byte(PUSHBYTE);
  105. code_byte(i);
  106. }
  107. else
  108. {
  109. align(Word);
  110. code_byte(PUSHWORD);
  111. code_word(i);
  112. }
  113. }
  114. else
  115. {
  116. align(float);
  117. code_byte(PUSHFLOAT);
  118. code_float(f);
  119. }
  120. incr_ntemp();
  121. }
  122. %}
  123. %union
  124. {
  125. int vInt;
  126. long vLong;
  127. float vFloat;
  128. Word vWord;
  129. Byte *pByte;
  130. }
  131. %start functionlist
  132. %token WRONGTOKEN
  133. %token NIL
  134. %token IF THEN ELSE ELSEIF WHILE DO REPEAT UNTIL END
  135. %token RETURN
  136. %token LOCAL
  137. %token <vFloat> NUMBER
  138. %token <vWord> FUNCTION NAME STRING
  139. %token <vInt> DEBUG
  140. %type <pByte> PrepJump
  141. %type <vInt> expr, exprlist, exprlist1, varlist1, typeconstructor
  142. %type <vInt> fieldlist, localdeclist
  143. %type <vInt> ffieldlist, ffieldlist1
  144. %type <vInt> lfieldlist, lfieldlist1
  145. %type <vLong> var, objectname
  146. %left AND OR
  147. %left '=' NE '>' '<' LE GE
  148. %left CONC
  149. %left '+' '-'
  150. %left '*' '/'
  151. %left UNARY NOT
  152. %% /* beginning of rules section */
  153. functionlist : /* empty */
  154. | functionlist {pc=basepc=maincode; nlocalvar=0;} stat sc {maincode=pc;}
  155. | functionlist function
  156. | functionlist setdebug
  157. ;
  158. function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
  159. {
  160. if (lua_debug)
  161. {
  162. align(Word);
  163. code_byte(SETFUNCTION);
  164. code_word($1);
  165. code_word($2);
  166. }
  167. lua_codeadjust (0);
  168. }
  169. block
  170. END
  171. {
  172. if (lua_debug) code_byte(RESET);
  173. code_byte(RETCODE); code_byte(nlocalvar);
  174. s_tag($2) = T_FUNCTION;
  175. s_bvalue($2) = calloc (pc-code, sizeof(Byte));
  176. memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte));
  177. }
  178. ;
  179. statlist : /* empty */
  180. | statlist stat sc
  181. ;
  182. stat : {
  183. ntemp = 0;
  184. if (lua_debug)
  185. {
  186. align(Word); code_byte(SETLINE); code_word(lua_linenumber);
  187. }
  188. }
  189. stat1
  190. sc : /* empty */ | ';' ;
  191. stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
  192. {
  193. {
  194. Byte *elseinit = $6 + sizeof(Word)+1;
  195. if (pc - elseinit == 0) /* no else */
  196. {
  197. pc -= sizeof(Word)+1;
  198. /* if (*(pc-1) == NOP) --pc; */
  199. elseinit = pc;
  200. }
  201. else
  202. {
  203. *($6) = JMP;
  204. *((Word *)($6+1)) = pc - elseinit;
  205. }
  206. *($4) = IFFJMP;
  207. *((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1);
  208. }
  209. }
  210. | WHILE {$<pByte>$ = pc;} expr1 DO PrepJump block PrepJump END
  211. {
  212. *($5) = IFFJMP;
  213. *((Word *)($5+1)) = pc - ($5 + sizeof(Word)+1);
  214. *($7) = UPJMP;
  215. *((Word *)($7+1)) = pc - $<pByte>2;
  216. }
  217. | REPEAT {$<pByte>$ = pc;} block UNTIL expr1 PrepJump
  218. {
  219. *($6) = IFFUPJMP;
  220. *((Word *)($6+1)) = pc - $<pByte>2;
  221. }
  222. | varlist1 '=' exprlist1
  223. {
  224. {
  225. int i;
  226. if ($3 == 0 || nvarbuffer != ntemp - $1 * 2)
  227. lua_codeadjust ($1 * 2 + nvarbuffer);
  228. for (i=nvarbuffer-1; i>=0; i--)
  229. lua_codestore (i);
  230. if ($1 > 1 || ($1 == 1 && varbuffer[0] != 0))
  231. lua_codeadjust (0);
  232. }
  233. }
  234. | functioncall { lua_codeadjust (0); }
  235. | typeconstructor { lua_codeadjust (0); }
  236. | LOCAL localdeclist decinit { add_nlocalvar($2); lua_codeadjust (0); }
  237. ;
  238. elsepart : /* empty */
  239. | ELSE block
  240. | ELSEIF expr1 THEN PrepJump block PrepJump elsepart
  241. {
  242. {
  243. Byte *elseinit = $6 + sizeof(Word)+1;
  244. if (pc - elseinit == 0) /* no else */
  245. {
  246. pc -= sizeof(Word)+1;
  247. /* if (*(pc-1) == NOP) --pc; */
  248. elseinit = pc;
  249. }
  250. else
  251. {
  252. *($6) = JMP;
  253. *((Word *)($6+1)) = pc - elseinit;
  254. }
  255. *($4) = IFFJMP;
  256. *((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1);
  257. }
  258. }
  259. ;
  260. block : {$<vInt>$ = nlocalvar;} statlist {ntemp = 0;} ret
  261. {
  262. if (nlocalvar != $<vInt>1)
  263. {
  264. nlocalvar = $<vInt>1;
  265. lua_codeadjust (0);
  266. }
  267. }
  268. ;
  269. ret : /* empty */
  270. | { if (lua_debug){align(Word);code_byte(SETLINE);code_word(lua_linenumber);}}
  271. RETURN exprlist sc
  272. {
  273. if (lua_debug) code_byte(RESET);
  274. code_byte(RETCODE); code_byte(nlocalvar);
  275. }
  276. ;
  277. PrepJump : /* empty */
  278. {
  279. align(Word);
  280. $$ = pc;
  281. code_byte(0); /* open space */
  282. code_word (0);
  283. }
  284. expr1 : expr { if ($1 == 0) {lua_codeadjust (ntemp+1); incr_ntemp();}}
  285. ;
  286. expr : '(' expr ')' { $$ = $2; }
  287. | expr1 '=' expr1 { code_byte(EQOP); $$ = 1; ntemp--;}
  288. | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; ntemp--;}
  289. | expr1 '>' expr1 { code_byte(LEOP); code_byte(NOTOP); $$ = 1; ntemp--;}
  290. | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; ntemp--;}
  291. | expr1 LE expr1 { code_byte(LEOP); $$ = 1; ntemp--;}
  292. | expr1 GE expr1 { code_byte(LTOP); code_byte(NOTOP); $$ = 1; ntemp--;}
  293. | expr1 '+' expr1 { code_byte(ADDOP); $$ = 1; ntemp--;}
  294. | expr1 '-' expr1 { code_byte(SUBOP); $$ = 1; ntemp--;}
  295. | expr1 '*' expr1 { code_byte(MULTOP); $$ = 1; ntemp--;}
  296. | expr1 '/' expr1 { code_byte(DIVOP); $$ = 1; ntemp--;}
  297. | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; ntemp--;}
  298. | '+' expr1 %prec UNARY { $$ = 1; }
  299. | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;}
  300. | typeconstructor { $$ = $1; }
  301. | '@' '(' dimension ')'
  302. {
  303. code_byte(CREATEARRAY);
  304. $$ = 1;
  305. }
  306. | var { lua_pushvar ($1); $$ = 1;}
  307. | NUMBER { code_number($1); $$ = 1; }
  308. | STRING
  309. {
  310. align(Word);
  311. code_byte(PUSHSTRING);
  312. code_word($1);
  313. $$ = 1;
  314. incr_ntemp();
  315. }
  316. | NIL {code_byte(PUSHNIL); $$ = 1; incr_ntemp();}
  317. | functioncall
  318. {
  319. $$ = 0;
  320. if (lua_debug)
  321. {
  322. align(Word); code_byte(SETLINE); code_word(lua_linenumber);
  323. }
  324. }
  325. | NOT expr1 { code_byte(NOTOP); $$ = 1;}
  326. | expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1
  327. {
  328. *($3) = ONFJMP;
  329. *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1);
  330. $$ = 1;
  331. }
  332. | expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1
  333. {
  334. *($3) = ONTJMP;
  335. *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1);
  336. $$ = 1;
  337. }
  338. ;
  339. typeconstructor: '@'
  340. {
  341. code_byte(PUSHBYTE);
  342. $<pByte>$ = pc; code_byte(0);
  343. incr_ntemp();
  344. code_byte(CREATEARRAY);
  345. }
  346. objectname fieldlist
  347. {
  348. *($<pByte>2) = $4;
  349. if ($3 < 0) /* there is no function to be called */
  350. {
  351. $$ = 1;
  352. }
  353. else
  354. {
  355. lua_pushvar ($3+1);
  356. code_byte(PUSHMARK);
  357. incr_ntemp();
  358. code_byte(PUSHOBJECT);
  359. incr_ntemp();
  360. code_byte(CALLFUNC);
  361. ntemp -= 4;
  362. $$ = 0;
  363. if (lua_debug)
  364. {
  365. align(Word); code_byte(SETLINE); code_word(lua_linenumber);
  366. }
  367. }
  368. }
  369. ;
  370. dimension : /* empty */ { code_byte(PUSHNIL); incr_ntemp();}
  371. | expr1
  372. ;
  373. functioncall : functionvalue {code_byte(PUSHMARK); $<vInt>$ = ntemp; incr_ntemp();}
  374. '(' exprlist ')' { code_byte(CALLFUNC); ntemp = $<vInt>2-1;}
  375. functionvalue : var {lua_pushvar ($1); }
  376. ;
  377. exprlist : /* empty */ { $$ = 1; }
  378. | exprlist1 { $$ = $1; }
  379. ;
  380. exprlist1 : expr { $$ = $1; }
  381. | exprlist1 ',' {if (!$1){lua_codeadjust (ntemp+1); incr_ntemp();}}
  382. expr {$$ = $4;}
  383. ;
  384. parlist : /* empty */
  385. | parlist1
  386. ;
  387. parlist1 : NAME {localvar[nlocalvar]=$1; add_nlocalvar(1);}
  388. | parlist1 ',' NAME {localvar[nlocalvar]=$3; add_nlocalvar(1);}
  389. ;
  390. objectname : /* empty */ {$$=-1;}
  391. | NAME {$$=$1;}
  392. ;
  393. fieldlist : '{' ffieldlist '}' { $$ = $2; }
  394. | '[' lfieldlist ']' { $$ = $2; }
  395. ;
  396. ffieldlist : /* empty */ { $$ = 0; }
  397. | ffieldlist1 { $$ = $1; }
  398. ;
  399. ffieldlist1 : ffield {$$=1;}
  400. | ffieldlist1 ',' ffield {$$=$1+1;}
  401. ;
  402. ffield : NAME
  403. {
  404. align(Word);
  405. code_byte(PUSHSTRING);
  406. code_word(lua_findconstant (s_name($1)));
  407. incr_ntemp();
  408. }
  409. '=' expr1
  410. {
  411. code_byte(STOREFIELD);
  412. ntemp-=2;
  413. }
  414. ;
  415. lfieldlist : /* empty */ { $$ = 0; }
  416. | lfieldlist1 { $$ = $1; }
  417. ;
  418. lfieldlist1 : { code_number(1); } lfield {$$=1;}
  419. | lfieldlist1 ',' { code_number($1+1); } lfield
  420. {$$=$1+1;}
  421. ;
  422. lfield : expr1
  423. {
  424. code_byte(STOREFIELD);
  425. ntemp-=2;
  426. }
  427. ;
  428. varlist1 : var
  429. {
  430. nvarbuffer = 0;
  431. varbuffer[nvarbuffer] = $1; incr_nvarbuffer();
  432. $$ = ($1 == 0) ? 1 : 0;
  433. }
  434. | varlist1 ',' var
  435. {
  436. varbuffer[nvarbuffer] = $3; incr_nvarbuffer();
  437. $$ = ($3 == 0) ? $1 + 1 : $1;
  438. }
  439. ;
  440. var : NAME
  441. {
  442. int local = lua_localname ($1);
  443. if (local == -1) /* global var */
  444. $$ = $1 + 1; /* return positive value */
  445. else
  446. $$ = -(local+1); /* return negative value */
  447. }
  448. | var {lua_pushvar ($1);} '[' expr1 ']'
  449. {
  450. $$ = 0; /* indexed variable */
  451. }
  452. | var {lua_pushvar ($1);} '.' NAME
  453. {
  454. align(Word);
  455. code_byte(PUSHSTRING);
  456. code_word(lua_findconstant (s_name($4))); incr_ntemp();
  457. $$ = 0; /* indexed variable */
  458. }
  459. ;
  460. localdeclist : NAME {localvar[nlocalvar]=$1; $$ = 1;}
  461. | localdeclist ',' NAME {localvar[nlocalvar+$1]=$3; $$ = $1+1;}
  462. ;
  463. decinit : /* empty */
  464. | '=' exprlist1
  465. ;
  466. setdebug : DEBUG {lua_debug = $1;}
  467. %%
  468. /*
  469. ** Search a local name and if find return its index. If do not find return -1
  470. */
  471. static int lua_localname (Word n)
  472. {
  473. int i;
  474. for (i=nlocalvar-1; i >= 0; i--)
  475. if (n == localvar[i]) return i; /* local var */
  476. return -1; /* global var */
  477. }
  478. /*
  479. ** Push a variable given a number. If number is positive, push global variable
  480. ** indexed by (number -1). If negative, push local indexed by ABS(number)-1.
  481. ** Otherwise, if zero, push indexed variable (record).
  482. */
  483. static void lua_pushvar (long number)
  484. {
  485. if (number > 0) /* global var */
  486. {
  487. align(Word);
  488. code_byte(PUSHGLOBAL);
  489. code_word(number-1);
  490. incr_ntemp();
  491. }
  492. else if (number < 0) /* local var */
  493. {
  494. number = (-number) - 1;
  495. if (number < 10) code_byte(PUSHLOCAL0 + number);
  496. else
  497. {
  498. code_byte(PUSHLOCAL);
  499. code_byte(number);
  500. }
  501. incr_ntemp();
  502. }
  503. else
  504. {
  505. code_byte(PUSHINDEXED);
  506. ntemp--;
  507. }
  508. }
  509. static void lua_codeadjust (int n)
  510. {
  511. code_byte(ADJUST);
  512. code_byte(n + nlocalvar);
  513. }
  514. static void lua_codestore (int i)
  515. {
  516. if (varbuffer[i] > 0) /* global var */
  517. {
  518. align(Word);
  519. code_byte(STOREGLOBAL);
  520. code_word(varbuffer[i]-1);
  521. }
  522. else if (varbuffer[i] < 0) /* local var */
  523. {
  524. int number = (-varbuffer[i]) - 1;
  525. if (number < 10) code_byte(STORELOCAL0 + number);
  526. else
  527. {
  528. code_byte(STORELOCAL);
  529. code_byte(number);
  530. }
  531. }
  532. else /* indexed var */
  533. {
  534. int j;
  535. int upper=0; /* number of indexed variables upper */
  536. int param; /* number of itens until indexed expression */
  537. for (j=i+1; j <nvarbuffer; j++)
  538. if (varbuffer[j] == 0) upper++;
  539. param = upper*2 + i;
  540. if (param == 0)
  541. code_byte(STOREINDEXED0);
  542. else
  543. {
  544. code_byte(STOREINDEXED);
  545. code_byte(param);
  546. }
  547. }
  548. }
  549. void yyerror (char *s)
  550. {
  551. static char msg[256];
  552. sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"",
  553. s, lua_lasttext (), lua_linenumber, lua_filename());
  554. lua_error (msg);
  555. err = 1;
  556. }
  557. int yywrap (void)
  558. {
  559. return 1;
  560. }
  561. /*
  562. ** Parse LUA code and execute global statement.
  563. ** Return 0 on success or 1 on error.
  564. */
  565. int lua_parse (void)
  566. {
  567. Byte *initcode = maincode;
  568. err = 0;
  569. if (yyparse () || (err==1)) return 1;
  570. *maincode++ = HALT;
  571. if (lua_execute (initcode)) return 1;
  572. maincode = initcode;
  573. return 0;
  574. }
  575. #if 0
  576. static void PrintCode (void)
  577. {
  578. Byte *p = code;
  579. printf ("\n\nCODE\n");
  580. while (p != pc)
  581. {
  582. switch ((OpCode)*p)
  583. {
  584. case NOP: printf ("%d NOP\n", (p++)-code); break;
  585. case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break;
  586. case PUSH0: case PUSH1: case PUSH2:
  587. printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0');
  588. p++;
  589. break;
  590. case PUSHBYTE:
  591. printf ("%d PUSHBYTE %d\n", p-code, *(++p));
  592. p++;
  593. break;
  594. case PUSHWORD:
  595. printf ("%d PUSHWORD %d\n", p-code, *((Word *)(p+1)));
  596. p += 1 + sizeof(Word);
  597. break;
  598. case PUSHFLOAT:
  599. printf ("%d PUSHFLOAT %f\n", p-code, *((float *)(p+1)));
  600. p += 1 + sizeof(float);
  601. break;
  602. case PUSHSTRING:
  603. printf ("%d PUSHSTRING %d\n", p-code, *((Word *)(p+1)));
  604. p += 1 + sizeof(Word);
  605. break;
  606. case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3:
  607. case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
  608. case PUSHLOCAL8: case PUSHLOCAL9:
  609. printf ("%d PUSHLOCAL%c\n", p-code, *p-PUSHLOCAL0+'0');
  610. p++;
  611. break;
  612. case PUSHLOCAL: printf ("%d PUSHLOCAL %d\n", p-code, *(++p));
  613. p++;
  614. break;
  615. case PUSHGLOBAL:
  616. printf ("%d PUSHGLOBAL %d\n", p-code, *((Word *)(p+1)));
  617. p += 1 + sizeof(Word);
  618. break;
  619. case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break;
  620. case PUSHMARK: printf ("%d PUSHMARK\n", (p++)-code); break;
  621. case PUSHOBJECT: printf ("%d PUSHOBJECT\n", (p++)-code); break;
  622. case STORELOCAL0: case STORELOCAL1: case STORELOCAL2: case STORELOCAL3:
  623. case STORELOCAL4: case STORELOCAL5: case STORELOCAL6: case STORELOCAL7:
  624. case STORELOCAL8: case STORELOCAL9:
  625. printf ("%d STORELOCAL%c\n", p-code, *p-STORELOCAL0+'0');
  626. p++;
  627. break;
  628. case STORELOCAL:
  629. printf ("%d STORELOCAK %d\n", p-code, *(++p));
  630. p++;
  631. break;
  632. case STOREGLOBAL:
  633. printf ("%d STOREGLOBAL %d\n", p-code, *((Word *)(p+1)));
  634. p += 1 + sizeof(Word);
  635. break;
  636. case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break;
  637. case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p));
  638. p++;
  639. break;
  640. case STOREFIELD: printf ("%d STOREFIELD\n", (p++)-code); break;
  641. case ADJUST:
  642. printf ("%d ADJUST %d\n", p-code, *(++p));
  643. p++;
  644. break;
  645. case CREATEARRAY: printf ("%d CREATEARRAY\n", (p++)-code); break;
  646. case EQOP: printf ("%d EQOP\n", (p++)-code); break;
  647. case LTOP: printf ("%d LTOP\n", (p++)-code); break;
  648. case LEOP: printf ("%d LEOP\n", (p++)-code); break;
  649. case ADDOP: printf ("%d ADDOP\n", (p++)-code); break;
  650. case SUBOP: printf ("%d SUBOP\n", (p++)-code); break;
  651. case MULTOP: printf ("%d MULTOP\n", (p++)-code); break;
  652. case DIVOP: printf ("%d DIVOP\n", (p++)-code); break;
  653. case CONCOP: printf ("%d CONCOP\n", (p++)-code); break;
  654. case MINUSOP: printf ("%d MINUSOP\n", (p++)-code); break;
  655. case NOTOP: printf ("%d NOTOP\n", (p++)-code); break;
  656. case ONTJMP:
  657. printf ("%d ONTJMP %d\n", p-code, *((Word *)(p+1)));
  658. p += sizeof(Word) + 1;
  659. break;
  660. case ONFJMP:
  661. printf ("%d ONFJMP %d\n", p-code, *((Word *)(p+1)));
  662. p += sizeof(Word) + 1;
  663. break;
  664. case JMP:
  665. printf ("%d JMP %d\n", p-code, *((Word *)(p+1)));
  666. p += sizeof(Word) + 1;
  667. break;
  668. case UPJMP:
  669. printf ("%d UPJMP %d\n", p-code, *((Word *)(p+1)));
  670. p += sizeof(Word) + 1;
  671. break;
  672. case IFFJMP:
  673. printf ("%d IFFJMP %d\n", p-code, *((Word *)(p+1)));
  674. p += sizeof(Word) + 1;
  675. break;
  676. case IFFUPJMP:
  677. printf ("%d IFFUPJMP %d\n", p-code, *((Word *)(p+1)));
  678. p += sizeof(Word) + 1;
  679. break;
  680. case POP: printf ("%d POP\n", (p++)-code); break;
  681. case CALLFUNC: printf ("%d CALLFUNC\n", (p++)-code); break;
  682. case RETCODE:
  683. printf ("%d RETCODE %d\n", p-code, *(++p));
  684. p++;
  685. break;
  686. default: printf ("%d Cannot happen\n", (p++)-code); break;
  687. }
  688. }
  689. }
  690. #endif