diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-02 18:30:53 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-02 18:30:53 -0200 |
commit | fbf887ec2be8b293d6f3ffc88b42c5a9e87bf022 (patch) | |
tree | 030c6dd803fff11ae0c368e90b78a9fef2b8b731 /lua.stx | |
parent | ae77864844d6b933eb8be68694cbb8498af165dc (diff) | |
download | lua-fbf887ec2be8b293d6f3ffc88b42c5a9e87bf022.tar.gz lua-fbf887ec2be8b293d6f3ffc88b42c5a9e87bf022.tar.bz2 lua-fbf887ec2be8b293d6f3ffc88b42c5a9e87bf022.zip |
new way to call functions, plus several small changes. This is
a temporary version!
Diffstat (limited to 'lua.stx')
-rw-r--r-- | lua.stx | 190 |
1 files changed, 105 insertions, 85 deletions
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | 2 | ||
3 | char *rcs_luastx = "$Id: lua.stx,v 2.11 1994/10/21 19:00:12 roberto Exp roberto $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 2.12 1994/11/01 18:25:20 roberto Exp roberto $"; |
4 | 4 | ||
5 | #include <stdio.h> | 5 | #include <stdio.h> |
6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
@@ -37,7 +37,6 @@ static int nlocalvar=0; /* number of local variables */ | |||
37 | #define MAXFIELDS FIELDS_PER_FLUSH*2 | 37 | #define MAXFIELDS FIELDS_PER_FLUSH*2 |
38 | static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ | 38 | static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ |
39 | static int nfields=0; | 39 | static int nfields=0; |
40 | static int ntemp; /* number of temporary var into stack */ | ||
41 | static int err; /* flag to indicate error */ | 40 | static int err; /* flag to indicate error */ |
42 | 41 | ||
43 | /* Internal functions */ | 42 | /* Internal functions */ |
@@ -112,7 +111,6 @@ static void flush_record (int n) | |||
112 | code_byte(n); | 111 | code_byte(n); |
113 | for (i=0; i<n; i++) | 112 | for (i=0; i<n; i++) |
114 | code_word(fields[--nfields]); | 113 | code_word(fields[--nfields]); |
115 | ntemp -= n; | ||
116 | } | 114 | } |
117 | 115 | ||
118 | static void flush_list (int m, int n) | 116 | static void flush_list (int m, int n) |
@@ -132,27 +130,15 @@ static void flush_list (int m, int n) | |||
132 | err = 1; | 130 | err = 1; |
133 | } | 131 | } |
134 | code_byte(n); | 132 | code_byte(n); |
135 | ntemp-=n; | ||
136 | } | ||
137 | |||
138 | static void incr_ntemp (void) | ||
139 | { | ||
140 | if (ntemp+nlocalvar+MAXVAR+1 < STACKGAP) | ||
141 | ntemp++; | ||
142 | else | ||
143 | { | ||
144 | lua_error ("stack overflow"); | ||
145 | err = 1; | ||
146 | } | ||
147 | } | 133 | } |
148 | 134 | ||
149 | static void add_nlocalvar (int n) | 135 | static void add_nlocalvar (int n) |
150 | { | 136 | { |
151 | if (ntemp+nlocalvar+MAXVAR+n < STACKGAP) | 137 | if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP) |
152 | nlocalvar += n; | 138 | nlocalvar += n; |
153 | else | 139 | else |
154 | { | 140 | { |
155 | lua_error ("too many local variables or expression too complicate"); | 141 | lua_error ("too many local variables"); |
156 | err = 1; | 142 | err = 1; |
157 | } | 143 | } |
158 | } | 144 | } |
@@ -190,7 +176,6 @@ static void code_number (float f) | |||
190 | code_byte(PUSHFLOAT); | 176 | code_byte(PUSHFLOAT); |
191 | code_float(f); | 177 | code_float(f); |
192 | } | 178 | } |
193 | incr_ntemp(); | ||
194 | } | 179 | } |
195 | 180 | ||
196 | static void init_function (void) | 181 | static void init_function (void) |
@@ -235,8 +220,8 @@ static void init_function (void) | |||
235 | %token <vInt> DEBUG | 220 | %token <vInt> DEBUG |
236 | 221 | ||
237 | %type <vLong> PrepJump | 222 | %type <vLong> PrepJump |
238 | %type <vInt> expr, exprlist, exprlist1, varlist1, funcvalue | 223 | %type <vInt> expr, exprlist, exprlist1, varlist1, funcParams, funcvalue |
239 | %type <vInt> fieldlist, localdeclist | 224 | %type <vInt> fieldlist, localdeclist, decinit |
240 | %type <vInt> ffieldlist1 | 225 | %type <vInt> ffieldlist1 |
241 | %type <vInt> lfieldlist1 | 226 | %type <vInt> lfieldlist1 |
242 | %type <vLong> var, singlevar | 227 | %type <vLong> var, singlevar |
@@ -290,8 +275,8 @@ function : FUNCTION NAME | |||
290 | END | 275 | END |
291 | { | 276 | { |
292 | if (lua_debug) code_byte(RESET); | 277 | if (lua_debug) code_byte(RESET); |
293 | code_byte(RETCODE); code_byte(nlocalvar); | 278 | codereturn(); |
294 | s_tag($<vWord>3) = T_FUNCTION; | 279 | s_tag($<vWord>3) = LUA_T_FUNCTION; |
295 | s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte)); | 280 | s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte)); |
296 | if (s_bvalue($<vWord>3) == NULL) | 281 | if (s_bvalue($<vWord>3) == NULL) |
297 | { | 282 | { |
@@ -330,7 +315,7 @@ method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME | |||
330 | { | 315 | { |
331 | Byte *b; | 316 | Byte *b; |
332 | if (lua_debug) code_byte(RESET); | 317 | if (lua_debug) code_byte(RESET); |
333 | code_byte(RETCODE); code_byte(nlocalvar); | 318 | codereturn(); |
334 | b = calloc (pc, sizeof(Byte)); | 319 | b = calloc (pc, sizeof(Byte)); |
335 | if (b == NULL) | 320 | if (b == NULL) |
336 | { | 321 | { |
@@ -362,7 +347,6 @@ statlist : /* empty */ | |||
362 | ; | 347 | ; |
363 | 348 | ||
364 | stat : { | 349 | stat : { |
365 | ntemp = 0; | ||
366 | if (lua_debug) | 350 | if (lua_debug) |
367 | { | 351 | { |
368 | code_byte(SETLINE); code_word(lua_linenumber); | 352 | code_byte(SETLINE); code_word(lua_linenumber); |
@@ -414,16 +398,18 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | |||
414 | { | 398 | { |
415 | { | 399 | { |
416 | int i; | 400 | int i; |
417 | if ($3 == 0 || nvarbuffer != ntemp - $1 * 2) | 401 | adjust_mult_assign(nvarbuffer, $3, $1 * 2 + nvarbuffer); |
418 | lua_codeadjust ($1 * 2 + nvarbuffer); | ||
419 | for (i=nvarbuffer-1; i>=0; i--) | 402 | for (i=nvarbuffer-1; i>=0; i--) |
420 | lua_codestore (i); | 403 | lua_codestore (i); |
421 | if ($1 > 1 || ($1 == 1 && varbuffer[0] != 0)) | 404 | if ($1 > 1 || ($1 == 1 && varbuffer[0] != 0)) |
422 | lua_codeadjust (0); | 405 | lua_codeadjust (0); |
423 | } | 406 | } |
424 | } | 407 | } |
425 | | functioncall { lua_codeadjust (0); } | 408 | | functioncall { code_byte(0); } |
426 | | LOCAL localdeclist decinit { add_nlocalvar($2); lua_codeadjust (0); } | 409 | | LOCAL localdeclist decinit |
410 | { add_nlocalvar($2); | ||
411 | adjust_mult_assign($2, $3, 0); | ||
412 | } | ||
427 | ; | 413 | ; |
428 | 414 | ||
429 | elsepart : /* empty */ | 415 | elsepart : /* empty */ |
@@ -448,7 +434,7 @@ elsepart : /* empty */ | |||
448 | } | 434 | } |
449 | ; | 435 | ; |
450 | 436 | ||
451 | block : {$<vInt>$ = nlocalvar;} statlist {ntemp = 0;} ret | 437 | block : {$<vInt>$ = nlocalvar;} statlist ret |
452 | { | 438 | { |
453 | if (nlocalvar != $<vInt>1) | 439 | if (nlocalvar != $<vInt>1) |
454 | { | 440 | { |
@@ -462,8 +448,9 @@ ret : /* empty */ | |||
462 | | { if (lua_debug){code_byte(SETLINE);code_word(lua_linenumber);}} | 448 | | { if (lua_debug){code_byte(SETLINE);code_word(lua_linenumber);}} |
463 | RETURN exprlist sc | 449 | RETURN exprlist sc |
464 | { | 450 | { |
451 | if ($3 < 0) code_byte(MULT_RET); | ||
465 | if (lua_debug) code_byte(RESET); | 452 | if (lua_debug) code_byte(RESET); |
466 | code_byte(RETCODE); code_byte(nlocalvar); | 453 | codereturn(); |
467 | } | 454 | } |
468 | ; | 455 | ; |
469 | 456 | ||
@@ -474,22 +461,22 @@ PrepJump : /* empty */ | |||
474 | code_word (0); | 461 | code_word (0); |
475 | } | 462 | } |
476 | 463 | ||
477 | expr1 : expr { if ($1 == 0) {lua_codeadjust (ntemp+1); incr_ntemp();}} | 464 | expr1 : expr { if ($1 == 0) code_byte(1); } |
478 | ; | 465 | ; |
479 | 466 | ||
480 | expr : '(' expr ')' { $$ = $2; } | 467 | expr : '(' expr ')' { $$ = $2; } |
481 | | expr1 EQ expr1 { code_byte(EQOP); $$ = 1; ntemp--;} | 468 | | expr1 EQ expr1 { code_byte(EQOP); $$ = 1; } |
482 | | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; ntemp--;} | 469 | | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; } |
483 | | expr1 '>' expr1 { code_byte(LEOP); code_byte(NOTOP); $$ = 1; ntemp--;} | 470 | | expr1 '>' expr1 { code_byte(LEOP); code_byte(NOTOP); $$ = 1; } |
484 | | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; ntemp--;} | 471 | | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; } |
485 | | expr1 LE expr1 { code_byte(LEOP); $$ = 1; ntemp--;} | 472 | | expr1 LE expr1 { code_byte(LEOP); $$ = 1; } |
486 | | expr1 GE expr1 { code_byte(LTOP); code_byte(NOTOP); $$ = 1; ntemp--;} | 473 | | expr1 GE expr1 { code_byte(LTOP); code_byte(NOTOP); $$ = 1; } |
487 | | expr1 '+' expr1 { code_byte(ADDOP); $$ = 1; ntemp--;} | 474 | | expr1 '+' expr1 { code_byte(ADDOP); $$ = 1; } |
488 | | expr1 '-' expr1 { code_byte(SUBOP); $$ = 1; ntemp--;} | 475 | | expr1 '-' expr1 { code_byte(SUBOP); $$ = 1; } |
489 | | expr1 '*' expr1 { code_byte(MULTOP); $$ = 1; ntemp--;} | 476 | | expr1 '*' expr1 { code_byte(MULTOP); $$ = 1; } |
490 | | expr1 '/' expr1 { code_byte(DIVOP); $$ = 1; ntemp--;} | 477 | | expr1 '/' expr1 { code_byte(DIVOP); $$ = 1; } |
491 | | expr1 '^' expr1 { code_byte(POWOP); $$ = 1; ntemp--;} | 478 | | expr1 '^' expr1 { code_byte(POWOP); $$ = 1; } |
492 | | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; ntemp--;} | 479 | | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; } |
493 | | '+' expr1 %prec UNARY { $$ = 1; } | 480 | | '+' expr1 %prec UNARY { $$ = 1; } |
494 | | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;} | 481 | | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;} |
495 | | table { $$ = 1; } | 482 | | table { $$ = 1; } |
@@ -500,9 +487,8 @@ expr : '(' expr ')' { $$ = $2; } | |||
500 | code_byte(PUSHSTRING); | 487 | code_byte(PUSHSTRING); |
501 | code_word(lua_findconstant($1)); | 488 | code_word(lua_findconstant($1)); |
502 | $$ = 1; | 489 | $$ = 1; |
503 | incr_ntemp(); | ||
504 | } | 490 | } |
505 | | NIL {code_byte(PUSHNIL); $$ = 1; incr_ntemp();} | 491 | | NIL {code_byte(PUSHNIL); $$ = 1; } |
506 | | functioncall | 492 | | functioncall |
507 | { | 493 | { |
508 | $$ = 0; | 494 | $$ = 0; |
@@ -512,13 +498,13 @@ expr : '(' expr ')' { $$ = $2; } | |||
512 | } | 498 | } |
513 | } | 499 | } |
514 | | NOT expr1 { code_byte(NOTOP); $$ = 1;} | 500 | | NOT expr1 { code_byte(NOTOP); $$ = 1;} |
515 | | expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1 | 501 | | expr1 AND PrepJump {code_byte(POP); } expr1 |
516 | { | 502 | { |
517 | basepc[$3] = ONFJMP; | 503 | basepc[$3] = ONFJMP; |
518 | code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); | 504 | code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); |
519 | $$ = 1; | 505 | $$ = 1; |
520 | } | 506 | } |
521 | | expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1 | 507 | | expr1 OR PrepJump {code_byte(POP); } expr1 |
522 | { | 508 | { |
523 | basepc[$3] = ONTJMP; | 509 | basepc[$3] = ONTJMP; |
524 | code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); | 510 | code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); |
@@ -537,33 +523,35 @@ table : | |||
537 | } | 523 | } |
538 | ; | 524 | ; |
539 | 525 | ||
540 | functioncall : funcvalue funcParams { code_byte(CALLFUNC); ntemp = $1-1; } | 526 | functioncall : funcvalue funcParams |
527 | { code_byte(CALLFUNC); code_byte($1+$2); } | ||
541 | ; | 528 | ; |
542 | funcvalue : varexp | 529 | |
543 | { | 530 | funcvalue : varexp { $$ = 0; } |
544 | $$ = ntemp; code_byte(PUSHMARK); incr_ntemp(); | ||
545 | } | ||
546 | | varexp ':' NAME | 531 | | varexp ':' NAME |
547 | { | 532 | { |
548 | code_byte(PUSHSTRING); | 533 | code_byte(PUSHSTRING); |
549 | code_word(lua_findconstant($3)); | 534 | code_word(lua_findconstant($3)); |
550 | incr_ntemp(); | 535 | code_byte(PUSHSELF); |
551 | $$ = ntemp-1; | 536 | $$ = 1; |
552 | code_byte(PUSHMARKMET); | ||
553 | incr_ntemp(); | ||
554 | } | 537 | } |
555 | ; | 538 | ; |
539 | |||
556 | funcParams : '(' exprlist ')' | 540 | funcParams : '(' exprlist ')' |
557 | | table | 541 | { if ($2<0) { code_byte(1); $$ = -$2; } else $$ = $2; } |
542 | | table { $$ = 1; } | ||
558 | ; | 543 | ; |
559 | 544 | ||
560 | exprlist : /* empty */ { $$ = 1; } | 545 | exprlist : /* empty */ { $$ = 0; } |
561 | | exprlist1 { $$ = $1; } | 546 | | exprlist1 { $$ = $1; } |
562 | ; | 547 | ; |
563 | 548 | ||
564 | exprlist1 : expr { $$ = $1; } | 549 | exprlist1 : expr { if ($1 == 0) $$ = -1; else $$ = 1; } |
565 | | exprlist1 ',' {if (!$1){lua_codeadjust (ntemp+1); incr_ntemp();}} | 550 | | exprlist1 ',' { if ($1 < 0) code_byte(1); } expr |
566 | expr {$$ = $4;} | 551 | { |
552 | int r = $1 < 0 ? -$1 : $1; | ||
553 | $$ = ($4 == 0) ? -(r+1) : r+1; | ||
554 | } | ||
567 | ; | 555 | ; |
568 | 556 | ||
569 | parlist : /* empty */ | 557 | parlist : /* empty */ |
@@ -641,7 +629,7 @@ var : singlevar { $$ = $1; } | |||
641 | | varexp '.' NAME | 629 | | varexp '.' NAME |
642 | { | 630 | { |
643 | code_byte(PUSHSTRING); | 631 | code_byte(PUSHSTRING); |
644 | code_word(lua_findconstant($3)); incr_ntemp(); | 632 | code_word(lua_findconstant($3)); |
645 | $$ = 0; /* indexed variable */ | 633 | $$ = 0; /* indexed variable */ |
646 | } | 634 | } |
647 | ; | 635 | ; |
@@ -668,8 +656,8 @@ localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} | |||
668 | } | 656 | } |
669 | ; | 657 | ; |
670 | 658 | ||
671 | decinit : /* empty */ | 659 | decinit : /* empty */ { $$ = 0; } |
672 | | '=' exprlist1 | 660 | | '=' exprlist1 { $$ = $2; } |
673 | ; | 661 | ; |
674 | 662 | ||
675 | setdebug : DEBUG {lua_debug = $1;} | 663 | setdebug : DEBUG {lua_debug = $1;} |
@@ -698,7 +686,6 @@ static void lua_pushvar (long number) | |||
698 | { | 686 | { |
699 | code_byte(PUSHGLOBAL); | 687 | code_byte(PUSHGLOBAL); |
700 | code_word(number-1); | 688 | code_word(number-1); |
701 | incr_ntemp(); | ||
702 | } | 689 | } |
703 | else if (number < 0) /* local var */ | 690 | else if (number < 0) /* local var */ |
704 | { | 691 | { |
@@ -709,19 +696,50 @@ static void lua_pushvar (long number) | |||
709 | code_byte(PUSHLOCAL); | 696 | code_byte(PUSHLOCAL); |
710 | code_byte(number); | 697 | code_byte(number); |
711 | } | 698 | } |
712 | incr_ntemp(); | ||
713 | } | 699 | } |
714 | else | 700 | else |
715 | { | 701 | { |
716 | code_byte(PUSHINDEXED); | 702 | code_byte(PUSHINDEXED); |
717 | ntemp--; | ||
718 | } | 703 | } |
719 | } | 704 | } |
720 | 705 | ||
721 | static void lua_codeadjust (int n) | 706 | static void lua_codeadjust (int n) |
722 | { | 707 | { |
723 | code_byte(ADJUST); | 708 | if (n+nlocalvar == 0) |
724 | code_byte(n + nlocalvar); | 709 | code_byte(ADJUST0); |
710 | else | ||
711 | { | ||
712 | code_byte(ADJUST); | ||
713 | code_byte(n+nlocalvar); | ||
714 | } | ||
715 | } | ||
716 | |||
717 | static void codereturn (void) | ||
718 | { | ||
719 | if (nlocalvar == 0) | ||
720 | code_byte(RETCODE0); | ||
721 | else | ||
722 | { | ||
723 | code_byte(RETCODE); | ||
724 | code_byte(nlocalvar); | ||
725 | } | ||
726 | } | ||
727 | |||
728 | static void adjust_mult_assign (int vars, int exps, int temps) | ||
729 | { | ||
730 | if (exps < 0) | ||
731 | { | ||
732 | int r = vars - (-exps-1); | ||
733 | if (r >= 0) | ||
734 | code_byte(r); | ||
735 | else | ||
736 | { | ||
737 | code_byte(0); | ||
738 | lua_codeadjust(temps); | ||
739 | } | ||
740 | } | ||
741 | else if (vars != exps) | ||
742 | lua_codeadjust(temps); | ||
725 | } | 743 | } |
726 | 744 | ||
727 | static void lua_codestore (int i) | 745 | static void lua_codestore (int i) |
@@ -775,10 +793,9 @@ int yywrap (void) | |||
775 | 793 | ||
776 | 794 | ||
777 | /* | 795 | /* |
778 | ** Parse LUA code and execute global statement. | 796 | ** Parse LUA code and returns global statements. |
779 | ** Return 0 on success or 1 on error. | ||
780 | */ | 797 | */ |
781 | int lua_parse (void) | 798 | Byte *lua_parse (void) |
782 | { | 799 | { |
783 | Byte *init = initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); | 800 | Byte *init = initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); |
784 | maincode = 0; | 801 | maincode = 0; |
@@ -786,18 +803,17 @@ int lua_parse (void) | |||
786 | if (init == NULL) | 803 | if (init == NULL) |
787 | { | 804 | { |
788 | lua_error("not enough memory"); | 805 | lua_error("not enough memory"); |
789 | return 1; | 806 | return NULL; |
790 | } | 807 | } |
791 | err = 0; | 808 | err = 0; |
792 | if (yyparse () || (err==1)) return 1; | 809 | if (yyparse () || (err==1)) return NULL; |
793 | initcode[maincode++] = HALT; | 810 | initcode[maincode++] = RETCODE0; |
794 | init = initcode; | 811 | init = initcode; |
795 | #if LISTING | 812 | #if LISTING |
796 | PrintCode(init,init+maincode); | 813 | { static void PrintCode (Byte *code, Byte *end); |
814 | PrintCode(init,init+maincode); } | ||
797 | #endif | 815 | #endif |
798 | if (lua_execute (init)) return 1; | 816 | return init; |
799 | free(init); | ||
800 | return 0; | ||
801 | } | 817 | } |
802 | 818 | ||
803 | 819 | ||
@@ -876,7 +892,6 @@ static void PrintCode (Byte *code, Byte *end) | |||
876 | } | 892 | } |
877 | break; | 893 | break; |
878 | case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break; | 894 | case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break; |
879 | case PUSHMARK: printf ("%d PUSHMARK\n", (p++)-code); break; | ||
880 | case STORELOCAL0: case STORELOCAL1: case STORELOCAL2: case STORELOCAL3: | 895 | case STORELOCAL0: case STORELOCAL1: case STORELOCAL2: case STORELOCAL3: |
881 | case STORELOCAL4: case STORELOCAL5: case STORELOCAL6: case STORELOCAL7: | 896 | case STORELOCAL4: case STORELOCAL5: case STORELOCAL6: case STORELOCAL7: |
882 | case STORELOCAL8: case STORELOCAL9: | 897 | case STORELOCAL8: case STORELOCAL9: |
@@ -896,6 +911,7 @@ static void PrintCode (Byte *code, Byte *end) | |||
896 | printf ("%d STOREGLOBAL %d\n", n, c.w); | 911 | printf ("%d STOREGLOBAL %d\n", n, c.w); |
897 | } | 912 | } |
898 | break; | 913 | break; |
914 | case PUSHSELF: printf ("%d PUSHSELF\n", (p++)-code); break; | ||
899 | case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break; | 915 | case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break; |
900 | case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); | 916 | case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); |
901 | p++; | 917 | p++; |
@@ -912,6 +928,7 @@ static void PrintCode (Byte *code, Byte *end) | |||
912 | printf("%d STORERECORD %d\n", p-code, *(++p)); | 928 | printf("%d STORERECORD %d\n", p-code, *(++p)); |
913 | p += *p*sizeof(Word) + 1; | 929 | p += *p*sizeof(Word) + 1; |
914 | break; | 930 | break; |
931 | case ADJUST0: printf ("%d ADJUST0\n", (p++)-code); break; | ||
915 | case ADJUST: | 932 | case ADJUST: |
916 | printf ("%d ADJUST %d\n", p-code, *(++p)); | 933 | printf ("%d ADJUST %d\n", p-code, *(++p)); |
917 | p++; | 934 | p++; |
@@ -922,7 +939,7 @@ static void PrintCode (Byte *code, Byte *end) | |||
922 | int n = p-code; | 939 | int n = p-code; |
923 | p++; | 940 | p++; |
924 | get_word(c,p); | 941 | get_word(c,p); |
925 | printf ("%d CREATEARRAY\n", n, c.w); | 942 | printf ("%d CREATEARRAY %d\n", n, c.w); |
926 | break; | 943 | break; |
927 | } | 944 | } |
928 | case EQOP: printf ("%d EQOP\n", (p++)-code); break; | 945 | case EQOP: printf ("%d EQOP\n", (p++)-code); break; |
@@ -990,16 +1007,19 @@ static void PrintCode (Byte *code, Byte *end) | |||
990 | } | 1007 | } |
991 | break; | 1008 | break; |
992 | case POP: printf ("%d POP\n", (p++)-code); break; | 1009 | case POP: printf ("%d POP\n", (p++)-code); break; |
993 | case CALLFUNC: printf ("%d CALLFUNC\n", (p++)-code); break; | 1010 | case CALLFUNC: |
1011 | printf ("%d CALLFUNC %d %d\n", p-code, *(p+1), *(p+2)); | ||
1012 | p+=3; | ||
1013 | break; | ||
1014 | case RETCODE0: printf ("%d RETCODE0\n", (p++)-code); break; | ||
994 | case RETCODE: | 1015 | case RETCODE: |
995 | printf ("%d RETCODE %d\n", p-code, *(++p)); | 1016 | printf ("%d RETCODE %d\n", p-code, *(++p)); |
996 | p++; | 1017 | p++; |
997 | break; | 1018 | break; |
998 | case HALT: printf ("%d HALT\n", (p++)-code); break; | ||
999 | case SETFUNCTION: | 1019 | case SETFUNCTION: |
1000 | { | 1020 | { |
1001 | CodeCode c1; | 1021 | CodeCode c1; |
1002 | CodeWord c1; | 1022 | CodeWord c2; |
1003 | int n = p-code; | 1023 | int n = p-code; |
1004 | p++; | 1024 | p++; |
1005 | get_code(c1,p); | 1025 | get_code(c1,p); |