29 |
29 |
30 #ifdef LUAC_TRUST_BINARIES |
30 #ifdef LUAC_TRUST_BINARIES |
31 #define IF(c,s) |
31 #define IF(c,s) |
32 #define error(S,s) |
32 #define error(S,s) |
33 #else |
33 #else |
34 #define IF(c,s) if (c) error(S,s) |
34 #define IF(c,s) if (c) error(S,s) |
35 |
35 |
36 static void error(LoadState* S, const char* why) |
36 static void error(LoadState* S, const char* why) |
37 { |
37 { |
38 luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); |
38 luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); |
39 luaD_throw(S->L,LUA_ERRSYNTAX); |
39 luaD_throw(S->L,LUA_ERRSYNTAX); |
40 } |
40 } |
41 #endif |
41 #endif |
42 |
42 |
43 #define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) |
43 #define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) |
44 #define LoadByte(S) (lu_byte)LoadChar(S) |
44 #define LoadByte(S) (lu_byte)LoadChar(S) |
45 #define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) |
45 #define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) |
46 #define LoadVector(S,b,n,size) LoadMem(S,b,n,size) |
46 #define LoadVector(S,b,n,size) LoadMem(S,b,n,size) |
47 |
47 |
48 static void LoadBlock(LoadState* S, void* b, size_t size) |
48 static void LoadBlock(LoadState* S, void* b, size_t size) |
49 { |
49 { |
50 size_t r=luaZ_read(S->Z,b,size); |
50 size_t r=luaZ_read(S->Z,b,size); |
51 IF (r!=0, "unexpected end"); |
51 IF (r!=0, "unexpected end"); |
81 return NULL; |
81 return NULL; |
82 else |
82 else |
83 { |
83 { |
84 char* s=luaZ_openspace(S->L,S->b,size); |
84 char* s=luaZ_openspace(S->L,S->b,size); |
85 LoadBlock(S,s,size); |
85 LoadBlock(S,s,size); |
86 return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ |
86 return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ |
87 } |
87 } |
88 } |
88 } |
89 |
89 |
90 static void LoadCode(LoadState* S, Proto* f) |
90 static void LoadCode(LoadState* S, Proto* f) |
91 { |
91 { |
109 TValue* o=&f->k[i]; |
109 TValue* o=&f->k[i]; |
110 int t=LoadChar(S); |
110 int t=LoadChar(S); |
111 switch (t) |
111 switch (t) |
112 { |
112 { |
113 case LUA_TNIL: |
113 case LUA_TNIL: |
114 setnilvalue(o); |
114 setnilvalue(o); |
115 break; |
115 break; |
116 case LUA_TBOOLEAN: |
116 case LUA_TBOOLEAN: |
117 setbvalue(o,LoadChar(S)!=0); |
117 setbvalue(o,LoadChar(S)!=0); |
118 break; |
118 break; |
119 case LUA_TNUMBER: |
119 case LUA_TNUMBER: |
120 setnvalue(o,LoadNumber(S)); |
120 setnvalue(o,LoadNumber(S)); |
121 break; |
121 break; |
122 case LUA_TSTRING: |
122 case LUA_TSTRING: |
123 setsvalue2n(S->L,o,LoadString(S)); |
123 setsvalue2n(S->L,o,LoadString(S)); |
124 break; |
124 break; |
125 default: |
125 default: |
126 error(S,"bad constant"); |
126 error(S,"bad constant"); |
127 break; |
127 break; |
128 } |
128 } |
129 } |
129 } |
130 n=LoadInt(S); |
130 n=LoadInt(S); |
131 f->p=luaM_newvector(S->L,n,Proto*); |
131 f->p=luaM_newvector(S->L,n,Proto*); |
132 f->sizep=n; |
132 f->sizep=n; |
216 int x=1; |
216 int x=1; |
217 memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); |
217 memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); |
218 h+=sizeof(LUA_SIGNATURE)-1; |
218 h+=sizeof(LUA_SIGNATURE)-1; |
219 *h++=(char)LUAC_VERSION; |
219 *h++=(char)LUAC_VERSION; |
220 *h++=(char)LUAC_FORMAT; |
220 *h++=(char)LUAC_FORMAT; |
221 *h++=(char)*(char*)&x; /* endianness */ |
221 *h++=(char)*(char*)&x; /* endianness */ |
222 *h++=(char)sizeof(int); |
222 *h++=(char)sizeof(int); |
223 *h++=(char)sizeof(size_t); |
223 *h++=(char)sizeof(size_t); |
224 *h++=(char)sizeof(Instruction); |
224 *h++=(char)sizeof(Instruction); |
225 *h++=(char)sizeof(lua_Number); |
225 *h++=(char)sizeof(lua_Number); |
226 *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ |
226 *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ |
227 } |
227 } |