Make the compiled bytecode more portable by requiring that the generic int sizes be 32 bits. In addition, swap 32 bit ints and 64 bit doubles as needed.
This commit is contained in:
@@ -786,7 +786,7 @@ static int luaK_code (FuncState *fs, Instruction i, int line) {
|
|||||||
MAX_INT, "code size overflow");
|
MAX_INT, "code size overflow");
|
||||||
f->code[fs->pc] = i;
|
f->code[fs->pc] = i;
|
||||||
/* save corresponding line information */
|
/* save corresponding line information */
|
||||||
luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
|
luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, uint32_t,
|
||||||
MAX_INT, "code size overflow");
|
MAX_INT, "code size overflow");
|
||||||
f->lineinfo[fs->pc] = line;
|
f->lineinfo[fs->pc] = line;
|
||||||
return fs->pc++;
|
return fs->pc++;
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ static void collectvalidlines (lua_State *L, Closure *f) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Table *t = luaH_new(L, 0, 0);
|
Table *t = luaH_new(L, 0, 0);
|
||||||
int *lineinfo = f->l.p->lineinfo;
|
uint32_t *lineinfo = f->l.p->lineinfo;
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<f->l.p->sizelineinfo; i++)
|
for (i=0; i<f->l.p->sizelineinfo; i++)
|
||||||
setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);
|
setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
|
#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
|
||||||
|
|
||||||
#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0)
|
#define getline(f,pc) (((f)->lineinfo) ? (int)(f)->lineinfo[pc] : 0)
|
||||||
|
|
||||||
#define resethookcount(L) (L->hookcount = L->basehookcount)
|
#define resethookcount(L) (L->hookcount = L->basehookcount)
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ static void DumpChar(int y, DumpState* D)
|
|||||||
DumpVar(x,D);
|
DumpVar(x,D);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DumpInt(int x, DumpState* D)
|
static void DumpInt(uint32_t x, DumpState* D)
|
||||||
{
|
{
|
||||||
DumpVar(x,D);
|
DumpVar(x,D);
|
||||||
}
|
}
|
||||||
@@ -62,13 +62,12 @@ static void DumpString(const TString* s, DumpState* D)
|
|||||||
{
|
{
|
||||||
if (s==NULL || getstr(s)==NULL)
|
if (s==NULL || getstr(s)==NULL)
|
||||||
{
|
{
|
||||||
size_t size=0;
|
DumpInt(0,D);
|
||||||
DumpVar(size,D);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t size=s->tsv.len+1; /* include trailing '\0' */
|
lu_int32 size=s->tsv.len+1; /* include trailing '\0' */
|
||||||
DumpVar(size,D);
|
DumpInt(size,D);
|
||||||
DumpBlock(getstr(s),size,D);
|
DumpBlock(getstr(s),size,D);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -112,7 +111,7 @@ static void DumpDebug(const Proto* f, DumpState* D)
|
|||||||
{
|
{
|
||||||
int i,n;
|
int i,n;
|
||||||
n= (D->strip) ? 0 : f->sizelineinfo;
|
n= (D->strip) ? 0 : f->sizelineinfo;
|
||||||
DumpVector(f->lineinfo,n,sizeof(int),D);
|
DumpVector(f->lineinfo,n,sizeof(uint32_t),D);
|
||||||
n= (D->strip) ? 0 : f->sizelocvars;
|
n= (D->strip) ? 0 : f->sizelocvars;
|
||||||
DumpInt(n,D);
|
DumpInt(n,D);
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ typedef struct Proto {
|
|||||||
TValue *k; /* constants used by the function */
|
TValue *k; /* constants used by the function */
|
||||||
Instruction *code;
|
Instruction *code;
|
||||||
struct Proto **p; /* functions defined inside the function */
|
struct Proto **p; /* functions defined inside the function */
|
||||||
int *lineinfo; /* map from opcodes to source lines */
|
uint32_t *lineinfo; /* map from opcodes to source lines */
|
||||||
struct LocVar *locvars; /* information about local variables */
|
struct LocVar *locvars; /* information about local variables */
|
||||||
TString **upvalues; /* upvalue names */
|
TString **upvalues; /* upvalue names */
|
||||||
TString *source;
|
TString *source;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ typedef struct {
|
|||||||
ZIO* Z;
|
ZIO* Z;
|
||||||
Mbuffer* b;
|
Mbuffer* b;
|
||||||
const char* name;
|
const char* name;
|
||||||
|
int flip;
|
||||||
} LoadState;
|
} LoadState;
|
||||||
|
|
||||||
#ifdef LUAC_TRUST_BINARIES
|
#ifdef LUAC_TRUST_BINARIES
|
||||||
@@ -44,6 +45,9 @@ static void error(LoadState* S, const char* why)
|
|||||||
#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x))
|
#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x))
|
||||||
#define LoadVector(S,b,n,size) LoadMem(S,b,n,size)
|
#define LoadVector(S,b,n,size) LoadMem(S,b,n,size)
|
||||||
|
|
||||||
|
/* XXX: Use optimized versions if they exist. */
|
||||||
|
#define Swap32(n) ( ((n)>>24) | (((n)>>8) & 0x0000FF00) | (((n)<<8) & 0x00FF0000) | ((n)<<24) )
|
||||||
|
|
||||||
static void LoadBlock(LoadState* S, void* b, size_t size)
|
static void LoadBlock(LoadState* S, void* b, size_t size)
|
||||||
{
|
{
|
||||||
size_t r=luaZ_read(S->Z,b,size);
|
size_t r=luaZ_read(S->Z,b,size);
|
||||||
@@ -59,8 +63,10 @@ static int LoadChar(LoadState* S)
|
|||||||
|
|
||||||
static int LoadInt(LoadState* S)
|
static int LoadInt(LoadState* S)
|
||||||
{
|
{
|
||||||
int x;
|
uint32_t x;
|
||||||
LoadVar(S,x);
|
LoadVar(S,x);
|
||||||
|
if (S->flip)
|
||||||
|
x = Swap32(x);
|
||||||
IF (x<0, "bad integer");
|
IF (x<0, "bad integer");
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
@@ -69,13 +75,26 @@ static lua_Number LoadNumber(LoadState* S)
|
|||||||
{
|
{
|
||||||
lua_Number x;
|
lua_Number x;
|
||||||
LoadVar(S,x);
|
LoadVar(S,x);
|
||||||
return x;
|
if (!S->flip)
|
||||||
|
return x;
|
||||||
|
#ifdef LUA_NUMBER_DOUBLE
|
||||||
|
union { double d; struct { uint32_t l; uint32_t h; } i; } u;
|
||||||
|
u.d = x;
|
||||||
|
uint32_t temp = Swap32(u.i.l);
|
||||||
|
u.i.l = Swap32(u.i.h);
|
||||||
|
u.i.h = temp;
|
||||||
|
return u.d;
|
||||||
|
#else
|
||||||
|
union { float f; uint32_t i } u;
|
||||||
|
u.f = x;
|
||||||
|
u.i = Swap32(u.i);
|
||||||
|
return u.f;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static TString* LoadString(LoadState* S)
|
static TString* LoadString(LoadState* S)
|
||||||
{
|
{
|
||||||
size_t size;
|
int size=LoadInt(S);
|
||||||
LoadVar(S,size);
|
|
||||||
if (size==0)
|
if (size==0)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
@@ -92,6 +111,11 @@ static void LoadCode(LoadState* S, Proto* f)
|
|||||||
f->code=luaM_newvector(S->L,n,Instruction);
|
f->code=luaM_newvector(S->L,n,Instruction);
|
||||||
f->sizecode=n;
|
f->sizecode=n;
|
||||||
LoadVector(S,f->code,n,sizeof(Instruction));
|
LoadVector(S,f->code,n,sizeof(Instruction));
|
||||||
|
if (!S->flip)
|
||||||
|
return;
|
||||||
|
int i;
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
f->code[i] = Swap32(f->code[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Proto* LoadFunction(LoadState* S, TString* p);
|
static Proto* LoadFunction(LoadState* S, TString* p);
|
||||||
@@ -137,9 +161,12 @@ static void LoadDebug(LoadState* S, Proto* f)
|
|||||||
{
|
{
|
||||||
int i,n;
|
int i,n;
|
||||||
n=LoadInt(S);
|
n=LoadInt(S);
|
||||||
f->lineinfo=luaM_newvector(S->L,n,int);
|
f->lineinfo=luaM_newvector(S->L,n,uint32_t);
|
||||||
f->sizelineinfo=n;
|
f->sizelineinfo=n;
|
||||||
LoadVector(S,f->lineinfo,n,sizeof(int));
|
LoadVector(S,f->lineinfo,n,sizeof(uint32_t));
|
||||||
|
if (S->flip)
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
f->lineinfo[i] = Swap32(f->lineinfo[i]);
|
||||||
n=LoadInt(S);
|
n=LoadInt(S);
|
||||||
f->locvars=luaM_newvector(S->L,n,LocVar);
|
f->locvars=luaM_newvector(S->L,n,LocVar);
|
||||||
f->sizelocvars=n;
|
f->sizelocvars=n;
|
||||||
@@ -176,12 +203,20 @@ static Proto* LoadFunction(LoadState* S, TString* p)
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* LUA_SIGNATURE = sizeof(LUA_SIGnATURE)-1
|
||||||
|
* LUAC_VERSION = 1
|
||||||
|
* LUAC_FORMAT = 1
|
||||||
|
* endian = 1 */
|
||||||
|
#define ENDIAN_OFFSET (sizeof(LUA_SIGNATURE)-1+2)
|
||||||
|
|
||||||
static void LoadHeader(LoadState* S)
|
static void LoadHeader(LoadState* S)
|
||||||
{
|
{
|
||||||
char h[LUAC_HEADERSIZE];
|
char h[LUAC_HEADERSIZE];
|
||||||
char s[LUAC_HEADERSIZE];
|
char s[LUAC_HEADERSIZE];
|
||||||
luaU_header(h);
|
luaU_header(h);
|
||||||
LoadBlock(S,s,LUAC_HEADERSIZE);
|
LoadBlock(S,s,LUAC_HEADERSIZE);
|
||||||
|
S->flip = h[ENDIAN_OFFSET] != s[ENDIAN_OFFSET];
|
||||||
|
s[ENDIAN_OFFSET] = h[ENDIAN_OFFSET];
|
||||||
IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");
|
IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,6 +235,7 @@ Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)
|
|||||||
S.L=L;
|
S.L=L;
|
||||||
S.Z=Z;
|
S.Z=Z;
|
||||||
S.b=buff;
|
S.b=buff;
|
||||||
|
S.flip=0;
|
||||||
LoadHeader(&S);
|
LoadHeader(&S);
|
||||||
return LoadFunction(&S,luaS_newliteral(L,"=?"));
|
return LoadFunction(&S,luaS_newliteral(L,"=?"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ LUAI_FUNC void luaU_print (const Proto* f, int full);
|
|||||||
/* for header of binary files -- this is Lua 5.1 */
|
/* for header of binary files -- this is Lua 5.1 */
|
||||||
#define LUAC_VERSION 0x51
|
#define LUAC_VERSION 0x51
|
||||||
|
|
||||||
/* for header of binary files -- this is the official format */
|
/* for header of binary files -- this is StepMania's own format */
|
||||||
#define LUAC_FORMAT 0
|
#define LUAC_FORMAT 'S'
|
||||||
|
|
||||||
/* size of header of binary files */
|
/* size of header of binary files */
|
||||||
#define LUAC_HEADERSIZE 12
|
#define LUAC_HEADERSIZE 12
|
||||||
|
|||||||
Reference in New Issue
Block a user