diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-13 18:37:20 -0300 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-13 18:37:20 -0300 |
| commit | 8ca980966ca383c120dadb2c6e6a0850d1bfff58 (patch) | |
| tree | 60822d655ea3fa23f54ab27b01838aa35e9fb3fa | |
| parent | 662e2fa5ccf1dfa0ebea571d6785009442ba3011 (diff) | |
| download | lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.tar.gz lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.tar.bz2 lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.zip | |
Alteracao para retirar codificacao de NOP's, substituindo
pela utilizacao de "union" com "chars" para codificar Word e float.
Observa-se que foram realizados testes antes da alteracao e constatou-se
que do bytecode anteriormente gerado, NOP representava de 10 a 13% do
total de bytes do codigo. Esta percentagem chegava ate' a 20% na caso
de descricao de metafile utilizando Lua.
| -rw-r--r-- | lua.stx | 188 | ||||
| -rw-r--r-- | opcode.c | 98 | ||||
| -rw-r--r-- | opcode.h | 20 |
3 files changed, 193 insertions, 113 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | 2 | ||
| 3 | char *rcs_luastx = "$Id: lua.stx,v 1.4 1994/02/13 20:38:20 roberto Exp celes $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 1.5 1994/03/28 15:14:54 celes Exp celes $"; |
| 4 | 4 | ||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| @@ -16,10 +16,6 @@ char *rcs_luastx = "$Id: lua.stx,v 1.4 1994/02/13 20:38:20 roberto Exp celes $"; | |||
| 16 | 16 | ||
| 17 | #define LISTING 0 | 17 | #define LISTING 0 |
| 18 | 18 | ||
| 19 | #ifndef ALIGNMENT | ||
| 20 | #define ALIGNMENT (sizeof(void *)) | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #ifndef MAXCODE | 19 | #ifndef MAXCODE |
| 24 | #define MAXCODE 1024 | 20 | #define MAXCODE 1024 |
| 25 | #endif | 21 | #endif |
| @@ -56,34 +52,30 @@ static void code_byte (Byte c) | |||
| 56 | *pc++ = c; | 52 | *pc++ = c; |
| 57 | } | 53 | } |
| 58 | 54 | ||
| 59 | #define align(t,n) align_n(sizeof(t),n) | 55 | static void code_word (Word n) |
| 60 | static void align_n (unsigned size, int gap) | ||
| 61 | { | 56 | { |
| 62 | if (size > ALIGNMENT) size = ALIGNMENT; | 57 | CodeWord code; |
| 63 | while (((pc+gap-code)%size) != 0) /* +gap to include BYTECODEs */ | 58 | code.w = n; |
| 64 | code_byte (NOP); | 59 | code_byte(code.m.c1); |
| 60 | code_byte(code.m.c2); | ||
| 65 | } | 61 | } |
| 66 | 62 | ||
| 67 | static void code_word (Word n) | 63 | static void code_float (float n) |
| 68 | { | 64 | { |
| 69 | if (pc-basepc>MAXCODE-sizeof(Word)) | 65 | CodeFloat code; |
| 70 | { | 66 | code.f = n; |
| 71 | lua_error ("code buffer overflow"); | 67 | code_byte(code.m.c1); |
| 72 | err = 1; | 68 | code_byte(code.m.c2); |
| 73 | } | 69 | code_byte(code.m.c3); |
| 74 | *((Word *)pc) = n; | 70 | code_byte(code.m.c4); |
| 75 | pc += sizeof(Word); | ||
| 76 | } | 71 | } |
| 77 | 72 | ||
| 78 | static void code_float (float n) | 73 | static void code_word_at (Byte *p, Word n) |
| 79 | { | 74 | { |
| 80 | if (pc-basepc>MAXCODE-sizeof(float)) | 75 | CodeWord code; |
| 81 | { | 76 | code.w = n; |
| 82 | lua_error ("code buffer overflow"); | 77 | *p++ = code.m.c1; |
| 83 | err = 1; | 78 | *p++ = code.m.c2; |
| 84 | } | ||
| 85 | *((float *)pc) = n; | ||
| 86 | pc += sizeof(float); | ||
| 87 | } | 79 | } |
| 88 | 80 | ||
| 89 | static void push_field (Word name) | 81 | static void push_field (Word name) |
| @@ -101,7 +93,6 @@ static void flush_record (int n) | |||
| 101 | { | 93 | { |
| 102 | int i; | 94 | int i; |
| 103 | if (n == 0) return; | 95 | if (n == 0) return; |
| 104 | align(Word,2); /* two bytes before the actual word */ | ||
| 105 | code_byte(STORERECORD); | 96 | code_byte(STORERECORD); |
| 106 | code_byte(n); | 97 | code_byte(n); |
| 107 | for (i=0; i<n; i++) | 98 | for (i=0; i<n; i++) |
| @@ -168,14 +159,12 @@ static void code_number (float f) | |||
| 168 | } | 159 | } |
| 169 | else | 160 | else |
| 170 | { | 161 | { |
| 171 | align(Word,1); | ||
| 172 | code_byte(PUSHWORD); | 162 | code_byte(PUSHWORD); |
| 173 | code_word(i); | 163 | code_word(i); |
| 174 | } | 164 | } |
| 175 | } | 165 | } |
| 176 | else | 166 | else |
| 177 | { | 167 | { |
| 178 | align(float,1); | ||
| 179 | code_byte(PUSHFLOAT); | 168 | code_byte(PUSHFLOAT); |
| 180 | code_float(f); | 169 | code_float(f); |
| 181 | } | 170 | } |
| @@ -229,7 +218,7 @@ functionlist : /* empty */ | |||
| 229 | { | 218 | { |
| 230 | maincode=pc; | 219 | maincode=pc; |
| 231 | #if LISTING | 220 | #if LISTING |
| 232 | PrintCode(basepc,maincode); | 221 | PrintCode(basepc,maincode,(Byte*)mainbuffer); |
| 233 | #endif | 222 | #endif |
| 234 | } | 223 | } |
| 235 | | functionlist function | 224 | | functionlist function |
| @@ -240,7 +229,6 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')' | |||
| 240 | { | 229 | { |
| 241 | if (lua_debug) | 230 | if (lua_debug) |
| 242 | { | 231 | { |
| 243 | align(Word,1); | ||
| 244 | code_byte(SETFUNCTION); | 232 | code_byte(SETFUNCTION); |
| 245 | code_word(lua_nfile-1); | 233 | code_word(lua_nfile-1); |
| 246 | code_word($2); | 234 | code_word($2); |
| @@ -256,7 +244,7 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')' | |||
| 256 | s_bvalue($2) = calloc (pc-code, sizeof(Byte)); | 244 | s_bvalue($2) = calloc (pc-code, sizeof(Byte)); |
| 257 | memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte)); | 245 | memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte)); |
| 258 | #if LISTING | 246 | #if LISTING |
| 259 | PrintCode(code,pc); | 247 | PrintCode(code,pc,(Byte*)buffer); |
| 260 | #endif | 248 | #endif |
| 261 | } | 249 | } |
| 262 | ; | 250 | ; |
| @@ -269,7 +257,7 @@ stat : { | |||
| 269 | ntemp = 0; | 257 | ntemp = 0; |
| 270 | if (lua_debug) | 258 | if (lua_debug) |
| 271 | { | 259 | { |
| 272 | align(Word,1); code_byte(SETLINE); code_word(lua_linenumber); | 260 | code_byte(SETLINE); code_word(lua_linenumber); |
| 273 | } | 261 | } |
| 274 | } | 262 | } |
| 275 | stat1 | 263 | stat1 |
| @@ -284,16 +272,15 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | |||
| 284 | if (pc - elseinit == 0) /* no else */ | 272 | if (pc - elseinit == 0) /* no else */ |
| 285 | { | 273 | { |
| 286 | pc -= sizeof(Word)+1; | 274 | pc -= sizeof(Word)+1; |
| 287 | /* if (*(pc-1) == NOP) --pc; */ | ||
| 288 | elseinit = pc; | 275 | elseinit = pc; |
| 289 | } | 276 | } |
| 290 | else | 277 | else |
| 291 | { | 278 | { |
| 292 | *($6) = JMP; | 279 | *($6) = JMP; |
| 293 | *((Word *)($6+1)) = pc - elseinit; | 280 | code_word_at($6+1, pc - elseinit); |
| 294 | } | 281 | } |
| 295 | *($4) = IFFJMP; | 282 | *($4) = IFFJMP; |
| 296 | *((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1); | 283 | code_word_at($4+1, elseinit - ($4 + sizeof(Word)+1)); |
| 297 | } | 284 | } |
| 298 | } | 285 | } |
| 299 | 286 | ||
| @@ -301,17 +288,17 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | |||
| 301 | 288 | ||
| 302 | { | 289 | { |
| 303 | *($5) = IFFJMP; | 290 | *($5) = IFFJMP; |
| 304 | *((Word *)($5+1)) = pc - ($5 + sizeof(Word)+1); | 291 | code_word_at($5+1, pc - ($5 + sizeof(Word)+1)); |
| 305 | 292 | ||
| 306 | *($7) = UPJMP; | 293 | *($7) = UPJMP; |
| 307 | *((Word *)($7+1)) = pc - $<pByte>2; | 294 | code_word_at($7+1, pc - $<pByte>2); |
| 308 | } | 295 | } |
| 309 | 296 | ||
| 310 | | REPEAT {$<pByte>$ = pc;} block UNTIL expr1 PrepJump | 297 | | REPEAT {$<pByte>$ = pc;} block UNTIL expr1 PrepJump |
| 311 | 298 | ||
| 312 | { | 299 | { |
| 313 | *($6) = IFFUPJMP; | 300 | *($6) = IFFUPJMP; |
| 314 | *((Word *)($6+1)) = pc - $<pByte>2; | 301 | code_word_at($6+1, pc - $<pByte>2); |
| 315 | } | 302 | } |
| 316 | 303 | ||
| 317 | 304 | ||
| @@ -347,10 +334,10 @@ elsepart : /* empty */ | |||
| 347 | else | 334 | else |
| 348 | { | 335 | { |
| 349 | *($6) = JMP; | 336 | *($6) = JMP; |
| 350 | *((Word *)($6+1)) = pc - elseinit; | 337 | code_word_at($6+1, pc - elseinit); |
| 351 | } | 338 | } |
| 352 | *($4) = IFFJMP; | 339 | *($4) = IFFJMP; |
| 353 | *((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1); | 340 | code_word_at($4+1, elseinit - ($4 + sizeof(Word)+1)); |
| 354 | } | 341 | } |
| 355 | } | 342 | } |
| 356 | ; | 343 | ; |
| @@ -366,7 +353,7 @@ block : {$<vInt>$ = nlocalvar;} statlist {ntemp = 0;} ret | |||
| 366 | ; | 353 | ; |
| 367 | 354 | ||
| 368 | ret : /* empty */ | 355 | ret : /* empty */ |
| 369 | | { if (lua_debug){align(Word,1);code_byte(SETLINE);code_word(lua_linenumber);}} | 356 | | { if (lua_debug){code_byte(SETLINE);code_word(lua_linenumber);}} |
| 370 | RETURN exprlist sc | 357 | RETURN exprlist sc |
| 371 | { | 358 | { |
| 372 | if (lua_debug) code_byte(RESET); | 359 | if (lua_debug) code_byte(RESET); |
| @@ -376,7 +363,6 @@ ret : /* empty */ | |||
| 376 | 363 | ||
| 377 | PrepJump : /* empty */ | 364 | PrepJump : /* empty */ |
| 378 | { | 365 | { |
| 379 | align(Word,1); | ||
| 380 | $$ = pc; | 366 | $$ = pc; |
| 381 | code_byte(0); /* open space */ | 367 | code_byte(0); /* open space */ |
| 382 | code_word (0); | 368 | code_word (0); |
| @@ -409,7 +395,6 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 409 | | NUMBER { code_number($1); $$ = 1; } | 395 | | NUMBER { code_number($1); $$ = 1; } |
| 410 | | STRING | 396 | | STRING |
| 411 | { | 397 | { |
| 412 | align(Word,1); | ||
| 413 | code_byte(PUSHSTRING); | 398 | code_byte(PUSHSTRING); |
| 414 | code_word($1); | 399 | code_word($1); |
| 415 | $$ = 1; | 400 | $$ = 1; |
| @@ -421,20 +406,20 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 421 | $$ = 0; | 406 | $$ = 0; |
| 422 | if (lua_debug) | 407 | if (lua_debug) |
| 423 | { | 408 | { |
| 424 | align(Word,1); code_byte(SETLINE); code_word(lua_linenumber); | 409 | code_byte(SETLINE); code_word(lua_linenumber); |
| 425 | } | 410 | } |
| 426 | } | 411 | } |
| 427 | | NOT expr1 { code_byte(NOTOP); $$ = 1;} | 412 | | NOT expr1 { code_byte(NOTOP); $$ = 1;} |
| 428 | | expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1 | 413 | | expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1 |
| 429 | { | 414 | { |
| 430 | *($3) = ONFJMP; | 415 | *($3) = ONFJMP; |
| 431 | *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1); | 416 | code_word_at($3+1, pc - ($3 + sizeof(Word)+1)); |
| 432 | $$ = 1; | 417 | $$ = 1; |
| 433 | } | 418 | } |
| 434 | | expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1 | 419 | | expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1 |
| 435 | { | 420 | { |
| 436 | *($3) = ONTJMP; | 421 | *($3) = ONTJMP; |
| 437 | *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1); | 422 | code_word_at($3+1, pc - ($3 + sizeof(Word)+1)); |
| 438 | $$ = 1; | 423 | $$ = 1; |
| 439 | } | 424 | } |
| 440 | ; | 425 | ; |
| @@ -465,7 +450,7 @@ typeconstructor: '@' | |||
| 465 | $$ = 0; | 450 | $$ = 0; |
| 466 | if (lua_debug) | 451 | if (lua_debug) |
| 467 | { | 452 | { |
| 468 | align(Word,1); code_byte(SETLINE); code_word(lua_linenumber); | 453 | code_byte(SETLINE); code_word(lua_linenumber); |
| 469 | } | 454 | } |
| 470 | } | 455 | } |
| 471 | } | 456 | } |
| @@ -566,7 +551,6 @@ var : NAME | |||
| 566 | } | 551 | } |
| 567 | | var {lua_pushvar ($1);} '.' NAME | 552 | | var {lua_pushvar ($1);} '.' NAME |
| 568 | { | 553 | { |
| 569 | align(Word,1); | ||
| 570 | code_byte(PUSHSTRING); | 554 | code_byte(PUSHSTRING); |
| 571 | code_word(lua_findconstant (s_name($4))); incr_ntemp(); | 555 | code_word(lua_findconstant (s_name($4))); incr_ntemp(); |
| 572 | $$ = 0; /* indexed variable */ | 556 | $$ = 0; /* indexed variable */ |
| @@ -605,7 +589,6 @@ static void lua_pushvar (long number) | |||
| 605 | { | 589 | { |
| 606 | if (number > 0) /* global var */ | 590 | if (number > 0) /* global var */ |
| 607 | { | 591 | { |
| 608 | align(Word,1); | ||
| 609 | code_byte(PUSHGLOBAL); | 592 | code_byte(PUSHGLOBAL); |
| 610 | code_word(number-1); | 593 | code_word(number-1); |
| 611 | incr_ntemp(); | 594 | incr_ntemp(); |
| @@ -638,7 +621,6 @@ static void lua_codestore (int i) | |||
| 638 | { | 621 | { |
| 639 | if (varbuffer[i] > 0) /* global var */ | 622 | if (varbuffer[i] > 0) /* global var */ |
| 640 | { | 623 | { |
| 641 | align(Word,1); | ||
| 642 | code_byte(STOREGLOBAL); | 624 | code_byte(STOREGLOBAL); |
| 643 | code_word(varbuffer[i]-1); | 625 | code_word(varbuffer[i]-1); |
| 644 | } | 626 | } |
| @@ -703,14 +685,13 @@ int lua_parse (void) | |||
| 703 | 685 | ||
| 704 | #if LISTING | 686 | #if LISTING |
| 705 | 687 | ||
| 706 | static void PrintCode (Byte *p, Byte *end) | 688 | static void PrintCode (Byte *p, Byte *end, Byte *code) |
| 707 | { | 689 | { |
| 708 | printf ("\n\nCODE\n"); | 690 | printf ("\n\nCODE\n"); |
| 709 | while (p != end) | 691 | while (p != end) |
| 710 | { | 692 | { |
| 711 | switch ((OpCode)*p) | 693 | switch ((OpCode)*p) |
| 712 | { | 694 | { |
| 713 | case NOP: printf ("%d NOP\n", (p++)-code); break; | ||
| 714 | case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break; | 695 | case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break; |
| 715 | case PUSH0: case PUSH1: case PUSH2: | 696 | case PUSH0: case PUSH1: case PUSH2: |
| 716 | printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0'); | 697 | printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0'); |
| @@ -721,16 +702,31 @@ static void PrintCode (Byte *p, Byte *end) | |||
| 721 | p++; | 702 | p++; |
| 722 | break; | 703 | break; |
| 723 | case PUSHWORD: | 704 | case PUSHWORD: |
| 724 | printf ("%d PUSHWORD %d\n", p-code, *((Word *)(p+1))); | 705 | { |
| 725 | p += 1 + sizeof(Word); | 706 | CodeWord c; |
| 707 | int n = p-code; | ||
| 708 | p++; | ||
| 709 | get_word(c,p); | ||
| 710 | printf ("%d PUSHWORD %d\n", n, c.w); | ||
| 711 | } | ||
| 726 | break; | 712 | break; |
| 727 | case PUSHFLOAT: | 713 | case PUSHFLOAT: |
| 728 | printf ("%d PUSHFLOAT %f\n", p-code, *((float *)(p+1))); | 714 | { |
| 729 | p += 1 + sizeof(float); | 715 | CodeFloat c; |
| 716 | int n = p-code; | ||
| 717 | p++; | ||
| 718 | get_float(c,p); | ||
| 719 | printf ("%d PUSHFLOAT %f\n", n, c.f); | ||
| 720 | } | ||
| 730 | break; | 721 | break; |
| 731 | case PUSHSTRING: | 722 | case PUSHSTRING: |
| 732 | printf ("%d PUSHSTRING %d\n", p-code, *((Word *)(p+1))); | 723 | { |
| 733 | p += 1 + sizeof(Word); | 724 | CodeWord c; |
| 725 | int n = p-code; | ||
| 726 | p++; | ||
| 727 | get_word(c,p); | ||
| 728 | printf ("%d PUSHSTRING %d\n", n, c.w); | ||
| 729 | } | ||
| 734 | break; | 730 | break; |
| 735 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: | 731 | case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: |
| 736 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: | 732 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: |
| @@ -742,8 +738,13 @@ static void PrintCode (Byte *p, Byte *end) | |||
| 742 | p++; | 738 | p++; |
| 743 | break; | 739 | break; |
| 744 | case PUSHGLOBAL: | 740 | case PUSHGLOBAL: |
| 745 | printf ("%d PUSHGLOBAL %d\n", p-code, *((Word *)(p+1))); | 741 | { |
| 746 | p += 1 + sizeof(Word); | 742 | CodeWord c; |
| 743 | int n = p-code; | ||
| 744 | p++; | ||
| 745 | get_word(c,p); | ||
| 746 | printf ("%d PUSHGLOBAL %d\n", n, c.w); | ||
| 747 | } | ||
| 747 | break; | 748 | break; |
| 748 | case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break; | 749 | case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break; |
| 749 | case PUSHMARK: printf ("%d PUSHMARK\n", (p++)-code); break; | 750 | case PUSHMARK: printf ("%d PUSHMARK\n", (p++)-code); break; |
| @@ -759,8 +760,13 @@ static void PrintCode (Byte *p, Byte *end) | |||
| 759 | p++; | 760 | p++; |
| 760 | break; | 761 | break; |
| 761 | case STOREGLOBAL: | 762 | case STOREGLOBAL: |
| 762 | printf ("%d STOREGLOBAL %d\n", p-code, *((Word *)(p+1))); | 763 | { |
| 763 | p += 1 + sizeof(Word); | 764 | CodeWord c; |
| 765 | int n = p-code; | ||
| 766 | p++; | ||
| 767 | get_word(c,p); | ||
| 768 | printf ("%d STOREGLOBAL %d\n", n, c.w); | ||
| 769 | } | ||
| 764 | break; | 770 | break; |
| 765 | case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break; | 771 | case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break; |
| 766 | case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); | 772 | case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); |
| @@ -794,28 +800,58 @@ static void PrintCode (Byte *p, Byte *end) | |||
| 794 | case MINUSOP: printf ("%d MINUSOP\n", (p++)-code); break; | 800 | case MINUSOP: printf ("%d MINUSOP\n", (p++)-code); break; |
| 795 | case NOTOP: printf ("%d NOTOP\n", (p++)-code); break; | 801 | case NOTOP: printf ("%d NOTOP\n", (p++)-code); break; |
| 796 | case ONTJMP: | 802 | case ONTJMP: |
| 797 | printf ("%d ONTJMP %d\n", p-code, *((Word *)(p+1))); | 803 | { |
| 798 | p += sizeof(Word) + 1; | 804 | CodeWord c; |
| 805 | int n = p-code; | ||
| 806 | p++; | ||
| 807 | get_word(c,p); | ||
| 808 | printf ("%d ONTJMP %d\n", n, c.w); | ||
| 809 | } | ||
| 799 | break; | 810 | break; |
| 800 | case ONFJMP: | 811 | case ONFJMP: |
| 801 | printf ("%d ONFJMP %d\n", p-code, *((Word *)(p+1))); | 812 | { |
| 802 | p += sizeof(Word) + 1; | 813 | CodeWord c; |
| 814 | int n = p-code; | ||
| 815 | p++; | ||
| 816 | get_word(c,p); | ||
| 817 | printf ("%d ONFJMP %d\n", n, c.w); | ||
| 818 | } | ||
| 803 | break; | 819 | break; |
| 804 | case JMP: | 820 | case JMP: |
| 805 | printf ("%d JMP %d\n", p-code, *((Word *)(p+1))); | 821 | { |
| 806 | p += sizeof(Word) + 1; | 822 | CodeWord c; |
| 823 | int n = p-code; | ||
| 824 | p++; | ||
| 825 | get_word(c,p); | ||
| 826 | printf ("%d JMP %d\n", n, c.w); | ||
| 827 | } | ||
| 807 | break; | 828 | break; |
| 808 | case UPJMP: | 829 | case UPJMP: |
| 809 | printf ("%d UPJMP %d\n", p-code, *((Word *)(p+1))); | 830 | { |
| 810 | p += sizeof(Word) + 1; | 831 | CodeWord c; |
| 832 | int n = p-code; | ||
| 833 | p++; | ||
| 834 | get_word(c,p); | ||
| 835 | printf ("%d UPJMP %d\n", n, c.w); | ||
| 836 | } | ||
| 811 | break; | 837 | break; |
| 812 | case IFFJMP: | 838 | case IFFJMP: |
| 813 | printf ("%d IFFJMP %d\n", p-code, *((Word *)(p+1))); | 839 | { |
| 814 | p += sizeof(Word) + 1; | 840 | CodeWord c; |
| 841 | int n = p-code; | ||
| 842 | p++; | ||
| 843 | get_word(c,p); | ||
| 844 | printf ("%d IFFJMP %d\n", n, c.w); | ||
| 845 | } | ||
| 815 | break; | 846 | break; |
| 816 | case IFFUPJMP: | 847 | case IFFUPJMP: |
| 817 | printf ("%d IFFUPJMP %d\n", p-code, *((Word *)(p+1))); | 848 | { |
| 818 | p += sizeof(Word) + 1; | 849 | CodeWord c; |
| 850 | int n = p-code; | ||
| 851 | p++; | ||
| 852 | get_word(c,p); | ||
| 853 | printf ("%d IFFUPJMP %d\n", n, c.w); | ||
| 854 | } | ||
| 819 | break; | 855 | break; |
| 820 | case POP: printf ("%d POP\n", (p++)-code); break; | 856 | case POP: printf ("%d POP\n", (p++)-code); break; |
| 821 | case CALLFUNC: printf ("%d CALLFUNC\n", (p++)-code); break; | 857 | case CALLFUNC: printf ("%d CALLFUNC\n", (p++)-code); break; |
| @@ -823,7 +859,7 @@ static void PrintCode (Byte *p, Byte *end) | |||
| 823 | printf ("%d RETCODE %d\n", p-code, *(++p)); | 859 | printf ("%d RETCODE %d\n", p-code, *(++p)); |
| 824 | p++; | 860 | p++; |
| 825 | break; | 861 | break; |
| 826 | default: printf ("%d Cannot happen\n", (p++)-code); break; | 862 | default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break; |
| 827 | } | 863 | } |
| 828 | } | 864 | } |
| 829 | } | 865 | } |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 1.2 1994/02/13 20:36:51 roberto Exp celes $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 1.3 1994/03/28 15:14:02 celes Exp celes $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| @@ -147,8 +147,6 @@ int lua_execute (Byte *pc) | |||
| 147 | OpCode opcode; | 147 | OpCode opcode; |
| 148 | switch (opcode = (OpCode)*pc++) | 148 | switch (opcode = (OpCode)*pc++) |
| 149 | { | 149 | { |
| 150 | case NOP: break; | ||
| 151 | |||
| 152 | case PUSHNIL: tag(top++) = T_NIL; break; | 150 | case PUSHNIL: tag(top++) = T_NIL; break; |
| 153 | 151 | ||
| 154 | case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break; | 152 | case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break; |
| @@ -158,17 +156,26 @@ int lua_execute (Byte *pc) | |||
| 158 | case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break; | 156 | case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break; |
| 159 | 157 | ||
| 160 | case PUSHWORD: | 158 | case PUSHWORD: |
| 161 | tag(top) = T_NUMBER; nvalue(top++) = *((Word *)(pc)); pc += sizeof(Word); | 159 | { |
| 160 | CodeWord code; | ||
| 161 | get_word(code,pc); | ||
| 162 | tag(top) = T_NUMBER; nvalue(top++) = code.w; | ||
| 163 | } | ||
| 162 | break; | 164 | break; |
| 163 | 165 | ||
| 164 | case PUSHFLOAT: | 166 | case PUSHFLOAT: |
| 165 | tag(top) = T_NUMBER; nvalue(top++) = *((float *)(pc)); pc += sizeof(float); | 167 | { |
| 168 | CodeFloat code; | ||
| 169 | get_float(code,pc); | ||
| 170 | tag(top) = T_NUMBER; nvalue(top++) = code.f; | ||
| 171 | } | ||
| 166 | break; | 172 | break; |
| 173 | |||
| 167 | case PUSHSTRING: | 174 | case PUSHSTRING: |
| 168 | { | 175 | { |
| 169 | int w = *((Word *)(pc)); | 176 | CodeWord code; |
| 170 | pc += sizeof(Word); | 177 | get_word(code,pc); |
| 171 | tag(top) = T_STRING; svalue(top++) = lua_constant[w]; | 178 | tag(top) = T_STRING; svalue(top++) = lua_constant[code.w]; |
| 172 | } | 179 | } |
| 173 | break; | 180 | break; |
| 174 | 181 | ||
| @@ -180,7 +187,11 @@ int lua_execute (Byte *pc) | |||
| 180 | case PUSHLOCAL: *top++ = *(base + (*pc++)); break; | 187 | case PUSHLOCAL: *top++ = *(base + (*pc++)); break; |
| 181 | 188 | ||
| 182 | case PUSHGLOBAL: | 189 | case PUSHGLOBAL: |
| 183 | *top++ = s_object(*((Word *)(pc))); pc += sizeof(Word); | 190 | { |
| 191 | CodeWord code; | ||
| 192 | get_word(code,pc); | ||
| 193 | *top++ = s_object(code.w); | ||
| 194 | } | ||
| 184 | break; | 195 | break; |
| 185 | 196 | ||
| 186 | case PUSHINDEXED: | 197 | case PUSHINDEXED: |
| @@ -209,7 +220,11 @@ int lua_execute (Byte *pc) | |||
| 209 | case STORELOCAL: *(base + (*pc++)) = *(--top); break; | 220 | case STORELOCAL: *(base + (*pc++)) = *(--top); break; |
| 210 | 221 | ||
| 211 | case STOREGLOBAL: | 222 | case STOREGLOBAL: |
| 212 | s_object(*((Word *)(pc))) = *(--top); pc += sizeof(Word); | 223 | { |
| 224 | CodeWord code; | ||
| 225 | get_word(code,pc); | ||
| 226 | s_object(code.w) = *(--top); | ||
| 227 | } | ||
| 213 | break; | 228 | break; |
| 214 | 229 | ||
| 215 | case STOREINDEXED0: | 230 | case STOREINDEXED0: |
| @@ -278,9 +293,9 @@ int lua_execute (Byte *pc) | |||
| 278 | } | 293 | } |
| 279 | while (n) | 294 | while (n) |
| 280 | { | 295 | { |
| 281 | int w = *((Word *)(pc)); | 296 | CodeWord code; |
| 282 | pc += sizeof(Word); | 297 | get_word(code,pc); |
| 283 | tag(top) = T_STRING; svalue(top) = lua_constant[w]; | 298 | tag(top) = T_STRING; svalue(top) = lua_constant[code.w]; |
| 284 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); | 299 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); |
| 285 | top--; | 300 | top--; |
| 286 | n--; | 301 | n--; |
| @@ -438,39 +453,51 @@ int lua_execute (Byte *pc) | |||
| 438 | 453 | ||
| 439 | case ONTJMP: | 454 | case ONTJMP: |
| 440 | { | 455 | { |
| 441 | int n = *((Word *)(pc)); | 456 | CodeWord code; |
| 442 | pc += sizeof(Word); | 457 | get_word(code,pc); |
| 443 | if (tag(top-1) != T_NIL) pc += n; | 458 | if (tag(top-1) != T_NIL) pc += code.w; |
| 444 | } | 459 | } |
| 445 | break; | 460 | break; |
| 446 | 461 | ||
| 447 | case ONFJMP: | 462 | case ONFJMP: |
| 448 | { | 463 | { |
| 449 | int n = *((Word *)(pc)); | 464 | CodeWord code; |
| 450 | pc += sizeof(Word); | 465 | get_word(code,pc); |
| 451 | if (tag(top-1) == T_NIL) pc += n; | 466 | if (tag(top-1) == T_NIL) pc += code.w; |
| 452 | } | 467 | } |
| 453 | break; | 468 | break; |
| 454 | 469 | ||
| 455 | case JMP: pc += *((Word *)(pc)) + sizeof(Word); break; | 470 | case JMP: |
| 471 | { | ||
| 472 | CodeWord code; | ||
| 473 | get_word(code,pc); | ||
| 474 | pc += code.w; | ||
| 475 | } | ||
| 476 | break; | ||
| 456 | 477 | ||
| 457 | case UPJMP: pc -= *((Word *)(pc)) - sizeof(Word); break; | 478 | case UPJMP: |
| 479 | { | ||
| 480 | CodeWord code; | ||
| 481 | get_word(code,pc); | ||
| 482 | pc -= code.w; | ||
| 483 | } | ||
| 484 | break; | ||
| 458 | 485 | ||
| 459 | case IFFJMP: | 486 | case IFFJMP: |
| 460 | { | 487 | { |
| 461 | int n = *((Word *)(pc)); | 488 | CodeWord code; |
| 462 | pc += sizeof(Word); | 489 | get_word(code,pc); |
| 463 | top--; | 490 | top--; |
| 464 | if (tag(top) == T_NIL) pc += n; | 491 | if (tag(top) == T_NIL) pc += code.w; |
| 465 | } | 492 | } |
| 466 | break; | 493 | break; |
| 467 | 494 | ||
| 468 | case IFFUPJMP: | 495 | case IFFUPJMP: |
| 469 | { | 496 | { |
| 470 | int n = *((Word *)(pc)); | 497 | CodeWord code; |
| 471 | pc += sizeof(Word); | 498 | get_word(code,pc); |
| 472 | top--; | 499 | top--; |
| 473 | if (tag(top) == T_NIL) pc -= n; | 500 | if (tag(top) == T_NIL) pc -= code.w; |
| 474 | } | 501 | } |
| 475 | break; | 502 | break; |
| 476 | 503 | ||
| @@ -547,19 +574,20 @@ int lua_execute (Byte *pc) | |||
| 547 | 574 | ||
| 548 | case SETFUNCTION: | 575 | case SETFUNCTION: |
| 549 | { | 576 | { |
| 550 | int file, func; | 577 | CodeWord file, func; |
| 551 | file = *((Word *)(pc)); | 578 | get_word(file,pc); |
| 552 | pc += sizeof(Word); | 579 | get_word(func,pc); |
| 553 | func = *((Word *)(pc)); | 580 | if (lua_pushfunction (file.w, func.w)) |
| 554 | pc += sizeof(Word); | ||
| 555 | if (lua_pushfunction (file, func)) | ||
| 556 | return 1; | 581 | return 1; |
| 557 | } | 582 | } |
| 558 | break; | 583 | break; |
| 559 | 584 | ||
| 560 | case SETLINE: | 585 | case SETLINE: |
| 561 | lua_debugline = *((Word *)(pc)); | 586 | { |
| 562 | pc += sizeof(Word); | 587 | CodeWord code; |
| 588 | get_word(code,pc); | ||
| 589 | lua_debugline = code.w; | ||
| 590 | } | ||
| 563 | break; | 591 | break; |
| 564 | 592 | ||
| 565 | case RESET: | 593 | case RESET: |
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** TeCGraf - PUC-Rio | 2 | ** TeCGraf - PUC-Rio |
| 3 | ** $Id: opcode.h,v 1.2 1993/12/22 21:15:16 roberto Exp roberto $ | 3 | ** $Id: opcode.h,v 1.3 1994/02/13 20:35:53 roberto Exp celes $ |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #ifndef opcode_h | 6 | #ifndef opcode_h |
| @@ -20,9 +20,20 @@ typedef unsigned char Byte; | |||
| 20 | 20 | ||
| 21 | typedef unsigned short Word; | 21 | typedef unsigned short Word; |
| 22 | 22 | ||
| 23 | typedef union | ||
| 24 | { | ||
| 25 | struct {char c1; char c2;} m; | ||
| 26 | Word w; | ||
| 27 | } CodeWord; | ||
| 28 | |||
| 29 | typedef union | ||
| 30 | { | ||
| 31 | struct {char c1; char c2; char c3; char c4;} m; | ||
| 32 | float f; | ||
| 33 | } CodeFloat; | ||
| 34 | |||
| 23 | typedef enum | 35 | typedef enum |
| 24 | { | 36 | { |
| 25 | NOP, | ||
| 26 | PUSHNIL, | 37 | PUSHNIL, |
| 27 | PUSH0, PUSH1, PUSH2, | 38 | PUSH0, PUSH1, PUSH2, |
| 28 | PUSHBYTE, | 39 | PUSHBYTE, |
| @@ -129,6 +140,11 @@ typedef struct | |||
| 129 | #define s_fvalue(i) (fvalue(&s_object(i))) | 140 | #define s_fvalue(i) (fvalue(&s_object(i))) |
| 130 | #define s_uvalue(i) (uvalue(&s_object(i))) | 141 | #define s_uvalue(i) (uvalue(&s_object(i))) |
| 131 | 142 | ||
| 143 | #define get_word(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;} | ||
| 144 | #define get_float(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\ | ||
| 145 | code.m.c3 = *pc++; code.m.c4 = *pc++;} | ||
| 146 | |||
| 147 | |||
| 132 | 148 | ||
| 133 | /* Exported functions */ | 149 | /* Exported functions */ |
| 134 | int lua_execute (Byte *pc); | 150 | int lua_execute (Byte *pc); |
