diff options
Diffstat (limited to '')
| -rw-r--r-- | lundump.c | 101 | ||||
| -rw-r--r-- | lundump.h | 91 |
2 files changed, 52 insertions, 140 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lundump.c,v 1.8 1999/03/30 20:29:34 roberto Exp roberto $ | 2 | ** $Id: lundump.c,v 1.18 1999/04/09 03:10:40 lhf Exp lhf $ |
| 3 | ** load bytecodes from files | 3 | ** load bytecodes from files |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -14,12 +14,11 @@ | |||
| 14 | #include "lundump.h" | 14 | #include "lundump.h" |
| 15 | 15 | ||
| 16 | #define LoadBlock(b,size,Z) ezread(Z,b,size) | 16 | #define LoadBlock(b,size,Z) ezread(Z,b,size) |
| 17 | #define LoadNative(t,Z) LoadBlock(&t,sizeof(t),Z) | ||
| 18 | 17 | ||
| 19 | #if ID_NUMBER==ID_NATIVE | 18 | #if LUAC_NATIVE |
| 20 | #define doLoadNumber(f,Z) LoadNative(f,Z) | 19 | #define doLoadNumber(x,Z) LoadBlock(&x,sizeof(x),Z) |
| 21 | #else | 20 | #else |
| 22 | #define doLoadNumber(f,Z) f=LoadNumber(Z) | 21 | #define doLoadNumber(x,Z) x=LoadNumber(Z) |
| 23 | #endif | 22 | #endif |
| 24 | 23 | ||
| 25 | static void unexpectedEOZ (ZIO* Z) | 24 | static void unexpectedEOZ (ZIO* Z) |
| @@ -54,38 +53,17 @@ static unsigned long LoadLong (ZIO* Z) | |||
| 54 | return (hi<<16)|lo; | 53 | return (hi<<16)|lo; |
| 55 | } | 54 | } |
| 56 | 55 | ||
| 57 | #if ID_NUMBER==ID_REAL4 /* LUA_NUMBER */ | 56 | static real LoadNumber (ZIO* Z) |
| 58 | /* assumes sizeof(long)==4 and sizeof(float)==4 (IEEE) */ | ||
| 59 | static float LoadFloat (ZIO* Z) | ||
| 60 | { | 57 | { |
| 61 | unsigned long l=LoadLong(Z); | 58 | char b[256]; |
| 62 | float f; | 59 | int size=ezgetc(Z); |
| 63 | memcpy(&f,&l,sizeof(f)); | 60 | LoadBlock(b,size,Z); |
| 64 | return f; | 61 | b[size]=0; |
| 65 | } | 62 | if (b[0]=='-') |
| 66 | #endif | 63 | return -luaO_str2d(b+1); |
| 67 | 64 | else | |
| 68 | #if ID_NUMBER==ID_REAL8 /* LUA_NUMBER */ | 65 | return luaO_str2d(b); |
| 69 | /* assumes sizeof(long)==4 and sizeof(double)==8 (IEEE) */ | ||
| 70 | static double LoadDouble (ZIO* Z) | ||
| 71 | { | ||
| 72 | unsigned long l[2]; | ||
| 73 | double f; | ||
| 74 | int x=1; | ||
| 75 | if (*(char*)&x==1) /* little-endian */ | ||
| 76 | { | ||
| 77 | l[1]=LoadLong(Z); | ||
| 78 | l[0]=LoadLong(Z); | ||
| 79 | } | ||
| 80 | else /* big-endian */ | ||
| 81 | { | ||
| 82 | l[0]=LoadLong(Z); | ||
| 83 | l[1]=LoadLong(Z); | ||
| 84 | } | ||
| 85 | memcpy(&f,l,sizeof(f)); | ||
| 86 | return f; | ||
| 87 | } | 66 | } |
| 88 | #endif | ||
| 89 | 67 | ||
| 90 | static int LoadInt (ZIO* Z, char* message) | 68 | static int LoadInt (ZIO* Z, char* message) |
| 91 | { | 69 | { |
| @@ -103,7 +81,7 @@ static Byte* LoadCode (ZIO* Z) | |||
| 103 | Byte* b=luaM_malloc(size+PAD); | 81 | Byte* b=luaM_malloc(size+PAD); |
| 104 | LoadBlock(b,size,Z); | 82 | LoadBlock(b,size,Z); |
| 105 | if (b[size-1]!=ENDCODE) luaL_verror("bad code in %s",zname(Z)); | 83 | if (b[size-1]!=ENDCODE) luaL_verror("bad code in %s",zname(Z)); |
| 106 | memset(b+size,ENDCODE,PAD); /* pad for safety */ | 84 | memset(b+size,ENDCODE,PAD); /* pad code for safety */ |
| 107 | return b; | 85 | return b; |
| 108 | } | 86 | } |
| 109 | 87 | ||
| @@ -188,9 +166,7 @@ static void LoadSignature (ZIO* Z) | |||
| 188 | 166 | ||
| 189 | static void LoadHeader (ZIO* Z) | 167 | static void LoadHeader (ZIO* Z) |
| 190 | { | 168 | { |
| 191 | int version,id,sizeofR; | 169 | int version,sizeofR; |
| 192 | real f=-TEST_NUMBER,tf=TEST_NUMBER; | ||
| 193 | luaU_testnumber(); | ||
| 194 | LoadSignature(Z); | 170 | LoadSignature(Z); |
| 195 | version=ezgetc(Z); | 171 | version=ezgetc(Z); |
| 196 | if (version>VERSION) | 172 | if (version>VERSION) |
| @@ -201,17 +177,30 @@ static void LoadHeader (ZIO* Z) | |||
| 201 | luaL_verror( | 177 | luaL_verror( |
| 202 | "%s too old: version=0x%02x; expected at least 0x%02x", | 178 | "%s too old: version=0x%02x; expected at least 0x%02x", |
| 203 | zname(Z),version,VERSION0); | 179 | zname(Z),version,VERSION0); |
| 204 | id=ezgetc(Z); /* test number representation */ | 180 | sizeofR=ezgetc(Z); /* test number representation */ |
| 205 | sizeofR=ezgetc(Z); | 181 | #if LUAC_NATIVE |
| 206 | if (id!=ID_NUMBER || sizeofR!=sizeof(real)) | 182 | if (sizeofR==0) |
| 207 | luaL_verror("unknown number signature in %s: " | 183 | luaL_verror("cannot read numbers in %s: " |
| 208 | "read 0x%02x%02x; expected 0x%02x%02x", | 184 | "support for decimal format not enabled", |
| 209 | zname(Z),id,sizeofR,ID_NUMBER,sizeof(real)); | 185 | zname(Z)); |
| 186 | if (sizeofR!=sizeof(real)) | ||
| 187 | luaL_verror("unknown number size in %s: read %d; expected %d", | ||
| 188 | zname(Z),sizeofR,sizeof(real)); | ||
| 189 | else | ||
| 190 | { | ||
| 191 | real f=-TEST_NUMBER,tf=TEST_NUMBER; | ||
| 210 | doLoadNumber(f,Z); | 192 | doLoadNumber(f,Z); |
| 211 | if (f!=tf) | 193 | if (f!=tf) |
| 212 | luaL_verror("unknown number representation in %s: " | 194 | luaL_verror("unknown number representation in %s: " |
| 213 | "read " NUMBER_FMT "; expected " NUMBER_FMT, | 195 | "read " NUMBER_FMT "; expected " NUMBER_FMT, |
| 214 | zname(Z),f,tf); | 196 | zname(Z),f,tf); |
| 197 | } | ||
| 198 | #else | ||
| 199 | if (sizeofR!=0) | ||
| 200 | luaL_verror("cannot read numbers in %s: " | ||
| 201 | "support for native format not enabled", | ||
| 202 | zname(Z)); | ||
| 203 | #endif | ||
| 215 | } | 204 | } |
| 216 | 205 | ||
| 217 | static TProtoFunc* LoadChunk (ZIO* Z) | 206 | static TProtoFunc* LoadChunk (ZIO* Z) |
| @@ -235,28 +224,6 @@ TProtoFunc* luaU_undump1 (ZIO* Z) | |||
| 235 | } | 224 | } |
| 236 | 225 | ||
| 237 | /* | 226 | /* |
| 238 | ** test number representation | ||
| 239 | */ | ||
| 240 | void luaU_testnumber (void) | ||
| 241 | { | ||
| 242 | if (sizeof(real)!=SIZEOF_NUMBER) | ||
| 243 | luaL_verror("numbers have %d bytes; expected %d. see lundump.h", | ||
| 244 | (int)sizeof(real),SIZEOF_NUMBER); | ||
| 245 | #if ID_NUMBER==ID_REAL4 || ID_NUMBER==ID_REAL8 | ||
| 246 | if (sizeof(long)!=4) | ||
| 247 | luaL_verror("longs have %d bytes; expected %d. see lundump.h", | ||
| 248 | (int)sizeof(long),4); | ||
| 249 | #endif | ||
| 250 | { | ||
| 251 | real t=TEST_NUMBER; | ||
| 252 | TYPEOF_NUMBER v=TEST_NUMBER; | ||
| 253 | if (t!=v) | ||
| 254 | luaL_verror("unsupported number type; expected %d-byte " NAMEOF_NUMBER "." | ||
| 255 | " see config and lundump.h",SIZEOF_NUMBER); | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | /* | ||
| 260 | * handle constants that cannot happen | 227 | * handle constants that cannot happen |
| 261 | */ | 228 | */ |
| 262 | void luaU_badconstant (char* s, int i, TObject* o, TProtoFunc* tf) | 229 | void luaU_badconstant (char* s, int i, TObject* o, TProtoFunc* tf) |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lundump.h,v 1.6 1999/03/30 20:29:34 roberto Exp roberto $ | 2 | ** $Id: lundump.h,v 1.13 1999/03/29 16:16:18 lhf Exp lhf $ |
| 3 | ** load pre-compiled Lua chunks | 3 | ** load pre-compiled Lua chunks |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -10,39 +10,7 @@ | |||
| 10 | #include "lobject.h" | 10 | #include "lobject.h" |
| 11 | #include "lzio.h" | 11 | #include "lzio.h" |
| 12 | 12 | ||
| 13 | /* -- start of user configuration ------------------------------------------ */ | ||
| 14 | |||
| 15 | /* LUA_NUMBER | ||
| 16 | * choose below the number representation in precompiled chunks by choosing an | ||
| 17 | * an adequate definition for ID_NUMBER. | ||
| 18 | * if you change LUA_NUM_TYPE, you must set ID_NUMBER accordingly. | ||
| 19 | * the default is ID_REAL8 because the default for LUA_NUM_TYPE is double. | ||
| 20 | * if you want to use this default, do nothing. | ||
| 21 | * if your machine does not use the IEEE 754 floating-point standard, use | ||
| 22 | * ID_NATIVE, but precompiled chunks may not be portable to all architectures. | ||
| 23 | * | ||
| 24 | * for types other than the ones listed below, you'll have to write your own | ||
| 25 | * dump and undump routines, specially if sizeof(long)!=4. | ||
| 26 | */ | ||
| 27 | |||
| 28 | /* choose one definition for ID_NUMBER and move it to after #endif */ | ||
| 29 | #if 0 | ||
| 30 | #define ID_NUMBER ID_INT4 /* 4-byte integers */ | ||
| 31 | #define ID_NUMBER ID_REAL4 /* 4-byte reals */ | ||
| 32 | #define ID_NUMBER ID_REAL8 /* 8-byte reals */ | ||
| 33 | #define ID_NUMBER ID_NATIVE /* whatever your machine uses */ | ||
| 34 | #endif | ||
| 35 | |||
| 36 | /* format for numbers in listings and error messages */ | ||
| 37 | #ifndef NUMBER_FMT | ||
| 38 | #define NUMBER_FMT "%.16g" /* LUA_NUMBER */ | ||
| 39 | #endif | ||
| 40 | |||
| 41 | /* -- end of user configuration -- DO NOT CHANGE ANYTHING BELOW THIS LINE -- */ | ||
| 42 | |||
| 43 | |||
| 44 | TProtoFunc* luaU_undump1 (ZIO* Z); /* load one chunk */ | 13 | TProtoFunc* luaU_undump1 (ZIO* Z); /* load one chunk */ |
| 45 | void luaU_testnumber (void); /* test number representation */ | ||
| 46 | void luaU_badconstant (char* s, int i, TObject* o, TProtoFunc* tf); | 14 | void luaU_badconstant (char* s, int i, TObject* o, TProtoFunc* tf); |
| 47 | /* handle cases that cannot happen */ | 15 | /* handle cases that cannot happen */ |
| 48 | 16 | ||
| @@ -52,52 +20,29 @@ void luaU_badconstant (char* s, int i, TObject* o, TProtoFunc* tf); | |||
| 52 | #define ID_CHUNK 27 /* binary files start with ESC... */ | 20 | #define ID_CHUNK 27 /* binary files start with ESC... */ |
| 53 | #define SIGNATURE "Lua" /* ...followed by this signature */ | 21 | #define SIGNATURE "Lua" /* ...followed by this signature */ |
| 54 | 22 | ||
| 55 | /* number representation */ | 23 | /* formats for error messages */ |
| 56 | #define ID_INT4 'l' /* 4-byte integers */ | 24 | #define SOURCE "<%s:%d>" |
| 57 | #define ID_REAL4 'f' /* 4-byte reals */ | 25 | #define IN " in %p " SOURCE |
| 58 | #define ID_REAL8 'd' /* 8-byte reals */ | 26 | #define INLOC tf,tf->source->str,tf->lineDefined |
| 59 | #define ID_NATIVE '?' /* whatever your machine uses */ | ||
| 60 | 27 | ||
| 61 | /* the default is ID_REAL8 because the default for LUA_NUM_TYPE is double */ | 28 | /* format for numbers in listings and error messages */ |
| 62 | #ifndef ID_NUMBER | 29 | #ifndef NUMBER_FMT |
| 63 | #define ID_NUMBER ID_REAL8 /* 8-byte reals */ | 30 | #define NUMBER_FMT "%.16g" /* LUA_NUMBER */ |
| 64 | #endif | 31 | #endif |
| 65 | 32 | ||
| 33 | /* LUA_NUMBER | ||
| 34 | * by default, numbers are stored in precompiled chunks as decimal strings. | ||
| 35 | * this is completely portable and fast enough for most applications. | ||
| 36 | * if you want to use this default, do nothing. | ||
| 37 | * if you want additional speed at the expense of portability, move the line | ||
| 38 | * below out of this comment. | ||
| 39 | #define LUAC_NATIVE | ||
| 40 | */ | ||
| 41 | |||
| 42 | #ifdef LUAC_NATIVE | ||
| 66 | /* a multiple of PI for testing number representation */ | 43 | /* a multiple of PI for testing number representation */ |
| 67 | /* multiplying by 1E8 gives non-trivial integer values */ | 44 | /* multiplying by 1E8 gives non-trivial integer values */ |
| 68 | #define TEST_NUMBER 3.14159265358979323846E8 | 45 | #define TEST_NUMBER 3.14159265358979323846E8 |
| 69 | |||
| 70 | #if ID_NUMBER==ID_REAL4 | ||
| 71 | #define DumpNumber DumpFloat | ||
| 72 | #define LoadNumber LoadFloat | ||
| 73 | #define SIZEOF_NUMBER 4 | ||
| 74 | #define TYPEOF_NUMBER float | ||
| 75 | #define NAMEOF_NUMBER "float" | ||
| 76 | #elif ID_NUMBER==ID_REAL8 | ||
| 77 | #define DumpNumber DumpDouble | ||
| 78 | #define LoadNumber LoadDouble | ||
| 79 | #define SIZEOF_NUMBER 8 | ||
| 80 | #define TYPEOF_NUMBER double | ||
| 81 | #define NAMEOF_NUMBER "double" | ||
| 82 | #elif ID_NUMBER==ID_INT4 | ||
| 83 | #define DumpNumber DumpLong | ||
| 84 | #define LoadNumber LoadLong | ||
| 85 | #define SIZEOF_NUMBER 4 | ||
| 86 | #define TYPEOF_NUMBER long | ||
| 87 | #define NAMEOF_NUMBER "long" | ||
| 88 | #elif ID_NUMBER==ID_NATIVE | ||
| 89 | #define DumpNumber DumpNative | ||
| 90 | #define LoadNumber LoadNative | ||
| 91 | #define SIZEOF_NUMBER sizeof(real) | ||
| 92 | #define TYPEOF_NUMBER real | ||
| 93 | #define NAMEOF_NUMBER "native" | ||
| 94 | #else | ||
| 95 | #error bad ID_NUMBER | ||
| 96 | #endif | 46 | #endif |
| 97 | 47 | ||
| 98 | /* formats for error messages */ | ||
| 99 | #define SOURCE "<%s:%d>" | ||
| 100 | #define IN " in %p " SOURCE | ||
| 101 | #define INLOC tf,tf->source->str,tf->lineDefined | ||
| 102 | |||
| 103 | #endif | 48 | #endif |
