aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-13 18:37:20 -0300
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-13 18:37:20 -0300
commit8ca980966ca383c120dadb2c6e6a0850d1bfff58 (patch)
tree60822d655ea3fa23f54ab27b01838aa35e9fb3fa
parent662e2fa5ccf1dfa0ebea571d6785009442ba3011 (diff)
downloadlua-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.stx188
-rw-r--r--opcode.c98
-rw-r--r--opcode.h20
3 files changed, 193 insertions, 113 deletions
diff --git a/lua.stx b/lua.stx
index 3c2f6efa..d84b82ac 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 1.4 1994/02/13 20:38:20 roberto Exp celes $"; 3char *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) 55static void code_word (Word n)
60static 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
67static void code_word (Word n) 63static 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
78static void code_float (float n) 73static 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
89static void push_field (Word name) 81static 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
259PrintCode(code,pc); 247PrintCode(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
368ret : /* empty */ 355ret : /* 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
377PrepJump : /* empty */ 364PrepJump : /* 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
706static void PrintCode (Byte *p, Byte *end) 688static 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}
diff --git a/opcode.c b/opcode.c
index 5fc75b5c..aaf38b51 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 1.2 1994/02/13 20:36:51 roberto Exp celes $"; 6char *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:
diff --git a/opcode.h b/opcode.h
index 8139f9c8..f48e50fd 100644
--- a/opcode.h
+++ b/opcode.h
@@ -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
21typedef unsigned short Word; 21typedef unsigned short Word;
22 22
23typedef union
24{
25 struct {char c1; char c2;} m;
26 Word w;
27} CodeWord;
28
29typedef union
30{
31 struct {char c1; char c2; char c3; char c4;} m;
32 float f;
33} CodeFloat;
34
23typedef enum 35typedef 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 */
134int lua_execute (Byte *pc); 150int lua_execute (Byte *pc);