summaryrefslogtreecommitdiff
path: root/src/lj_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_api.c')
-rw-r--r--src/lj_api.c136
1 files changed, 134 insertions, 2 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index ea4eaf66..db48e3a6 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -91,6 +91,12 @@ LUA_API int lua_checkstack(lua_State *L, int size)
91 return 1; 91 return 1;
92} 92}
93 93
94LUALIB_API void luaL_checkstack(lua_State *L, int size, const char *msg)
95{
96 if (!lua_checkstack(L, size))
97 lj_err_callerv(L, LJ_ERR_STKOVM, msg);
98}
99
94LUA_API void lua_xmove(lua_State *from, lua_State *to, int n) 100LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)
95{ 101{
96 TValue *f, *t; 102 TValue *f, *t;
@@ -193,6 +199,18 @@ LUA_API int lua_type(lua_State *L, int idx)
193 } 199 }
194} 200}
195 201
202LUALIB_API void luaL_checktype(lua_State *L, int idx, int tt)
203{
204 if (lua_type(L, idx) != tt)
205 lj_err_argt(L, idx, tt);
206}
207
208LUALIB_API void luaL_checkany(lua_State *L, int idx)
209{
210 if (index2adr(L, idx) == niltv(L))
211 lj_err_arg(L, idx, LJ_ERR_NOVAL);
212}
213
196LUA_API const char *lua_typename(lua_State *L, int t) 214LUA_API const char *lua_typename(lua_State *L, int t)
197{ 215{
198 UNUSED(L); 216 UNUSED(L);
@@ -202,7 +220,7 @@ LUA_API const char *lua_typename(lua_State *L, int t)
202LUA_API int lua_iscfunction(lua_State *L, int idx) 220LUA_API int lua_iscfunction(lua_State *L, int idx)
203{ 221{
204 cTValue *o = index2adr(L, idx); 222 cTValue *o = index2adr(L, idx);
205 return !isluafunc(funcV(o)); 223 return tvisfunc(o) && !isluafunc(funcV(o));
206} 224}
207 225
208LUA_API int lua_isnumber(lua_State *L, int idx) 226LUA_API int lua_isnumber(lua_State *L, int idx)
@@ -295,6 +313,30 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
295 return 0; 313 return 0;
296} 314}
297 315
316LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
317{
318 cTValue *o = index2adr(L, idx);
319 TValue tmp;
320 if (tvisnum(o))
321 return numV(o);
322 else if (!(tvisstr(o) && lj_str_numconv(strVdata(o), &tmp)))
323 lj_err_argt(L, idx, LUA_TNUMBER);
324 return numV(&tmp);
325}
326
327LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def)
328{
329 cTValue *o = index2adr(L, idx);
330 TValue tmp;
331 if (tvisnum(o))
332 return numV(o);
333 else if (tvisnil(o))
334 return def;
335 else if (!(tvisstr(o) && lj_str_numconv(strVdata(o), &tmp)))
336 lj_err_argt(L, idx, LUA_TNUMBER);
337 return numV(&tmp);
338}
339
298LUA_API lua_Integer lua_tointeger(lua_State *L, int idx) 340LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
299{ 341{
300 cTValue *o = index2adr(L, idx); 342 cTValue *o = index2adr(L, idx);
@@ -313,6 +355,44 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
313#endif 355#endif
314} 356}
315 357
358LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
359{
360 cTValue *o = index2adr(L, idx);
361 TValue tmp;
362 lua_Number n;
363 if (LJ_LIKELY(tvisnum(o)))
364 n = numV(o);
365 else if (tvisstr(o) && lj_str_numconv(strVdata(o), &tmp))
366 n = numV(&tmp);
367 else
368 lj_err_argt(L, idx, LUA_TNUMBER);
369#if LJ_64
370 return (lua_Integer)n;
371#else
372 return lj_num2int(n);
373#endif
374}
375
376LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int idx, lua_Integer def)
377{
378 cTValue *o = index2adr(L, idx);
379 TValue tmp;
380 lua_Number n;
381 if (LJ_LIKELY(tvisnum(o)))
382 n = numV(o);
383 else if (tvisnil(o))
384 return def;
385 else if (tvisstr(o) && lj_str_numconv(strVdata(o), &tmp))
386 n = numV(&tmp);
387 else
388 lj_err_argt(L, idx, LUA_TNUMBER);
389#if LJ_64
390 return (lua_Integer)n;
391#else
392 return lj_num2int(n);
393#endif
394}
395
316LUA_API int lua_toboolean(lua_State *L, int idx) 396LUA_API int lua_toboolean(lua_State *L, int idx)
317{ 397{
318 cTValue *o = index2adr(L, idx); 398 cTValue *o = index2adr(L, idx);
@@ -337,6 +417,57 @@ LUA_API const char *lua_tolstring(lua_State *L, int idx, size_t *len)
337 return strdata(s); 417 return strdata(s);
338} 418}
339 419
420LUALIB_API const char *luaL_checklstring(lua_State *L, int idx, size_t *len)
421{
422 TValue *o = index2adr(L, idx);
423 GCstr *s;
424 if (LJ_LIKELY(tvisstr(o))) {
425 s = strV(o);
426 } else if (tvisnum(o)) {
427 lj_gc_check(L);
428 o = index2adr(L, idx); /* GC may move the stack. */
429 s = lj_str_fromnum(L, &o->n);
430 } else {
431 lj_err_argt(L, idx, LUA_TSTRING);
432 }
433 if (len != NULL) *len = s->len;
434 return strdata(s);
435}
436
437LUALIB_API const char *luaL_optlstring(lua_State *L, int idx,
438 const char *def, size_t *len)
439{
440 TValue *o = index2adr(L, idx);
441 GCstr *s;
442 if (LJ_LIKELY(tvisstr(o))) {
443 s = strV(o);
444 } else if (tvisnil(o)) {
445 if (len != NULL) *len = def ? strlen(def) : 0;
446 return def;
447 } else if (tvisnum(o)) {
448 lj_gc_check(L);
449 o = index2adr(L, idx); /* GC may move the stack. */
450 s = lj_str_fromnum(L, &o->n);
451 } else {
452 lj_err_argt(L, idx, LUA_TSTRING);
453 }
454 if (len != NULL) *len = s->len;
455 return strdata(s);
456}
457
458LUALIB_API int luaL_checkoption(lua_State *L, int idx, const char *def,
459 const char *const lst[])
460{
461 ptrdiff_t i;
462 const char *s = lua_tolstring(L, idx, NULL);
463 if (s == NULL && (s = def) == NULL)
464 lj_err_argt(L, idx, LUA_TSTRING);
465 for (i = 0; lst[i]; i++)
466 if (strcmp(lst[i], s) == 0)
467 return (int)i;
468 lj_err_argv(L, idx, LJ_ERR_INVOPTM, s);
469}
470
340LUA_API size_t lua_objlen(lua_State *L, int idx) 471LUA_API size_t lua_objlen(lua_State *L, int idx)
341{ 472{
342 TValue *o = index2adr(L, idx); 473 TValue *o = index2adr(L, idx);
@@ -355,7 +486,8 @@ LUA_API size_t lua_objlen(lua_State *L, int idx)
355LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx) 486LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx)
356{ 487{
357 cTValue *o = index2adr(L, idx); 488 cTValue *o = index2adr(L, idx);
358 return funcV(o)->c.gate == lj_gate_c ? funcV(o)->c.f : NULL; 489 ASMFunction gate = funcV(o)->c.gate;
490 return (gate == lj_gate_c || gate == lj_gate_cwrap) ? funcV(o)->c.f : NULL;
359} 491}
360 492
361LUA_API void *lua_touserdata(lua_State *L, int idx) 493LUA_API void *lua_touserdata(lua_State *L, int idx)