diff options
| author | Mike Pall <mike> | 2010-01-09 22:41:08 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-01-09 22:41:08 +0100 |
| commit | 2cc554db0cb37ac3600cccab97c657bb532e3c4e (patch) | |
| tree | 63a33cbded818524d9e4c1166a8542e933b38fd0 | |
| parent | a33204ae5eae25291f003c386ab993278194b96b (diff) | |
| download | luajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.tar.gz luajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.tar.bz2 luajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.zip | |
Avoid int16_t widening for pt->uv elements.
| -rw-r--r-- | src/lj_func.c | 9 | ||||
| -rw-r--r-- | src/lj_gc.c | 2 | ||||
| -rw-r--r-- | src/lj_obj.h | 2 | ||||
| -rw-r--r-- | src/lj_parse.c | 8 |
4 files changed, 13 insertions, 8 deletions
diff --git a/src/lj_func.c b/src/lj_func.c index abb7afd5..231701db 100644 --- a/src/lj_func.c +++ b/src/lj_func.c | |||
| @@ -51,7 +51,7 @@ void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt) | |||
| 51 | pt->sizekn*(MSize)sizeof(lua_Number); | 51 | pt->sizekn*(MSize)sizeof(lua_Number); |
| 52 | lj_mem_free(g, pt->k.gc - nkgc, sizek); | 52 | lj_mem_free(g, pt->k.gc - nkgc, sizek); |
| 53 | lj_mem_freevec(g, pt->bc, pt->sizebc, BCIns); | 53 | lj_mem_freevec(g, pt->bc, pt->sizebc, BCIns); |
| 54 | lj_mem_freevec(g, pt->uv, pt->sizeuv, int16_t); | 54 | lj_mem_freevec(g, pt->uv, pt->sizeuv, uint16_t); |
| 55 | lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t); | 55 | lj_mem_freevec(g, pt->lineinfo, pt->sizelineinfo, int32_t); |
| 56 | lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); | 56 | lj_mem_freevec(g, pt->varinfo, pt->sizevarinfo, struct VarInfo); |
| 57 | lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *); | 57 | lj_mem_freevec(g, pt->uvname, pt->sizeuvname, GCstr *); |
| @@ -170,7 +170,12 @@ GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent) | |||
| 170 | base = L->base; | 170 | base = L->base; |
| 171 | for (i = 0; i < nuv; i++) { | 171 | for (i = 0; i < nuv; i++) { |
| 172 | ptrdiff_t v = pt->uv[i]; | 172 | ptrdiff_t v = pt->uv[i]; |
| 173 | GCupval *uv = v < 0 ? &gcref(puv[~v])->uv : func_finduv(L, base + v); | 173 | GCupval *uv; |
| 174 | if ((v & 0x8000)) { | ||
| 175 | uv = func_finduv(L, base + (v & 0xff)); | ||
| 176 | } else { | ||
| 177 | uv = &gcref(puv[v])->uv; | ||
| 178 | } | ||
| 174 | setgcref(fn->l.uvptr[i], obj2gco(uv)); | 179 | setgcref(fn->l.uvptr[i], obj2gco(uv)); |
| 175 | } | 180 | } |
| 176 | return fn; | 181 | return fn; |
diff --git a/src/lj_gc.c b/src/lj_gc.c index ffe5d4b1..cd99f249 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
| @@ -329,7 +329,7 @@ static size_t propagatemark(global_State *g) | |||
| 329 | return sizeof(GCproto) + sizeof(BCIns) * pt->sizebc + | 329 | return sizeof(GCproto) + sizeof(BCIns) * pt->sizebc + |
| 330 | sizeof(GCRef) * pt->sizekgc + | 330 | sizeof(GCRef) * pt->sizekgc + |
| 331 | sizeof(lua_Number) * pt->sizekn + | 331 | sizeof(lua_Number) * pt->sizekn + |
| 332 | sizeof(int16_t) * pt->sizeuv + | 332 | sizeof(uint16_t) * pt->sizeuv + |
| 333 | sizeof(int32_t) * pt->sizelineinfo + | 333 | sizeof(int32_t) * pt->sizelineinfo + |
| 334 | sizeof(VarInfo) * pt->sizevarinfo + | 334 | sizeof(VarInfo) * pt->sizevarinfo + |
| 335 | sizeof(GCstr *) * pt->sizeuvname; | 335 | sizeof(GCstr *) * pt->sizeuvname; |
diff --git a/src/lj_obj.h b/src/lj_obj.h index c237ebf5..85d904f3 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
| @@ -358,7 +358,7 @@ typedef struct GCproto { | |||
| 358 | GCRef gclist; | 358 | GCRef gclist; |
| 359 | ProtoK k; /* Split constant array (points to the middle). */ | 359 | ProtoK k; /* Split constant array (points to the middle). */ |
| 360 | BCIns *bc; /* Array of bytecode instructions. */ | 360 | BCIns *bc; /* Array of bytecode instructions. */ |
| 361 | int16_t *uv; /* Upvalue list. local >= 0. parent uv < 0. */ | 361 | uint16_t *uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */ |
| 362 | MSize sizekgc; /* Number of collectable constants. */ | 362 | MSize sizekgc; /* Number of collectable constants. */ |
| 363 | MSize sizekn; /* Number of lua_Number constants. */ | 363 | MSize sizekn; /* Number of lua_Number constants. */ |
| 364 | uint8_t sizeuv; /* Number of upvalues. */ | 364 | uint8_t sizeuv; /* Number of upvalues. */ |
diff --git a/src/lj_parse.c b/src/lj_parse.c index 81416f0f..8e94faa4 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c | |||
| @@ -1014,7 +1014,7 @@ static uint32_t indexupvalue(FuncState *fs, GCstr *name, ExpDesc *v) | |||
| 1014 | uint32_t i; | 1014 | uint32_t i; |
| 1015 | GCproto *pt = fs->pt; | 1015 | GCproto *pt = fs->pt; |
| 1016 | for (i = 0; i < fs->nuv; i++) { | 1016 | for (i = 0; i < fs->nuv; i++) { |
| 1017 | if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { | 1017 | if (fs->upvalues[i].info == v->u.s.info && fs->upvalues[i].k == v->k) { |
| 1018 | lua_assert(pt->uvname[i] == name); | 1018 | lua_assert(pt->uvname[i] == name); |
| 1019 | return i; | 1019 | return i; |
| 1020 | } | 1020 | } |
| @@ -1171,12 +1171,12 @@ static void collectk(FuncState *fs, GCproto *pt) | |||
| 1171 | static void collectuv(FuncState *fs, GCproto *pt) | 1171 | static void collectuv(FuncState *fs, GCproto *pt) |
| 1172 | { | 1172 | { |
| 1173 | uint32_t i; | 1173 | uint32_t i; |
| 1174 | pt->uv = lj_mem_newvec(fs->L, fs->nuv, int16_t); | 1174 | pt->uv = lj_mem_newvec(fs->L, fs->nuv, uint16_t); |
| 1175 | pt->sizeuv = fs->nuv; | 1175 | pt->sizeuv = fs->nuv; |
| 1176 | for (i = 0; i < pt->sizeuv; i++) { | 1176 | for (i = 0; i < pt->sizeuv; i++) { |
| 1177 | uint32_t v = fs->upvalues[i].info; | 1177 | uint32_t v = fs->upvalues[i].info; |
| 1178 | if (fs->upvalues[i].k == VUPVAL) v = ~v; | 1178 | if (fs->upvalues[i].k == VLOCAL) v |= 0x8000; |
| 1179 | pt->uv[i] = (int16_t)v; | 1179 | pt->uv[i] = (uint16_t)v; |
| 1180 | } | 1180 | } |
| 1181 | } | 1181 | } |
| 1182 | 1182 | ||
