diff options
Diffstat (limited to 'src/lj_lib.c')
-rw-r--r-- | src/lj_lib.c | 41 |
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 | ||
155 | void 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 | |||
154 | lua_Number lj_lib_checknum(lua_State *L, int narg) | 164 | lua_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 | ||
163 | int32_t lj_lib_checkint(lua_State *L, int narg) | 179 | int32_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 | ||
172 | int32_t lj_lib_optint(lua_State *L, int narg, int32_t def) | 194 | int32_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 | ||
200 | int32_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 | |||
178 | GCfunc *lj_lib_checkfunc(lua_State *L, int narg) | 215 | GCfunc *lj_lib_checkfunc(lua_State *L, int narg) |
179 | { | 216 | { |
180 | TValue *o = L->base + narg-1; | 217 | TValue *o = L->base + narg-1; |