mirror of
https://github.com/lua/lua.git
synced 2024-11-23 10:13:50 +08:00
Removed type 'varint_t'
size_t should be big enough to count the number of strings in a dump. (And, by definition, it is big enough to count the length of each string.)
This commit is contained in:
parent
65b07dd53d
commit
cc2b66c856
22
ldump.c
22
ldump.c
@ -30,7 +30,7 @@ typedef struct {
|
|||||||
int strip;
|
int strip;
|
||||||
int status;
|
int status;
|
||||||
Table *h; /* table to track saved strings */
|
Table *h; /* table to track saved strings */
|
||||||
lua_Unsigned nstr; /* counter to number saved strings */
|
lua_Integer nstr; /* counter for counting saved strings */
|
||||||
} DumpState;
|
} DumpState;
|
||||||
|
|
||||||
|
|
||||||
@ -86,12 +86,12 @@ static void dumpByte (DumpState *D, int y) {
|
|||||||
** size for 'dumpVarint' buffer: each byte can store up to 7 bits.
|
** size for 'dumpVarint' buffer: each byte can store up to 7 bits.
|
||||||
** (The "+6" rounds up the division.)
|
** (The "+6" rounds up the division.)
|
||||||
*/
|
*/
|
||||||
#define DIBS ((sizeof(varint_t) * CHAR_BIT + 6) / 7)
|
#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Dumps an unsigned integer using the MSB Varint encoding
|
** Dumps an unsigned integer using the MSB Varint encoding
|
||||||
*/
|
*/
|
||||||
static void dumpVarint (DumpState *D, varint_t x) {
|
static void dumpVarint (DumpState *D, size_t x) {
|
||||||
lu_byte buff[DIBS];
|
lu_byte buff[DIBS];
|
||||||
int n = 1;
|
int n = 1;
|
||||||
buff[DIBS - 1] = x & 0x7f; /* fill least-significant byte */
|
buff[DIBS - 1] = x & 0x7f; /* fill least-significant byte */
|
||||||
@ -101,9 +101,13 @@ static void dumpVarint (DumpState *D, varint_t x) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void dumpSize (DumpState *D, size_t sz) {
|
||||||
|
dumpVarint(D, sz);
|
||||||
|
}
|
||||||
|
|
||||||
static void dumpInt (DumpState *D, int x) {
|
static void dumpInt (DumpState *D, int x) {
|
||||||
lua_assert(x >= 0);
|
lua_assert(x >= 0);
|
||||||
dumpVarint(D, x);
|
dumpVarint(D, cast(size_t, x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -126,22 +130,22 @@ static void dumpInteger (DumpState *D, lua_Integer x) {
|
|||||||
*/
|
*/
|
||||||
static void dumpString (DumpState *D, TString *ts) {
|
static void dumpString (DumpState *D, TString *ts) {
|
||||||
if (ts == NULL)
|
if (ts == NULL)
|
||||||
dumpVarint(D, 0);
|
dumpSize(D, 0);
|
||||||
else {
|
else {
|
||||||
TValue idx;
|
TValue idx;
|
||||||
if (luaH_getstr(D->h, ts, &idx) == HOK) { /* string already saved? */
|
if (luaH_getstr(D->h, ts, &idx) == HOK) { /* string already saved? */
|
||||||
dumpVarint(D, 1); /* reuse a saved string */
|
dumpSize(D, 1); /* reuse a saved string */
|
||||||
dumpVarint(D, l_castS2U(ivalue(&idx))); /* index of saved string */
|
dumpSize(D, cast_sizet(ivalue(&idx))); /* index of saved string */
|
||||||
}
|
}
|
||||||
else { /* must write and save the string */
|
else { /* must write and save the string */
|
||||||
TValue key, value; /* to save the string in the hash */
|
TValue key, value; /* to save the string in the hash */
|
||||||
size_t size;
|
size_t size;
|
||||||
const char *s = getlstr(ts, size);
|
const char *s = getlstr(ts, size);
|
||||||
dumpVarint(D, size + 2);
|
dumpSize(D, size + 2);
|
||||||
dumpVector(D, s, size + 1); /* include ending '\0' */
|
dumpVector(D, s, size + 1); /* include ending '\0' */
|
||||||
D->nstr++; /* one more saved string */
|
D->nstr++; /* one more saved string */
|
||||||
setsvalue(D->L, &key, ts); /* the string is the key */
|
setsvalue(D->L, &key, ts); /* the string is the key */
|
||||||
setivalue(&value, l_castU2S(D->nstr)); /* its index is the value */
|
setivalue(&value, D->nstr); /* its index is the value */
|
||||||
luaH_set(D->L, D->h, &key, &value); /* h[ts] = nstr */
|
luaH_set(D->L, D->h, &key, &value); /* h[ts] = nstr */
|
||||||
/* integer value does not need barrier */
|
/* integer value does not need barrier */
|
||||||
}
|
}
|
||||||
|
21
lundump.c
21
lundump.c
@ -36,8 +36,8 @@ typedef struct {
|
|||||||
ZIO *Z;
|
ZIO *Z;
|
||||||
const char *name;
|
const char *name;
|
||||||
Table *h; /* list for string reuse */
|
Table *h; /* list for string reuse */
|
||||||
size_t offset; /* current position relative to beginning of dump */
|
lu_mem offset; /* current position relative to beginning of dump */
|
||||||
lua_Unsigned nstr; /* number of strings in the list */
|
lua_Integer nstr; /* number of strings in the list */
|
||||||
lu_byte fixed; /* dump is fixed in memory */
|
lu_byte fixed; /* dump is fixed in memory */
|
||||||
} LoadState;
|
} LoadState;
|
||||||
|
|
||||||
@ -94,13 +94,13 @@ static lu_byte loadByte (LoadState *S) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static varint_t loadVarint (LoadState *S, varint_t limit) {
|
static size_t loadVarint (LoadState *S, size_t limit) {
|
||||||
varint_t x = 0;
|
size_t x = 0;
|
||||||
int b;
|
int b;
|
||||||
limit >>= 7;
|
limit >>= 7;
|
||||||
do {
|
do {
|
||||||
b = loadByte(S);
|
b = loadByte(S);
|
||||||
if (x >= limit)
|
if (x > limit)
|
||||||
error(S, "integer overflow");
|
error(S, "integer overflow");
|
||||||
x = (x << 7) | (b & 0x7f);
|
x = (x << 7) | (b & 0x7f);
|
||||||
} while ((b & 0x80) != 0);
|
} while ((b & 0x80) != 0);
|
||||||
@ -109,12 +109,12 @@ static varint_t loadVarint (LoadState *S, varint_t limit) {
|
|||||||
|
|
||||||
|
|
||||||
static size_t loadSize (LoadState *S) {
|
static size_t loadSize (LoadState *S) {
|
||||||
return cast_sizet(loadVarint(S, MAX_SIZET));
|
return loadVarint(S, MAX_SIZET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int loadInt (LoadState *S) {
|
static int loadInt (LoadState *S) {
|
||||||
return cast_int(loadVarint(S, INT_MAX));
|
return cast_int(loadVarint(S, cast_sizet(INT_MAX)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -148,10 +148,9 @@ static void loadString (LoadState *S, Proto *p, TString **sl) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (size == 1) { /* previously saved string? */
|
else if (size == 1) { /* previously saved string? */
|
||||||
/* get its index */
|
lua_Integer idx = cast(lua_Integer, loadSize(S)); /* get its index */
|
||||||
lua_Unsigned idx = cast(lua_Unsigned, loadVarint(S, LUA_MAXUNSIGNED));
|
|
||||||
TValue stv;
|
TValue stv;
|
||||||
luaH_getint(S->h, l_castU2S(idx), &stv); /* get its value */
|
luaH_getint(S->h, idx, &stv); /* get its value */
|
||||||
*sl = ts = tsvalue(&stv);
|
*sl = ts = tsvalue(&stv);
|
||||||
luaC_objbarrier(L, p, ts);
|
luaC_objbarrier(L, p, ts);
|
||||||
return; /* do not save it again */
|
return; /* do not save it again */
|
||||||
@ -175,7 +174,7 @@ static void loadString (LoadState *S, Proto *p, TString **sl) {
|
|||||||
/* add string to list of saved strings */
|
/* add string to list of saved strings */
|
||||||
S->nstr++;
|
S->nstr++;
|
||||||
setsvalue(L, &sv, ts);
|
setsvalue(L, &sv, ts);
|
||||||
luaH_setint(L, S->h, l_castU2S(S->nstr), &sv);
|
luaH_setint(L, S->h, S->nstr, &sv);
|
||||||
luaC_objbarrierback(L, obj2gco(S->h), ts);
|
luaC_objbarrierback(L, obj2gco(S->h), ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
lundump.h
12
lundump.h
@ -28,18 +28,6 @@
|
|||||||
#define LUAC_FORMAT 0 /* this is the official format */
|
#define LUAC_FORMAT 0 /* this is the official format */
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Type to handle MSB Varint encoding: Try to get the largest unsigned
|
|
||||||
** integer available. (It was enough to be the largest between size_t and
|
|
||||||
** lua_Integer, but the C89 preprocessor knows nothing about size_t.)
|
|
||||||
*/
|
|
||||||
#if !defined(LUA_USE_C89) && defined(LLONG_MAX)
|
|
||||||
typedef unsigned long long varint_t;
|
|
||||||
#else
|
|
||||||
typedef unsigned long varint_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* load one chunk; from lundump.c */
|
/* load one chunk; from lundump.c */
|
||||||
LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name,
|
LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name,
|
||||||
int fixed);
|
int fixed);
|
||||||
|
Loading…
Reference in New Issue
Block a user