revise the table get/set code to use if statements rather than switch

pull/81/head
Dibyendu Majumdar 9 years ago
parent 88ba91209d
commit de2e78f1f1

@ -431,10 +431,8 @@ LUA_API size_t lua_rawlen (lua_State *L, int idx) {
case LUA_TUSERDATA: return uvalue(o)->len;
case LUA_TTABLE: {
Table *h = hvalue(o);
switch (h->ravi_array.array_type) {
case RAVI_TTABLE: return luaH_getn(h);
default: return raviH_getn(h);
}
if (h->ravi_array.array_type == RAVI_TTABLE) return luaH_getn(h);
else return raviH_getn(h);
}
default: return 0;
}
@ -670,37 +668,7 @@ LUA_API int lua_geti(lua_State *L, int idx, lua_Integer n) {
const TValue *aux;
lua_lock(L);
t = index2addr(L, idx);
if (ttistable(t)) {
Table *h = hvalue(t);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
api_incr_top(L);
} break;
case RAVI_TARRAYFLT: {
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
api_incr_top(L);
} break;
default: {
if (luaV_fastget(L, t, n, aux, luaH_getint)) {
setobj2s(L, L->top, aux);
api_incr_top(L);
}
else {
setivalue(L->top, n);
api_incr_top(L);
luaV_finishget(L, t, L->top - 1, L->top - 1, aux);
}
}
}
}
else {
if (!ttistable(t) || hvalue(t)->ravi_array.array_type == RAVI_TTABLE) {
if (luaV_fastget(L, t, n, aux, luaH_getint)) {
setobj2s(L, L->top, aux);
api_incr_top(L);
@ -711,6 +679,22 @@ LUA_API int lua_geti(lua_State *L, int idx, lua_Integer n) {
luaV_finishget(L, t, L->top - 1, L->top - 1, aux);
}
}
else {
Table *h = hvalue(t);
if (h->ravi_array.array_type == RAVI_TARRAYFLT) {
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
}
else {
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
}
api_incr_top(L);
}
lua_unlock(L);
return ttnov(L->top - 1);
}
@ -722,36 +706,36 @@ LUA_API int lua_rawget(lua_State *L, int idx) {
t = index2addr(L, idx);
api_check(L, ttistable(t), "table expected");
h = hvalue(t);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
TValue *key = L->top - 1;
api_check(L, ttisinteger(key), "key must be integer");
if (ttisinteger(key)) {
lua_Integer n = ivalue(key);
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, key); }
else {
setnilvalue(key);
}
}
if (h->ravi_array.array_type == RAVI_TTABLE) {
setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
}
else if (h->ravi_array.array_type == RAVI_TARRAYFLT) {
TValue *key = L->top - 1;
api_check(L, ttisinteger(key), "key must be integer");
if (ttisinteger(key)) {
lua_Integer n = ivalue(key);
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, key); }
else {
setnilvalue(key);
}
} break;
case RAVI_TARRAYFLT: {
TValue *key = L->top - 1;
api_check(L, ttisinteger(key), "key must be integer");
if (ttisinteger(key)) {
lua_Integer n = ivalue(key);
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, key); }
else {
setnilvalue(key);
}
}
}
else {
setnilvalue(key);
}
}
else {
TValue *key = L->top - 1;
api_check(L, ttisinteger(key), "key must be integer");
if (ttisinteger(key)) {
lua_Integer n = ivalue(key);
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, key); }
else {
setnilvalue(key);
}
} break;
default: setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); break;
}
else {
setnilvalue(key);
}
}
lua_unlock(L);
return ttnov(L->top - 1);
@ -764,20 +748,20 @@ LUA_API int lua_rawgeti(lua_State *L, int idx, lua_Integer n) {
t = index2addr(L, idx);
api_check(L, ttistable(t), "table expected");
h = hvalue(t);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
} break;
case RAVI_TARRAYFLT: {
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
} break;
default: setobj2s(L, L->top, luaH_getint(hvalue(t), n)); break;
if (h->ravi_array.array_type == RAVI_TTABLE) {
setobj2s(L, L->top, luaH_getint(hvalue(t), n));
}
else if (h->ravi_array.array_type == RAVI_TARRAYFLT) {
if (n <= raviH_getn(h)) { raviH_get_float_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
}
else {
if (n <= raviH_getn(h)) { raviH_get_int_inline(L, h, n, L->top); }
else {
setnilvalue(L->top);
}
}
api_incr_top(L);
lua_unlock(L);
@ -1004,47 +988,7 @@ LUA_API void lua_seti(lua_State *L, int idx, lua_Integer n) {
lua_lock(L);
api_checknelems(L, 1);
t = index2addr(L, idx);
if (ttistable(t)) {
Table *h = hvalue(t);
switch (h->ravi_array.array_type) {
case RAVI_TARRAYINT: {
TValue *val = L->top - 1;
if (ttisinteger(val)) { raviH_set_int_inline(L, h, n, ivalue(val)); }
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) { raviH_set_int_inline(L, h, n, i); }
else
luaG_runerror(L, "value cannot be converted to integer");
}
L->top--;
} break;
case RAVI_TARRAYFLT: {
TValue *val = L->top - 1;
if (ttisfloat(val)) { raviH_set_float_inline(L, h, n, fltvalue(val)); }
else if (ttisinteger(val)) {
raviH_set_float_inline(L, h, n, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) { raviH_set_float_inline(L, h, n, d); }
else
luaG_runerror(L, "value cannot be converted to number");
}
L->top--;
} break;
default: {
if (luaV_fastset(L, t, n, aux, luaH_getint, L->top - 1))
L->top--; /* pop value */
else {
setivalue(L->top, n);
api_incr_top(L);
luaV_finishset(L, t, L->top - 1, L->top - 2, aux);
L->top -= 2; /* pop value and key */
}
}
}
}
else {
if (!ttistable(t) || hvalue(t)->ravi_array.array_type == RAVI_TTABLE) {
if (luaV_fastset(L, t, n, aux, luaH_getint, L->top - 1))
L->top--; /* pop value */
else {
@ -1054,6 +998,33 @@ LUA_API void lua_seti(lua_State *L, int idx, lua_Integer n) {
L->top -= 2; /* pop value and key */
}
}
else {
Table *h = hvalue(t);
if (h->ravi_array.array_type == RAVI_TARRAYFLT) {
TValue *val = L->top - 1;
if (ttisfloat(val)) { raviH_set_float_inline(L, h, n, fltvalue(val)); }
else if (ttisinteger(val)) {
raviH_set_float_inline(L, h, n, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) { raviH_set_float_inline(L, h, n, d); }
else
luaG_runerror(L, "value cannot be converted to number");
}
}
else {
TValue *val = L->top - 1;
if (ttisinteger(val)) { raviH_set_int_inline(L, h, n, ivalue(val)); }
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) { raviH_set_int_inline(L, h, n, i); }
else
luaG_runerror(L, "value cannot be converted to integer");
}
}
L->top--;
}
lua_unlock(L);
}
@ -1065,46 +1036,46 @@ LUA_API void lua_rawset(lua_State *L, int idx) {
o = index2addr(L, idx);
api_check(L, ttistable(o), "table expected");
t = hvalue(o);
switch (t->ravi_array.array_type) {
case RAVI_TARRAYINT: {
TValue *key = L->top - 2;
TValue *val = L->top - 1;
if (!ttisinteger(key)) luaG_typeerror(L, key, "index");
if (ttisinteger(val)) {
raviH_set_int_inline(L, t, ivalue(key), ivalue(val));
}
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) {
raviH_set_int_inline(L, t, ivalue(key), i);
}
else
luaG_runerror(L, "value cannot be converted to integer");
}
} break;
case RAVI_TARRAYFLT: {
TValue *key = L->top - 2;
TValue *val = L->top - 1;
if (!ttisinteger(key)) luaG_typeerror(L, key, "index");
if (ttisfloat(val)) {
raviH_set_float_inline(L, t, ivalue(key), fltvalue(val));
}
else if (ttisinteger(val)) {
raviH_set_float_inline(L, t, ivalue(key), (lua_Number)(ivalue(val)));
if (t->ravi_array.array_type == RAVI_TTABLE) {
setobj2t(L, luaH_set(L, t, L->top - 2), L->top - 1);
invalidateTMcache(t);
luaC_barrierback(L, t, L->top - 1);
}
else if (t->ravi_array.array_type == RAVI_TARRAYFLT) {
TValue *key = L->top - 2;
TValue *val = L->top - 1;
if (!ttisinteger(key)) luaG_typeerror(L, key, "index");
if (ttisfloat(val)) {
raviH_set_float_inline(L, t, ivalue(key), fltvalue(val));
}
else if (ttisinteger(val)) {
raviH_set_float_inline(L, t, ivalue(key), (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) {
raviH_set_float_inline(L, t, ivalue(key), d);
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) {
raviH_set_float_inline(L, t, ivalue(key), d);
}
else
luaG_runerror(L, "value cannot be converted to number");
else
luaG_runerror(L, "value cannot be converted to number");
}
}
else {
TValue *key = L->top - 2;
TValue *val = L->top - 1;
if (!ttisinteger(key)) luaG_typeerror(L, key, "index");
if (ttisinteger(val)) {
raviH_set_int_inline(L, t, ivalue(key), ivalue(val));
}
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) {
raviH_set_int_inline(L, t, ivalue(key), i);
}
} break;
default: setobj2t(L, luaH_set(L, t, L->top - 2), L->top - 1); break;
else
luaG_runerror(L, "value cannot be converted to integer");
}
}
invalidateTMcache(t);
luaC_barrierback(L, t, L->top - 1);
L->top -= 2;
lua_unlock(L);
}
@ -1117,33 +1088,33 @@ LUA_API void lua_rawseti(lua_State *L, int idx, lua_Integer n) {
o = index2addr(L, idx);
api_check(L, ttistable(o), "table expected");
t = hvalue(o);
switch (t->ravi_array.array_type) {
case RAVI_TARRAYINT: {
TValue *val = L->top - 1;
if (ttisinteger(val)) { raviH_set_int_inline(L, t, n, ivalue(val)); }
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) { raviH_set_int_inline(L, t, n, i); }
else
luaG_runerror(L, "value cannot be converted to integer");
}
} break;
case RAVI_TARRAYFLT: {
TValue *val = L->top - 1;
if (ttisfloat(val)) { raviH_set_float_inline(L, t, n, fltvalue(val)); }
else if (ttisinteger(val)) {
raviH_set_float_inline(L, t, n, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) { raviH_set_float_inline(L, t, n, d); }
else
luaG_runerror(L, "value cannot be converted to number");
}
} break;
default: luaH_setint(L, t, n, L->top - 1); break;
if (t->ravi_array.array_type == RAVI_TTABLE) {
luaH_setint(L, t, n, L->top - 1);
luaC_barrierback(L, t, L->top - 1);
}
else if (t->ravi_array.array_type == RAVI_TARRAYFLT) {
TValue *val = L->top - 1;
if (ttisfloat(val)) { raviH_set_float_inline(L, t, n, fltvalue(val)); }
else if (ttisinteger(val)) {
raviH_set_float_inline(L, t, n, (lua_Number)(ivalue(val)));
}
else {
lua_Number d = 0.0;
if (luaV_tonumber_(val, &d)) { raviH_set_float_inline(L, t, n, d); }
else
luaG_runerror(L, "value cannot be converted to number");
}
}
else {
TValue *val = L->top - 1;
if (ttisinteger(val)) { raviH_set_int_inline(L, t, n, ivalue(val)); }
else {
lua_Integer i = 0;
if (luaV_tointeger_(val, &i)) { raviH_set_int_inline(L, t, n, i); }
else
luaG_runerror(L, "value cannot be converted to integer");
}
}
luaC_barrierback(L, t, L->top - 1);
L->top--;
lua_unlock(L);
}
@ -1577,13 +1548,20 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
** We need to ensure that this function does
** not subvert the types of local variables
*/
if (type == RAVI_TNUMFLT || type == RAVI_TNUMINT || type == RAVI_TARRAYFLT || type == RAVI_TARRAYINT) {
if (type == RAVI_TNUMFLT
|| type == RAVI_TNUMINT
|| type == RAVI_TARRAYFLT
|| type == RAVI_TARRAYINT) {
StkId input = L->top - 1;
int compatible = (type == RAVI_TNUMFLT && ttisfloat(input))
|| (type == RAVI_TNUMINT && ttisinteger(input))
|| (type == RAVI_TARRAYFLT && ttistable(input) && hvalue(input)->ravi_array.array_type == RAVI_TARRAYFLT)
|| (type == RAVI_TARRAYINT && ttistable(input) && hvalue(input)->ravi_array.array_type == RAVI_TARRAYINT)
|| (type == RAVI_TTABLE && ttistable(input) && hvalue(input)->ravi_array.array_type == RAVI_TTABLE)
|| (type == RAVI_TNUMINT
&& ttisinteger(input))
|| (type == RAVI_TARRAYFLT && ttistable(input)
&& hvalue(input)->ravi_array.array_type == RAVI_TARRAYFLT)
|| (type == RAVI_TARRAYINT && ttistable(input)
&& hvalue(input)->ravi_array.array_type == RAVI_TARRAYINT)
|| (type == RAVI_TTABLE && ttistable(input)
&& hvalue(input)->ravi_array.array_type == RAVI_TTABLE)
;
if (!compatible)
name = NULL;

@ -237,77 +237,64 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
}
#define GETTABLE_INLINE(L, t, key, val) \
if (ttistable(t)) { /* 't' is a table? */ \
Table *h = hvalue(t); \
switch (h->ravi_array.array_type) { \
case RAVI_TARRAYINT: { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
raviH_get_int_inline(L, h, ivalue(key), val); \
} break; \
case RAVI_TARRAYFLT: { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
raviH_get_float_inline(L, h, ivalue(key), val); \
} break; \
default: { \
const TValue *aux; \
if (luaV_fastget(L,t,key,aux,luaH_get)) { setobj2s(L, val, aux); } \
else luaV_finishget(L,t,key,val,aux); \
} \
} \
if (!ttistable(t) || hvalue(t)->ravi_array.array_type == RAVI_TTABLE) { \
const TValue *aux; \
if (luaV_fastget(L,t,key,aux,luaH_get)) { setobj2s(L, val, aux); } \
else luaV_finishget(L,t,key,val,aux); \
} \
else { \
Table *h = hvalue(t); \
if (h->ravi_array.array_type == RAVI_TARRAYFLT) { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
raviH_get_float_inline(L, h, ivalue(key), val); \
} \
else { \
const TValue *aux; \
if (luaV_fastget(L,t,key,aux,luaH_get)) { setobj2s(L, val, aux); } \
else luaV_finishget(L,t,key,val,aux); \
}
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
raviH_get_int_inline(L, h, ivalue(key), val); \
} \
}
#define SETTABLE_INLINE(L, t, key, val) \
if (ttistable(t)) { /* 't' is a table? */ \
Table *h = hvalue(t); \
switch (h->ravi_array.array_type) { \
case RAVI_TARRAYINT: { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
if (ttisinteger(val)) { \
raviH_set_int_inline(L, h, ivalue(key), ivalue(val)); \
} \
else { \
lua_Integer i = 0; \
if (luaV_tointeger_(val, &i)) { \
raviH_set_int_inline(L, h, ivalue(key), i); \
} \
else \
luaG_runerror(L, "value cannot be converted to integer"); \
} \
} break; \
case RAVI_TARRAYFLT: { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
if (ttisfloat(val)) { \
raviH_set_float_inline(L, h, ivalue(key), fltvalue(val)); \
} \
else if (ttisinteger(val)) { \
raviH_set_float_inline(L, h, ivalue(key), (lua_Number)(ivalue(val))); \
} \
else { \
lua_Number d = 0.0; \
if (luaV_tonumber_(val, &d)) { \
raviH_set_float_inline(L, h, ivalue(key), d); \
} \
else \
luaG_runerror(L, "value cannot be converted to number"); \
} \
} break; \
default: { \
const TValue *slot; \
if (!luaV_fastset(L, t, key, slot, luaH_get, val)) \
luaV_finishset(L, t, key, val, slot); \
if (!ttistable(t) || hvalue(t)->ravi_array.array_type == RAVI_TTABLE) { \
const TValue *slot; \
if (!luaV_fastset(L, t, key, slot, luaH_get, val)) \
luaV_finishset(L, t, key, val, slot); \
} \
else { \
Table *h = hvalue(t); \
if (h->ravi_array.array_type == RAVI_TARRAYFLT) { \
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
if (ttisfloat(val)) { \
raviH_set_float_inline(L, h, ivalue(key), fltvalue(val)); \
} \
else if (ttisinteger(val)) { \
raviH_set_float_inline(L, h, ivalue(key), (lua_Number)(ivalue(val))); \
} \
else { \
lua_Number d = 0.0; \
if (luaV_tonumber_(val, &d)) { \
raviH_set_float_inline(L, h, ivalue(key), d); \
} \
else \
luaG_runerror(L, "value cannot be converted to number"); \
} \
} \
else { \
const TValue *slot; \
if (!luaV_fastset(L, t, key, slot, luaH_get, val)) \
luaV_finishset(L, t, key, val, slot); \
}
if (!ttisinteger(key)) luaG_typeerror(L, key, "index"); \
if (ttisinteger(val)) { \
raviH_set_int_inline(L, h, ivalue(key), ivalue(val)); \
} \
else { \
lua_Integer i = 0; \
if (luaV_tointeger_(val, &i)) { \
raviH_set_int_inline(L, h, ivalue(key), i); \
} \
else \
luaG_runerror(L, "value cannot be converted to integer"); \
} \
} \
}
/*
** Main function for table access (invoking metamethods if needed).

Loading…
Cancel
Save