diff --git a/stepmania/src/lua-5.1/src/lcode.c b/stepmania/src/lua-5.1/src/lcode.c index 5f67e93fe6..cd4977e37b 100644 --- a/stepmania/src/lua-5.1/src/lcode.c +++ b/stepmania/src/lua-5.1/src/lcode.c @@ -786,7 +786,7 @@ static int luaK_code (FuncState *fs, Instruction i, int line) { MAX_INT, "code size overflow"); f->code[fs->pc] = i; /* 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"); f->lineinfo[fs->pc] = line; return fs->pc++; diff --git a/stepmania/src/lua-5.1/src/ldebug.c b/stepmania/src/lua-5.1/src/ldebug.c index 70a21f6e29..97451f3e65 100644 --- a/stepmania/src/lua-5.1/src/ldebug.c +++ b/stepmania/src/lua-5.1/src/ldebug.c @@ -180,7 +180,7 @@ static void collectvalidlines (lua_State *L, Closure *f) { } else { Table *t = luaH_new(L, 0, 0); - int *lineinfo = f->l.p->lineinfo; + uint32_t *lineinfo = f->l.p->lineinfo; int i; for (i=0; il.p->sizelineinfo; i++) setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); diff --git a/stepmania/src/lua-5.1/src/ldebug.h b/stepmania/src/lua-5.1/src/ldebug.h index 22226b4096..27794db1e4 100644 --- a/stepmania/src/lua-5.1/src/ldebug.h +++ b/stepmania/src/lua-5.1/src/ldebug.h @@ -13,7 +13,7 @@ #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) diff --git a/stepmania/src/lua-5.1/src/ldump.c b/stepmania/src/lua-5.1/src/ldump.c index 3ce16542d6..e31c669177 100644 --- a/stepmania/src/lua-5.1/src/ldump.c +++ b/stepmania/src/lua-5.1/src/ldump.c @@ -42,7 +42,7 @@ static void DumpChar(int y, DumpState* D) DumpVar(x,D); } -static void DumpInt(int x, DumpState* D) +static void DumpInt(uint32_t x, DumpState* D) { DumpVar(x,D); } @@ -62,13 +62,12 @@ static void DumpString(const TString* s, DumpState* D) { if (s==NULL || getstr(s)==NULL) { - size_t size=0; - DumpVar(size,D); + DumpInt(0,D); } else { - size_t size=s->tsv.len+1; /* include trailing '\0' */ - DumpVar(size,D); + lu_int32 size=s->tsv.len+1; /* include trailing '\0' */ + DumpInt(size,D); DumpBlock(getstr(s),size,D); } } @@ -112,7 +111,7 @@ static void DumpDebug(const Proto* f, DumpState* D) { int i,n; 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; DumpInt(n,D); for (i=0; i>24) | (((n)>>8) & 0x0000FF00) | (((n)<<8) & 0x00FF0000) | ((n)<<24) ) + static void LoadBlock(LoadState* S, void* b, size_t size) { size_t r=luaZ_read(S->Z,b,size); @@ -59,8 +63,10 @@ static int LoadChar(LoadState* S) static int LoadInt(LoadState* S) { - int x; + uint32_t x; LoadVar(S,x); + if (S->flip) + x = Swap32(x); IF (x<0, "bad integer"); return x; } @@ -69,13 +75,26 @@ static lua_Number LoadNumber(LoadState* S) { lua_Number 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) { - size_t size; - LoadVar(S,size); + int size=LoadInt(S); if (size==0) return NULL; else @@ -92,6 +111,11 @@ static void LoadCode(LoadState* S, Proto* f) f->code=luaM_newvector(S->L,n,Instruction); f->sizecode=n; LoadVector(S,f->code,n,sizeof(Instruction)); + if (!S->flip) + return; + int i; + for (i=0; icode[i] = Swap32(f->code[i]); } static Proto* LoadFunction(LoadState* S, TString* p); @@ -137,9 +161,12 @@ static void LoadDebug(LoadState* S, Proto* f) { int i,n; n=LoadInt(S); - f->lineinfo=luaM_newvector(S->L,n,int); + f->lineinfo=luaM_newvector(S->L,n,uint32_t); f->sizelineinfo=n; - LoadVector(S,f->lineinfo,n,sizeof(int)); + LoadVector(S,f->lineinfo,n,sizeof(uint32_t)); + if (S->flip) + for (i=0; ilineinfo[i] = Swap32(f->lineinfo[i]); n=LoadInt(S); f->locvars=luaM_newvector(S->L,n,LocVar); f->sizelocvars=n; @@ -176,12 +203,20 @@ static Proto* LoadFunction(LoadState* S, TString* p) 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) { char h[LUAC_HEADERSIZE]; char s[LUAC_HEADERSIZE]; luaU_header(h); 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"); } @@ -200,6 +235,7 @@ Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) S.L=L; S.Z=Z; S.b=buff; + S.flip=0; LoadHeader(&S); return LoadFunction(&S,luaS_newliteral(L,"=?")); } diff --git a/stepmania/src/lua-5.1/src/lundump.h b/stepmania/src/lua-5.1/src/lundump.h index f791a4f173..7991c882d7 100644 --- a/stepmania/src/lua-5.1/src/lundump.h +++ b/stepmania/src/lua-5.1/src/lundump.h @@ -27,8 +27,8 @@ LUAI_FUNC void luaU_print (const Proto* f, int full); /* for header of binary files -- this is Lua 5.1 */ #define LUAC_VERSION 0x51 -/* for header of binary files -- this is the official format */ -#define LUAC_FORMAT 0 +/* for header of binary files -- this is StepMania's own format */ +#define LUAC_FORMAT 'S' /* size of header of binary files */ #define LUAC_HEADERSIZE 12