summaryrefslogtreecommitdiff
path: root/src/lj_api.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-17 00:44:14 +0100
committerMike Pall <mike>2011-02-17 00:44:14 +0100
commit03946ac978d9a1a3230619e3da048002e5fda2d1 (patch)
treec0a7b8edaccf789f128468320d451d9a1fee1495 /src/lj_api.c
parent963f05c7e153714921484e0de71a7cb6bab338d9 (diff)
downloadluajit2-03946ac978d9a1a3230619e3da048002e5fda2d1.tar.gz
DUALNUM: Add integer type to core VM.
Diffstat (limited to 'src/lj_api.c')
-rw-r--r--src/lj_api.c103
1 files changed, 61 insertions, 42 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index 92699078..f33748ce 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -115,7 +115,7 @@ LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)
LUA_API int lua_gettop(lua_State *L)
{
- return cast_int(L->top - L->base);
+ return (int)(L->top - L->base);
}
LUA_API void lua_settop(lua_State *L, int idx)
@@ -186,7 +186,7 @@ LUA_API void lua_pushvalue(lua_State *L, int idx)
LUA_API int lua_type(lua_State *L, int idx)
{
cTValue *o = index2adr(L, idx);
- if (tvisnum(o)) {
+ if (tvisnumber(o)) {
return LUA_TNUMBER;
#if LJ_64
} else if (tvislightud(o)) {
@@ -234,13 +234,13 @@ LUA_API int lua_isnumber(lua_State *L, int idx)
{
cTValue *o = index2adr(L, idx);
TValue tmp;
- return (tvisnum(o) || (tvisstr(o) && lj_str_tonum(strV(o), &tmp)));
+ return (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), &tmp)));
}
LUA_API int lua_isstring(lua_State *L, int idx)
{
cTValue *o = index2adr(L, idx);
- return (tvisstr(o) || tvisnum(o));
+ return (tvisstr(o) || tvisnumber(o));
}
LUA_API int lua_isuserdata(lua_State *L, int idx)
@@ -260,8 +260,10 @@ LUA_API int lua_equal(lua_State *L, int idx1, int idx2)
{
cTValue *o1 = index2adr(L, idx1);
cTValue *o2 = index2adr(L, idx2);
- if (tvisnum(o1) && tvisnum(o2)) {
- return numV(o1) == numV(o2);
+ if (tvisint(o1) && tvisint(o2)) {
+ return intV(o1) == intV(o2);
+ } else if (tvisnumber(o1) && tvisnumber(o2)) {
+ return numberVnum(o1) == numberVnum(o2);
} else if (itype(o1) != itype(o2)) {
return 0;
} else if (tvispri(o1)) {
@@ -293,8 +295,10 @@ LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2)
cTValue *o2 = index2adr(L, idx2);
if (o1 == niltv(L) || o2 == niltv(L)) {
return 0;
- } else if (tvisnum(o1) && tvisnum(o2)) {
- return numV(o1) < numV(o2);
+ } else if (tvisint(o1) && tvisint(o2)) {
+ return intV(o1) < intV(o2);
+ } else if (tvisnumber(o1) && tvisnumber(o2)) {
+ return numberVnum(o1) < numberVnum(o2);
} else {
TValue *base = lj_meta_comp(L, o1, o2, 0);
if ((uintptr_t)base <= 1) {
@@ -312,8 +316,8 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
{
cTValue *o = index2adr(L, idx);
TValue tmp;
- if (LJ_LIKELY(tvisnum(o)))
- return numV(o);
+ if (LJ_LIKELY(tvisnumber(o)))
+ return numberVnum(o);
else if (tvisstr(o) && lj_str_tonum(strV(o), &tmp))
return numV(&tmp);
else
@@ -324,8 +328,8 @@ LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
{
cTValue *o = index2adr(L, idx);
TValue tmp;
- if (tvisnum(o))
- return numV(o);
+ if (LJ_LIKELY(tvisnumber(o)))
+ return numberVnum(o);
else if (!(tvisstr(o) && lj_str_tonum(strV(o), &tmp)))
lj_err_argt(L, idx, LUA_TNUMBER);
return numV(&tmp);
@@ -335,8 +339,8 @@ LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def)
{
cTValue *o = index2adr(L, idx);
TValue tmp;
- if (tvisnum(o))
- return numV(o);
+ if (LJ_LIKELY(tvisnumber(o)))
+ return numberVnum(o);
else if (tvisnil(o))
return def;
else if (!(tvisstr(o) && lj_str_tonum(strV(o), &tmp)))
@@ -349,12 +353,17 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
cTValue *o = index2adr(L, idx);
TValue tmp;
lua_Number n;
- if (LJ_LIKELY(tvisnum(o)))
+ if (LJ_LIKELY(tvisint(o))) {
+ return intV(o);
+ } else if (LJ_LIKELY(tvisnum(o))) {
n = numV(o);
- else if (tvisstr(o) && lj_str_tonum(strV(o), &tmp))
+ } else {
+ if (!(tvisstr(o) && lj_str_tonumber(strV(o), &tmp)))
+ return 0;
+ if (tvisint(&tmp))
+ return (lua_Integer)intV(&tmp);
n = numV(&tmp);
- else
- return 0;
+ }
#if LJ_64
return (lua_Integer)n;
#else
@@ -367,12 +376,17 @@ LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
cTValue *o = index2adr(L, idx);
TValue tmp;
lua_Number n;
- if (LJ_LIKELY(tvisnum(o)))
+ if (LJ_LIKELY(tvisint(o))) {
+ return intV(o);
+ } else if (LJ_LIKELY(tvisnum(o))) {
n = numV(o);
- else if (tvisstr(o) && lj_str_tonum(strV(o), &tmp))
+ } else {
+ if (!(tvisstr(o) && lj_str_tonumber(strV(o), &tmp)))
+ lj_err_argt(L, idx, LUA_TNUMBER);
+ if (tvisint(&tmp))
+ return (lua_Integer)intV(&tmp);
n = numV(&tmp);
- else
- lj_err_argt(L, idx, LUA_TNUMBER);
+ }
#if LJ_64
return (lua_Integer)n;
#else
@@ -385,14 +399,19 @@ LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int idx, lua_Integer def)
cTValue *o = index2adr(L, idx);
TValue tmp;
lua_Number n;
- if (LJ_LIKELY(tvisnum(o)))
+ if (LJ_LIKELY(tvisint(o))) {
+ return intV(o);
+ } else if (LJ_LIKELY(tvisnum(o))) {
n = numV(o);
- else if (tvisnil(o))
+ } else if (tvisnil(o)) {
return def;
- else if (tvisstr(o) && lj_str_tonum(strV(o), &tmp))
+ } else {
+ if (!(tvisstr(o) && lj_str_tonumber(strV(o), &tmp)))
+ lj_err_argt(L, idx, LUA_TNUMBER);
+ if (tvisint(&tmp))
+ return (lua_Integer)intV(&tmp);
n = numV(&tmp);
- else
- lj_err_argt(L, idx, LUA_TNUMBER);
+ }
#if LJ_64
return (lua_Integer)n;
#else
@@ -412,10 +431,10 @@ LUA_API const char *lua_tolstring(lua_State *L, int idx, size_t *len)
GCstr *s;
if (LJ_LIKELY(tvisstr(o))) {
s = strV(o);
- } else if (tvisnum(o)) {
+ } else if (tvisnumber(o)) {
lj_gc_check(L);
o = index2adr(L, idx); /* GC may move the stack. */
- s = lj_str_fromnum(L, &o->n);
+ s = lj_str_fromnumber(L, o);
} else {
if (len != NULL) *len = 0;
return NULL;
@@ -430,10 +449,10 @@ LUALIB_API const char *luaL_checklstring(lua_State *L, int idx, size_t *len)
GCstr *s;
if (LJ_LIKELY(tvisstr(o))) {
s = strV(o);
- } else if (tvisnum(o)) {
+ } else if (tvisnumber(o)) {
lj_gc_check(L);
o = index2adr(L, idx); /* GC may move the stack. */
- s = lj_str_fromnum(L, &o->n);
+ s = lj_str_fromnumber(L, o);
} else {
lj_err_argt(L, idx, LUA_TSTRING);
}
@@ -451,10 +470,10 @@ LUALIB_API const char *luaL_optlstring(lua_State *L, int idx,
} else if (tvisnil(o)) {
if (len != NULL) *len = def ? strlen(def) : 0;
return def;
- } else if (tvisnum(o)) {
+ } else if (tvisnumber(o)) {
lj_gc_check(L);
o = index2adr(L, idx); /* GC may move the stack. */
- s = lj_str_fromnum(L, &o->n);
+ s = lj_str_fromnumber(L, o);
} else {
lj_err_argt(L, idx, LUA_TSTRING);
}
@@ -484,8 +503,8 @@ LUA_API size_t lua_objlen(lua_State *L, int idx)
return cast(size_t, lj_tab_len(tabV(o)));
else if (tvisudata(o))
return udataV(o)->len;
- else if (tvisnum(o))
- return lj_str_fromnum(L, &o->n)->len;
+ else if (tvisnumber(o))
+ return lj_str_fromnumber(L, o)->len;
else
return 0;
}
@@ -551,7 +570,7 @@ LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
LUA_API void lua_pushinteger(lua_State *L, lua_Integer n)
{
- setnumV(L->top, cast_num(n));
+ setintptrV(L->top, n);
incr_top(L);
}
@@ -687,7 +706,7 @@ LUA_API void lua_concat(lua_State *L, int n)
L->top -= n;
break;
}
- n -= cast_int(L->top - top);
+ n -= (int)(L->top - top);
L->top = top+2;
lj_vm_call(L, top, 1+1);
L->top--;
@@ -1085,7 +1104,7 @@ LUA_API int lua_yield(lua_State *L, int nresults)
setcont(top+1, lj_cont_hook);
setframe_pc(top+1, cframe_pc(cf)-1);
setframe_gc(top+2, obj2gco(L));
- top[2].fr.tp.ftsz = cast_int((char *)(top+3)-(char *)L->base)+FRAME_CONT;
+ top[2].fr.tp.ftsz = (int)((char *)(top+3)-(char *)L->base)+FRAME_CONT;
L->top = L->base = top+3;
}
L->cframe = NULL;
@@ -1160,10 +1179,10 @@ LUA_API int lua_gc(lua_State *L, int what, int data)
lj_gc_fullgc(L);
break;
case LUA_GCCOUNT:
- res = cast_int(g->gc.total >> 10);
+ res = (int)(g->gc.total >> 10);
break;
case LUA_GCCOUNTB:
- res = cast_int(g->gc.total & 0x3ff);
+ res = (int)(g->gc.total & 0x3ff);
break;
case LUA_GCSTEP: {
MSize a = (MSize)data << 10;
@@ -1176,11 +1195,11 @@ LUA_API int lua_gc(lua_State *L, int what, int data)
break;
}
case LUA_GCSETPAUSE:
- res = cast_int(g->gc.pause);
+ res = (int)(g->gc.pause);
g->gc.pause = (MSize)data;
break;
case LUA_GCSETSTEPMUL:
- res = cast_int(g->gc.stepmul);
+ res = (int)(g->gc.stepmul);
g->gc.stepmul = (MSize)data;
break;
default: