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:
Waldemar Celes
1994-04-13 18:37:20 -03:00
parent 662e2fa5cc
commit 8ca980966c
3 changed files with 194 additions and 114 deletions

190
lua.stx
View File

@@ -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;
} }
} }
} }

View File

@@ -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:

View File

@@ -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);