aboutsummaryrefslogtreecommitdiff
path: root/src/lj_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_api.c')
-rw-r--r--src/lj_api.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index fe8880eb..d17a5754 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -342,6 +342,22 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
342 return 0; 342 return 0;
343} 343}
344 344
345LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *ok)
346{
347 cTValue *o = index2adr(L, idx);
348 TValue tmp;
349 if (LJ_LIKELY(tvisnumber(o))) {
350 if (ok) *ok = 1;
351 return numberVnum(o);
352 } else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
353 if (ok) *ok = 1;
354 return numV(&tmp);
355 } else {
356 if (ok) *ok = 0;
357 return 0;
358 }
359}
360
345LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx) 361LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
346{ 362{
347 cTValue *o = index2adr(L, idx); 363 cTValue *o = index2adr(L, idx);
@@ -379,9 +395,38 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
379 if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) 395 if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))
380 return 0; 396 return 0;
381 if (tvisint(&tmp)) 397 if (tvisint(&tmp))
382 return (lua_Integer)intV(&tmp); 398 return intV(&tmp);
399 n = numV(&tmp);
400 }
401#if LJ_64
402 return (lua_Integer)n;
403#else
404 return lj_num2int(n);
405#endif
406}
407
408LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *ok)
409{
410 cTValue *o = index2adr(L, idx);
411 TValue tmp;
412 lua_Number n;
413 if (LJ_LIKELY(tvisint(o))) {
414 if (ok) *ok = 1;
415 return intV(o);
416 } else if (LJ_LIKELY(tvisnum(o))) {
417 n = numV(o);
418 } else {
419 if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
420 if (ok) *ok = 0;
421 return 0;
422 }
423 if (tvisint(&tmp)) {
424 if (ok) *ok = 1;
425 return intV(&tmp);
426 }
383 n = numV(&tmp); 427 n = numV(&tmp);
384 } 428 }
429 if (ok) *ok = 1;
385#if LJ_64 430#if LJ_64
386 return (lua_Integer)n; 431 return (lua_Integer)n;
387#else 432#else