aboutsummaryrefslogtreecommitdiff
path: root/src/lj_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_lib.c')
-rw-r--r--src/lj_lib.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/lj_lib.c b/src/lj_lib.c
index 930e59a0..655ad085 100644
--- a/src/lj_lib.c
+++ b/src/lj_lib.c
@@ -151,13 +151,29 @@ GCstr *lj_lib_optstr(lua_State *L, int narg)
151 return (o < L->top && !tvisnil(o)) ? lj_lib_checkstr(L, narg) : NULL; 151 return (o < L->top && !tvisnil(o)) ? lj_lib_checkstr(L, narg) : NULL;
152} 152}
153 153
154#if LJ_DUALNUM
155void lj_lib_checknumber(lua_State *L, int narg)
156{
157 TValue *o = L->base + narg-1;
158 if (!(o < L->top &&
159 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o)))))
160 lj_err_argt(L, narg, LUA_TNUMBER);
161}
162#endif
163
154lua_Number lj_lib_checknum(lua_State *L, int narg) 164lua_Number lj_lib_checknum(lua_State *L, int narg)
155{ 165{
156 TValue *o = L->base + narg-1; 166 TValue *o = L->base + narg-1;
157 if (!(o < L->top && 167 if (!(o < L->top &&
158 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o))))) 168 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o)))))
159 lj_err_argt(L, narg, LUA_TNUMBER); 169 lj_err_argt(L, narg, LUA_TNUMBER);
160 return numberVnum(o); 170 if (LJ_UNLIKELY(tvisint(o))) {
171 lua_Number n = (lua_Number)intV(o);
172 setnumV(o, n);
173 return n;
174 } else {
175 return numV(o);
176 }
161} 177}
162 178
163int32_t lj_lib_checkint(lua_State *L, int narg) 179int32_t lj_lib_checkint(lua_State *L, int narg)
@@ -166,7 +182,13 @@ int32_t lj_lib_checkint(lua_State *L, int narg)
166 if (!(o < L->top && 182 if (!(o < L->top &&
167 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o))))) 183 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o)))))
168 lj_err_argt(L, narg, LUA_TNUMBER); 184 lj_err_argt(L, narg, LUA_TNUMBER);
169 return numberVint(o); 185 if (LJ_LIKELY(tvisint(o))) {
186 return intV(o);
187 } else {
188 int32_t i = lj_num2int(numV(o));
189 if (LJ_DUALNUM) setintV(o, i);
190 return i;
191 }
170} 192}
171 193
172int32_t lj_lib_optint(lua_State *L, int narg, int32_t def) 194int32_t lj_lib_optint(lua_State *L, int narg, int32_t def)
@@ -175,6 +197,21 @@ int32_t lj_lib_optint(lua_State *L, int narg, int32_t def)
175 return (o < L->top && !tvisnil(o)) ? lj_lib_checkint(L, narg) : def; 197 return (o < L->top && !tvisnil(o)) ? lj_lib_checkint(L, narg) : def;
176} 198}
177 199
200int32_t lj_lib_checkbit(lua_State *L, int narg)
201{
202 TValue *o = L->base + narg-1;
203 if (!(o < L->top &&
204 (tvisnumber(o) || (tvisstr(o) && lj_str_tonumber(strV(o), o)))))
205 lj_err_argt(L, narg, LUA_TNUMBER);
206 if (LJ_LIKELY(tvisint(o))) {
207 return intV(o);
208 } else {
209 int32_t i = lj_num2bit(numV(o));
210 if (LJ_DUALNUM) setintV(o, i);
211 return i;
212 }
213}
214
178GCfunc *lj_lib_checkfunc(lua_State *L, int narg) 215GCfunc *lj_lib_checkfunc(lua_State *L, int narg)
179{ 216{
180 TValue *o = L->base + narg-1; 217 TValue *o = L->base + narg-1;