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.
This commit is contained in:
190
lua.stx
190
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 <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#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 $";
|
|||||||
|
|
||||||
#define LISTING 0
|
#define LISTING 0
|
||||||
|
|
||||||
#ifndef ALIGNMENT
|
|
||||||
#define ALIGNMENT (sizeof(void *))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAXCODE
|
#ifndef MAXCODE
|
||||||
#define MAXCODE 1024
|
#define MAXCODE 1024
|
||||||
#endif
|
#endif
|
||||||
@@ -56,34 +52,30 @@ static void code_byte (Byte c)
|
|||||||
*pc++ = c;
|
*pc++ = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define align(t,n) align_n(sizeof(t),n)
|
|
||||||
static void align_n (unsigned size, int gap)
|
|
||||||
{
|
|
||||||
if (size > ALIGNMENT) size = ALIGNMENT;
|
|
||||||
while (((pc+gap-code)%size) != 0) /* +gap to include BYTECODEs */
|
|
||||||
code_byte (NOP);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void code_word (Word n)
|
static void code_word (Word n)
|
||||||
{
|
{
|
||||||
if (pc-basepc>MAXCODE-sizeof(Word))
|
CodeWord code;
|
||||||
{
|
code.w = n;
|
||||||
lua_error ("code buffer overflow");
|
code_byte(code.m.c1);
|
||||||
err = 1;
|
code_byte(code.m.c2);
|
||||||
}
|
|
||||||
*((Word *)pc) = n;
|
|
||||||
pc += sizeof(Word);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void code_float (float n)
|
static void code_float (float n)
|
||||||
{
|
{
|
||||||
if (pc-basepc>MAXCODE-sizeof(float))
|
CodeFloat code;
|
||||||
{
|
code.f = n;
|
||||||
lua_error ("code buffer overflow");
|
code_byte(code.m.c1);
|
||||||
err = 1;
|
code_byte(code.m.c2);
|
||||||
}
|
code_byte(code.m.c3);
|
||||||
*((float *)pc) = n;
|
code_byte(code.m.c4);
|
||||||
pc += sizeof(float);
|
}
|
||||||
|
|
||||||
|
static void code_word_at (Byte *p, Word n)
|
||||||
|
{
|
||||||
|
CodeWord code;
|
||||||
|
code.w = n;
|
||||||
|
*p++ = code.m.c1;
|
||||||
|
*p++ = code.m.c2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void push_field (Word name)
|
static void push_field (Word name)
|
||||||
@@ -101,7 +93,6 @@ static void flush_record (int n)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (n == 0) return;
|
if (n == 0) return;
|
||||||
align(Word,2); /* two bytes before the actual word */
|
|
||||||
code_byte(STORERECORD);
|
code_byte(STORERECORD);
|
||||||
code_byte(n);
|
code_byte(n);
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
@@ -168,14 +159,12 @@ static void code_number (float f)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(PUSHWORD);
|
code_byte(PUSHWORD);
|
||||||
code_word(i);
|
code_word(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
align(float,1);
|
|
||||||
code_byte(PUSHFLOAT);
|
code_byte(PUSHFLOAT);
|
||||||
code_float(f);
|
code_float(f);
|
||||||
}
|
}
|
||||||
@@ -229,7 +218,7 @@ functionlist : /* empty */
|
|||||||
{
|
{
|
||||||
maincode=pc;
|
maincode=pc;
|
||||||
#if LISTING
|
#if LISTING
|
||||||
PrintCode(basepc,maincode);
|
PrintCode(basepc,maincode,(Byte*)mainbuffer);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
| functionlist function
|
| functionlist function
|
||||||
@@ -240,7 +229,6 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
|
|||||||
{
|
{
|
||||||
if (lua_debug)
|
if (lua_debug)
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(SETFUNCTION);
|
code_byte(SETFUNCTION);
|
||||||
code_word(lua_nfile-1);
|
code_word(lua_nfile-1);
|
||||||
code_word($2);
|
code_word($2);
|
||||||
@@ -256,7 +244,7 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
|
|||||||
s_bvalue($2) = calloc (pc-code, sizeof(Byte));
|
s_bvalue($2) = calloc (pc-code, sizeof(Byte));
|
||||||
memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte));
|
memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte));
|
||||||
#if LISTING
|
#if LISTING
|
||||||
PrintCode(code,pc);
|
PrintCode(code,pc,(Byte*)buffer);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@@ -269,7 +257,7 @@ stat : {
|
|||||||
ntemp = 0;
|
ntemp = 0;
|
||||||
if (lua_debug)
|
if (lua_debug)
|
||||||
{
|
{
|
||||||
align(Word,1); code_byte(SETLINE); code_word(lua_linenumber);
|
code_byte(SETLINE); code_word(lua_linenumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stat1
|
stat1
|
||||||
@@ -284,16 +272,15 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
|
|||||||
if (pc - elseinit == 0) /* no else */
|
if (pc - elseinit == 0) /* no else */
|
||||||
{
|
{
|
||||||
pc -= sizeof(Word)+1;
|
pc -= sizeof(Word)+1;
|
||||||
/* if (*(pc-1) == NOP) --pc; */
|
|
||||||
elseinit = pc;
|
elseinit = pc;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*($6) = JMP;
|
*($6) = JMP;
|
||||||
*((Word *)($6+1)) = pc - elseinit;
|
code_word_at($6+1, pc - elseinit);
|
||||||
}
|
}
|
||||||
*($4) = IFFJMP;
|
*($4) = IFFJMP;
|
||||||
*((Word *)($4+1)) = elseinit - ($4 + sizeof(Word)+1);
|
code_word_at($4+1, elseinit - ($4 + sizeof(Word)+1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,17 +288,17 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
|
|||||||
|
|
||||||
{
|
{
|
||||||
*($5) = IFFJMP;
|
*($5) = IFFJMP;
|
||||||
*((Word *)($5+1)) = pc - ($5 + sizeof(Word)+1);
|
code_word_at($5+1, pc - ($5 + sizeof(Word)+1));
|
||||||
|
|
||||||
*($7) = UPJMP;
|
*($7) = UPJMP;
|
||||||
*((Word *)($7+1)) = pc - $<pByte>2;
|
code_word_at($7+1, pc - $<pByte>2);
|
||||||
}
|
}
|
||||||
|
|
||||||
| REPEAT {$<pByte>$ = pc;} block UNTIL expr1 PrepJump
|
| REPEAT {$<pByte>$ = pc;} block UNTIL expr1 PrepJump
|
||||||
|
|
||||||
{
|
{
|
||||||
*($6) = IFFUPJMP;
|
*($6) = IFFUPJMP;
|
||||||
*((Word *)($6+1)) = pc - $<pByte>2;
|
code_word_at($6+1, pc - $<pByte>2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -347,10 +334,10 @@ elsepart : /* empty */
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
*($6) = JMP;
|
*($6) = JMP;
|
||||||
*((Word *)($6+1)) = pc - elseinit;
|
code_word_at($6+1, pc - elseinit);
|
||||||
}
|
}
|
||||||
*($4) = IFFJMP;
|
*($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 : {$<vInt>$ = nlocalvar;} statlist {ntemp = 0;} ret
|
|||||||
;
|
;
|
||||||
|
|
||||||
ret : /* empty */
|
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
|
RETURN exprlist sc
|
||||||
{
|
{
|
||||||
if (lua_debug) code_byte(RESET);
|
if (lua_debug) code_byte(RESET);
|
||||||
@@ -376,7 +363,6 @@ ret : /* empty */
|
|||||||
|
|
||||||
PrepJump : /* empty */
|
PrepJump : /* empty */
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
$$ = pc;
|
$$ = pc;
|
||||||
code_byte(0); /* open space */
|
code_byte(0); /* open space */
|
||||||
code_word (0);
|
code_word (0);
|
||||||
@@ -409,7 +395,6 @@ expr : '(' expr ')' { $$ = $2; }
|
|||||||
| NUMBER { code_number($1); $$ = 1; }
|
| NUMBER { code_number($1); $$ = 1; }
|
||||||
| STRING
|
| STRING
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(PUSHSTRING);
|
code_byte(PUSHSTRING);
|
||||||
code_word($1);
|
code_word($1);
|
||||||
$$ = 1;
|
$$ = 1;
|
||||||
@@ -421,20 +406,20 @@ expr : '(' expr ')' { $$ = $2; }
|
|||||||
$$ = 0;
|
$$ = 0;
|
||||||
if (lua_debug)
|
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;}
|
| NOT expr1 { code_byte(NOTOP); $$ = 1;}
|
||||||
| expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1
|
| expr1 AND PrepJump {code_byte(POP); ntemp--;} expr1
|
||||||
{
|
{
|
||||||
*($3) = ONFJMP;
|
*($3) = ONFJMP;
|
||||||
*((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1);
|
code_word_at($3+1, pc - ($3 + sizeof(Word)+1));
|
||||||
$$ = 1;
|
$$ = 1;
|
||||||
}
|
}
|
||||||
| expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1
|
| expr1 OR PrepJump {code_byte(POP); ntemp--;} expr1
|
||||||
{
|
{
|
||||||
*($3) = ONTJMP;
|
*($3) = ONTJMP;
|
||||||
*((Word *)($3+1)) = pc - ($3 + sizeof(Word)+1);
|
code_word_at($3+1, pc - ($3 + sizeof(Word)+1));
|
||||||
$$ = 1;
|
$$ = 1;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@@ -465,7 +450,7 @@ typeconstructor: '@'
|
|||||||
$$ = 0;
|
$$ = 0;
|
||||||
if (lua_debug)
|
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
|
| var {lua_pushvar ($1);} '.' NAME
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(PUSHSTRING);
|
code_byte(PUSHSTRING);
|
||||||
code_word(lua_findconstant (s_name($4))); incr_ntemp();
|
code_word(lua_findconstant (s_name($4))); incr_ntemp();
|
||||||
$$ = 0; /* indexed variable */
|
$$ = 0; /* indexed variable */
|
||||||
@@ -605,7 +589,6 @@ static void lua_pushvar (long number)
|
|||||||
{
|
{
|
||||||
if (number > 0) /* global var */
|
if (number > 0) /* global var */
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(PUSHGLOBAL);
|
code_byte(PUSHGLOBAL);
|
||||||
code_word(number-1);
|
code_word(number-1);
|
||||||
incr_ntemp();
|
incr_ntemp();
|
||||||
@@ -638,7 +621,6 @@ static void lua_codestore (int i)
|
|||||||
{
|
{
|
||||||
if (varbuffer[i] > 0) /* global var */
|
if (varbuffer[i] > 0) /* global var */
|
||||||
{
|
{
|
||||||
align(Word,1);
|
|
||||||
code_byte(STOREGLOBAL);
|
code_byte(STOREGLOBAL);
|
||||||
code_word(varbuffer[i]-1);
|
code_word(varbuffer[i]-1);
|
||||||
}
|
}
|
||||||
@@ -703,14 +685,13 @@ int lua_parse (void)
|
|||||||
|
|
||||||
#if LISTING
|
#if LISTING
|
||||||
|
|
||||||
static void PrintCode (Byte *p, Byte *end)
|
static void PrintCode (Byte *p, Byte *end, Byte *code)
|
||||||
{
|
{
|
||||||
printf ("\n\nCODE\n");
|
printf ("\n\nCODE\n");
|
||||||
while (p != end)
|
while (p != end)
|
||||||
{
|
{
|
||||||
switch ((OpCode)*p)
|
switch ((OpCode)*p)
|
||||||
{
|
{
|
||||||
case NOP: printf ("%d NOP\n", (p++)-code); break;
|
|
||||||
case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break;
|
case PUSHNIL: printf ("%d PUSHNIL\n", (p++)-code); break;
|
||||||
case PUSH0: case PUSH1: case PUSH2:
|
case PUSH0: case PUSH1: case PUSH2:
|
||||||
printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0');
|
printf ("%d PUSH%c\n", p-code, *p-PUSH0+'0');
|
||||||
@@ -721,16 +702,31 @@ static void PrintCode (Byte *p, Byte *end)
|
|||||||
p++;
|
p++;
|
||||||
break;
|
break;
|
||||||
case PUSHWORD:
|
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;
|
break;
|
||||||
case PUSHFLOAT:
|
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;
|
break;
|
||||||
case PUSHSTRING:
|
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;
|
break;
|
||||||
case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3:
|
case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3:
|
||||||
case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
|
case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7:
|
||||||
@@ -742,8 +738,13 @@ static void PrintCode (Byte *p, Byte *end)
|
|||||||
p++;
|
p++;
|
||||||
break;
|
break;
|
||||||
case PUSHGLOBAL:
|
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;
|
break;
|
||||||
case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break;
|
case PUSHINDEXED: printf ("%d PUSHINDEXED\n", (p++)-code); break;
|
||||||
case PUSHMARK: printf ("%d PUSHMARK\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++;
|
p++;
|
||||||
break;
|
break;
|
||||||
case STOREGLOBAL:
|
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;
|
break;
|
||||||
case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break;
|
case STOREINDEXED0: printf ("%d STOREINDEXED0\n", (p++)-code); break;
|
||||||
case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p));
|
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 MINUSOP: printf ("%d MINUSOP\n", (p++)-code); break;
|
||||||
case NOTOP: printf ("%d NOTOP\n", (p++)-code); break;
|
case NOTOP: printf ("%d NOTOP\n", (p++)-code); break;
|
||||||
case ONTJMP:
|
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;
|
break;
|
||||||
case ONFJMP:
|
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;
|
break;
|
||||||
case JMP:
|
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;
|
break;
|
||||||
case UPJMP:
|
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;
|
break;
|
||||||
case IFFJMP:
|
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;
|
break;
|
||||||
case IFFUPJMP:
|
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;
|
break;
|
||||||
case POP: printf ("%d POP\n", (p++)-code); break;
|
case POP: printf ("%d POP\n", (p++)-code); break;
|
||||||
case CALLFUNC: printf ("%d CALLFUNC\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));
|
printf ("%d RETCODE %d\n", p-code, *(++p));
|
||||||
p++;
|
p++;
|
||||||
break;
|
break;
|
||||||
default: printf ("%d Cannot happen\n", (p++)-code); break;
|
default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
98
opcode.c
98
opcode.c
@@ -3,7 +3,7 @@
|
|||||||
** TecCGraf - PUC-Rio
|
** TecCGraf - PUC-Rio
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *rcs_opcode="$Id: opcode.c,v 1.2 1994/02/13 20:36:51 roberto Exp celes $";
|
char *rcs_opcode="$Id: opcode.c,v 1.3 1994/03/28 15:14:02 celes Exp celes $";
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -147,8 +147,6 @@ int lua_execute (Byte *pc)
|
|||||||
OpCode opcode;
|
OpCode opcode;
|
||||||
switch (opcode = (OpCode)*pc++)
|
switch (opcode = (OpCode)*pc++)
|
||||||
{
|
{
|
||||||
case NOP: break;
|
|
||||||
|
|
||||||
case PUSHNIL: tag(top++) = T_NIL; break;
|
case PUSHNIL: tag(top++) = T_NIL; break;
|
||||||
|
|
||||||
case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break;
|
case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break;
|
||||||
@@ -158,17 +156,26 @@ int lua_execute (Byte *pc)
|
|||||||
case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break;
|
case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break;
|
||||||
|
|
||||||
case PUSHWORD:
|
case PUSHWORD:
|
||||||
tag(top) = T_NUMBER; nvalue(top++) = *((Word *)(pc)); pc += sizeof(Word);
|
{
|
||||||
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
tag(top) = T_NUMBER; nvalue(top++) = code.w;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUSHFLOAT:
|
case PUSHFLOAT:
|
||||||
tag(top) = T_NUMBER; nvalue(top++) = *((float *)(pc)); pc += sizeof(float);
|
{
|
||||||
|
CodeFloat code;
|
||||||
|
get_float(code,pc);
|
||||||
|
tag(top) = T_NUMBER; nvalue(top++) = code.f;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUSHSTRING:
|
case PUSHSTRING:
|
||||||
{
|
{
|
||||||
int w = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
tag(top) = T_STRING; svalue(top++) = lua_constant[w];
|
tag(top) = T_STRING; svalue(top++) = lua_constant[code.w];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -180,7 +187,11 @@ int lua_execute (Byte *pc)
|
|||||||
case PUSHLOCAL: *top++ = *(base + (*pc++)); break;
|
case PUSHLOCAL: *top++ = *(base + (*pc++)); break;
|
||||||
|
|
||||||
case PUSHGLOBAL:
|
case PUSHGLOBAL:
|
||||||
*top++ = s_object(*((Word *)(pc))); pc += sizeof(Word);
|
{
|
||||||
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
*top++ = s_object(code.w);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PUSHINDEXED:
|
case PUSHINDEXED:
|
||||||
@@ -209,7 +220,11 @@ int lua_execute (Byte *pc)
|
|||||||
case STORELOCAL: *(base + (*pc++)) = *(--top); break;
|
case STORELOCAL: *(base + (*pc++)) = *(--top); break;
|
||||||
|
|
||||||
case STOREGLOBAL:
|
case STOREGLOBAL:
|
||||||
s_object(*((Word *)(pc))) = *(--top); pc += sizeof(Word);
|
{
|
||||||
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
s_object(code.w) = *(--top);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STOREINDEXED0:
|
case STOREINDEXED0:
|
||||||
@@ -278,9 +293,9 @@ int lua_execute (Byte *pc)
|
|||||||
}
|
}
|
||||||
while (n)
|
while (n)
|
||||||
{
|
{
|
||||||
int w = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
tag(top) = T_STRING; svalue(top) = lua_constant[w];
|
tag(top) = T_STRING; svalue(top) = lua_constant[code.w];
|
||||||
*(lua_hashdefine (avalue(arr), top)) = *(top-1);
|
*(lua_hashdefine (avalue(arr), top)) = *(top-1);
|
||||||
top--;
|
top--;
|
||||||
n--;
|
n--;
|
||||||
@@ -438,39 +453,51 @@ int lua_execute (Byte *pc)
|
|||||||
|
|
||||||
case ONTJMP:
|
case ONTJMP:
|
||||||
{
|
{
|
||||||
int n = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
if (tag(top-1) != T_NIL) pc += n;
|
if (tag(top-1) != T_NIL) pc += code.w;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ONFJMP:
|
case ONFJMP:
|
||||||
{
|
{
|
||||||
int n = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
if (tag(top-1) == T_NIL) pc += n;
|
if (tag(top-1) == T_NIL) pc += code.w;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JMP: pc += *((Word *)(pc)) + sizeof(Word); break;
|
case JMP:
|
||||||
|
{
|
||||||
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
pc += code.w;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case UPJMP: pc -= *((Word *)(pc)) - sizeof(Word); break;
|
case UPJMP:
|
||||||
|
{
|
||||||
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
pc -= code.w;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case IFFJMP:
|
case IFFJMP:
|
||||||
{
|
{
|
||||||
int n = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
top--;
|
top--;
|
||||||
if (tag(top) == T_NIL) pc += n;
|
if (tag(top) == T_NIL) pc += code.w;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IFFUPJMP:
|
case IFFUPJMP:
|
||||||
{
|
{
|
||||||
int n = *((Word *)(pc));
|
CodeWord code;
|
||||||
pc += sizeof(Word);
|
get_word(code,pc);
|
||||||
top--;
|
top--;
|
||||||
if (tag(top) == T_NIL) pc -= n;
|
if (tag(top) == T_NIL) pc -= code.w;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -547,19 +574,20 @@ int lua_execute (Byte *pc)
|
|||||||
|
|
||||||
case SETFUNCTION:
|
case SETFUNCTION:
|
||||||
{
|
{
|
||||||
int file, func;
|
CodeWord file, func;
|
||||||
file = *((Word *)(pc));
|
get_word(file,pc);
|
||||||
pc += sizeof(Word);
|
get_word(func,pc);
|
||||||
func = *((Word *)(pc));
|
if (lua_pushfunction (file.w, func.w))
|
||||||
pc += sizeof(Word);
|
|
||||||
if (lua_pushfunction (file, func))
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SETLINE:
|
case SETLINE:
|
||||||
lua_debugline = *((Word *)(pc));
|
{
|
||||||
pc += sizeof(Word);
|
CodeWord code;
|
||||||
|
get_word(code,pc);
|
||||||
|
lua_debugline = code.w;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RESET:
|
case RESET:
|
||||||
|
|||||||
20
opcode.h
20
opcode.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
** TeCGraf - PUC-Rio
|
** TeCGraf - PUC-Rio
|
||||||
** $Id: opcode.h,v 1.2 1993/12/22 21:15:16 roberto Exp roberto $
|
** $Id: opcode.h,v 1.3 1994/02/13 20:35:53 roberto Exp celes $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef opcode_h
|
#ifndef opcode_h
|
||||||
@@ -20,9 +20,20 @@ typedef unsigned char Byte;
|
|||||||
|
|
||||||
typedef unsigned short Word;
|
typedef unsigned short Word;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {char c1; char c2;} m;
|
||||||
|
Word w;
|
||||||
|
} CodeWord;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct {char c1; char c2; char c3; char c4;} m;
|
||||||
|
float f;
|
||||||
|
} CodeFloat;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
NOP,
|
|
||||||
PUSHNIL,
|
PUSHNIL,
|
||||||
PUSH0, PUSH1, PUSH2,
|
PUSH0, PUSH1, PUSH2,
|
||||||
PUSHBYTE,
|
PUSHBYTE,
|
||||||
@@ -129,6 +140,11 @@ typedef struct
|
|||||||
#define s_fvalue(i) (fvalue(&s_object(i)))
|
#define s_fvalue(i) (fvalue(&s_object(i)))
|
||||||
#define s_uvalue(i) (uvalue(&s_object(i)))
|
#define s_uvalue(i) (uvalue(&s_object(i)))
|
||||||
|
|
||||||
|
#define get_word(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;}
|
||||||
|
#define get_float(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\
|
||||||
|
code.m.c3 = *pc++; code.m.c4 = *pc++;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Exported functions */
|
/* Exported functions */
|
||||||
int lua_execute (Byte *pc);
|
int lua_execute (Byte *pc);
|
||||||
|
|||||||
Reference in New Issue
Block a user