aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-01-09 22:41:08 +0100
committerMike Pall <mike>2010-01-09 22:41:08 +0100
commit2cc554db0cb37ac3600cccab97c657bb532e3c4e (patch)
tree63a33cbded818524d9e4c1166a8542e933b38fd0 /src
parenta33204ae5eae25291f003c386ab993278194b96b (diff)
downloadluajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.tar.gz
luajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.tar.bz2
luajit-2cc554db0cb37ac3600cccab97c657bb532e3c4e.zip
Avoid int16_t widening for pt->uv elements.
Diffstat (limited to 'src')
-rw-r--r--src/lj_func.c9
-rw-r--r--src/lj_gc.c2
-rw-r--r--src/lj_obj.h2
-rw-r--r--src/lj_parse.c8
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)
1171static void collectuv(FuncState *fs, GCproto *pt) 1171static 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