From 8ca980966ca383c120dadb2c6e6a0850d1bfff58 Mon Sep 17 00:00:00 2001 From: Waldemar Celes Date: Wed, 13 Apr 1994 18:37:20 -0300 Subject: 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. --- lua.stx | 188 ++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 112 insertions(+), 76 deletions(-) (limited to 'lua.stx') diff --git a/lua.stx b/lua.stx index 3c2f6efa..d84b82ac 100644 --- a/lua.stx +++ b/lua.stx @@ -1,6 +1,6 @@ %{ -char *rcs_luastx = "$Id: lua.stx,v 1.4 1994/02/13 20:38:20 roberto Exp celes $"; +char *rcs_luastx = "$Id: lua.stx,v 1.5 1994/03/28 15:14:54 celes Exp celes $"; #include #include @@ -16,10 +16,6 @@ char *rcs_luastx = "$Id: lua.stx,v 1.4 1994/02/13 20:38:20 roberto Exp celes $"; #define LISTING 0 -#ifndef ALIGNMENT -#define ALIGNMENT (sizeof(void *)) -#endif - #ifndef MAXCODE #define MAXCODE 1024 #endif @@ -56,34 +52,30 @@ static void code_byte (Byte c) *pc++ = c; } -#define align(t,n) align_n(sizeof(t),n) -static void align_n (unsigned size, int gap) +static void code_word (Word n) { - if (size > ALIGNMENT) size = ALIGNMENT; - while (((pc+gap-code)%size) != 0) /* +gap to include BYTECODEs */ - code_byte (NOP); + CodeWord code; + code.w = n; + code_byte(code.m.c1); + code_byte(code.m.c2); } -static void code_word (Word n) +static void code_float (float n) { - if (pc-basepc>MAXCODE-sizeof(Word)) - { - lua_error ("code buffer overflow"); - err = 1; - } - *((Word *)pc) = n; - pc += sizeof(Word); + CodeFloat code; + code.f = n; + code_byte(code.m.c1); + code_byte(code.m.c2); + code_byte(code.m.c3); + code_byte(code.m.c4); } -static void code_float (float n) +static void code_word_at (Byte *p, Word n) { - if (pc-basepc>MAXCODE-sizeof(float)) - { - lua_error ("code buffer overflow"); - err = 1; - } - *((float *)pc) = n; - pc += sizeof(float); + CodeWord code; + code.w = n; + *p++ = code.m.c1; + *p++ = code.m.c2; } static void push_field (Word name) @@ -101,7 +93,6 @@ static void flush_record (int n) { int i; if (n == 0) return; - align(Word,2); /* two bytes before the actual word */ code_byte(STORERECORD); code_byte(n); for (i=0; i2; + code_word_at($7+1, pc - $2); } | REPEAT {$$ = pc;} block UNTIL expr1 PrepJump { *($6) = IFFUPJMP; - *((Word *)($6+1)) = pc - $2; + code_word_at($6+1, pc - $2); } @@ -347,10 +334,10 @@ elsepart : /* empty */ else { *($6) = JMP; - *((Word *)($6+1)) = pc - elseinit; + code_word_at($6+1, pc - elseinit); } *($4) = IFFJMP; - *((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1); + code_word_at($4+1, elseinit - ($4 + sizeof(Word)+1)); } } ; @@ -366,7 +353,7 @@ block : {$$ = nlocalvar;} statlist {ntemp = 0;} ret ; ret : /* empty */ - | { if (lua_debug){align(Word,1);code_byte(SETLINE);code_word(lua_linenumber);}} + | { if (lua_debug){code_byte(SETLINE);code_word(lua_linenumber);}} RETURN exprlist sc { if (lua_debug) code_byte(RESET); @@ -376,7 +363,6 @@ ret : /* empty */ PrepJump : /* empty */ { - align(Word,1); $$ = pc; code_byte(0); /* open space */ code_word (0); @@ -409,7 +395,6 @@ expr : '(' expr ')' { $$ = $2; } | NUMBER { code_number($1); $$ = 1; } | STRING { - align(Word,1); code_byte(PUSHSTRING); code_word($1); $$ = 1; @@ -421,20 +406,20 @@ expr : '(' expr ')' { $$ = $2; } $$ = 0; if (lua_debug) { - align(Word,1); code_byte(SETLINE); code_word(lua_linenumber); + code_byte(SETLINE); code_word(lua_linenumber); } } | NOT expr1 { code_byte(NOTOP); $$ = 1;} | expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1 { *($3) = ONFJMP; - *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1); + code_word_at($3+1, pc - ($3 + sizeof(Word)+1)); $$ = 1; } | expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1 { *($3) = ONTJMP; - *((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1); + code_word_at($3+1, pc - ($3 + sizeof(Word)+1)); $$ = 1; } ; @@ -465,7 +450,7 @@ typeconstructor: '@' $$ = 0; if (lua_debug) { - align(Word,1); code_byte(SETLINE); code_word(lua_linenumber); + code_byte(SETLINE); code_word(lua_linenumber); } } } @@ -566,7 +551,6 @@ var : NAME } | var {lua_pushvar ($1);} '.' NAME { - align(Word,1); code_byte(PUSHSTRING); code_word(lua_findconstant (s_name($4))); incr_ntemp(); $$ = 0; /* indexed variable */ @@ -605,7 +589,6 @@ static void lua_pushvar (long number) { if (number > 0) /* global var */ { - align(Word,1); code_byte(PUSHGLOBAL); code_word(number-1); incr_ntemp(); @@ -638,7 +621,6 @@ static void lua_codestore (int i) { if (varbuffer[i] > 0) /* global var */ { - align(Word,1); code_byte(STOREGLOBAL); code_word(varbuffer[i]-1); } @@ -703,14 +685,13 @@ int lua_parse (void) #if LISTING -static void PrintCode (Byte *p, Byte *end) +static void PrintCode (Byte *p, Byte *end, Byte *code) { printf ("\n\nCODE\n"); while (p != end) { switch ((OpCode)*p) { - case NOP: printf ("%d NOP\n", (p++)-code); break; case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break; case PUSH0: case PUSH1: case PUSH2: printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0'); @@ -721,16 +702,31 @@ static void PrintCode (Byte *p, Byte *end) p++; break; case PUSHWORD: - printf ("%d PUSHWORD %d\n", p-code, *((Word *)(p+1))); - p += 1 + sizeof(Word); + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d PUSHWORD %d\n", n, c.w); + } break; case PUSHFLOAT: - printf ("%d PUSHFLOAT %f\n", p-code, *((float *)(p+1))); - p += 1 + sizeof(float); + { + CodeFloat c; + int n = p-code; + p++; + get_float(c,p); + printf ("%d PUSHFLOAT %f\n", n, c.f); + } break; case PUSHSTRING: - printf ("%d PUSHSTRING %d\n", p-code, *((Word *)(p+1))); - p += 1 + sizeof(Word); + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d PUSHSTRING %d\n", n, c.w); + } break; case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: @@ -742,8 +738,13 @@ static void PrintCode (Byte *p, Byte *end) p++; break; case PUSHGLOBAL: - printf ("%d PUSHGLOBAL %d\n", p-code, *((Word *)(p+1))); - p += 1 + sizeof(Word); + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d PUSHGLOBAL %d\n", n, c.w); + } break; case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break; case PUSHMARK: printf ("%d PUSHMARK\n", (p++)-code); break; @@ -759,8 +760,13 @@ static void PrintCode (Byte *p, Byte *end) p++; break; case STOREGLOBAL: - printf ("%d STOREGLOBAL %d\n", p-code, *((Word *)(p+1))); - p += 1 + sizeof(Word); + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d STOREGLOBAL %d\n", n, c.w); + } break; case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break; case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); @@ -794,28 +800,58 @@ static void PrintCode (Byte *p, Byte *end) case MINUSOP: printf ("%d MINUSOP\n", (p++)-code); break; case NOTOP: printf ("%d NOTOP\n", (p++)-code); break; case ONTJMP: - printf ("%d ONTJMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d ONTJMP %d\n", n, c.w); + } break; case ONFJMP: - printf ("%d ONFJMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d ONFJMP %d\n", n, c.w); + } break; case JMP: - printf ("%d JMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d JMP %d\n", n, c.w); + } break; case UPJMP: - printf ("%d UPJMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d UPJMP %d\n", n, c.w); + } break; case IFFJMP: - printf ("%d IFFJMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d IFFJMP %d\n", n, c.w); + } break; case IFFUPJMP: - printf ("%d IFFUPJMP %d\n", p-code, *((Word *)(p+1))); - p += sizeof(Word) + 1; + { + CodeWord c; + int n = p-code; + p++; + get_word(c,p); + printf ("%d IFFUPJMP %d\n", n, c.w); + } break; case POP: printf ("%d POP\n", (p++)-code); break; case CALLFUNC: printf ("%d CALLFUNC\n", (p++)-code); break; @@ -823,7 +859,7 @@ static void PrintCode (Byte *p, Byte *end) printf ("%d RETCODE %d\n", p-code, *(++p)); p++; break; - default: printf ("%d Cannot happen\n", (p++)-code); break; + default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break; } } } -- cgit v1.2.3-55-g6feb