LUA_API int lua_equal (lua_State *L, int index1, int index2) { StkId o1, o2; int i; lua_lock(L); /* may call tag method */ o1 = luaA_indexAcceptable(L, index1); o2 = luaA_indexAcceptable(L, index2); i = (o1 == NULL || o2 == NULL) ? 0 /* index out of range */ : equalobj(L, o1, o2); lua_unlock(L); return i; }
LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { StkId o1, o2; int i; lua_lock(L); /* may call tag method */ o1 = luaA_indexAcceptable(L, index1); o2 = luaA_indexAcceptable(L, index2); i = (o1 == NULL || o2 == NULL) ? 0 /* index out-of-range */ : luaV_lessthan(L, o1, o2); lua_unlock(L); return i; }
LUA_API int lua_isnumber (lua_State *L, int idx) { #if LUA_REFCOUNT int ret; TObject n; const TObject *o = luaA_indexAcceptable(L, idx); setnilvalue2n(&n); ret = (o != NULL && tonumber(o, &n)); setnilvalue(&n); return ret; #else !LUA_REFCOUNT TObject n; const TObject *o = luaA_indexAcceptable(L, idx); return (o != NULL && tonumber(o, &n)); #endif LUA_REFCOUNT }
LUA_API int lua_getmetatable (lua_State *L, int objindex) { const TObject *obj; Table *mt = NULL; int res; lua_lock(L); obj = luaA_indexAcceptable(L, objindex); if (obj != NULL) { switch (ttype(obj)) { case LUA_TTABLE: mt = hvalue(obj)->metatable; break; case LUA_TUSERDATA: mt = uvalue(obj)->uv.metatable; break; } } if (mt == NULL || mt == hvalue(defaultmeta(L))) res = 0; else { sethvalue(L->top, mt); api_incr_top(L); res = 1; } lua_unlock(L); return res; }
LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { TObject n; const TObject *o = luaA_indexAcceptable(L, idx); if (o != NULL && tonumber(o, &n)) return nvalue(o); else return 0; }
LUA_API void *lua_touserdata (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); if (o == NULL) return NULL; switch (ttype(o)) { case LUA_TUSERDATA: return (uvalue(o) + 1); case LUA_TLIGHTUSERDATA: return pvalue(o); default: return NULL; } }
LUA_API const void *lua_topointer (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); if (o == NULL) return NULL; switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TFUNCTION: return clvalue(o); default: return NULL; } }
LUA_API int lua_getmetatable (lua_State *L, int objindex) { const TObject *obj; Table *mt = NULL; int res; lua_lock(L); obj = luaA_indexAcceptable(L, objindex); mt = luaT_getmetatable(L, obj); sethvalue(L->top, mt); api_incr_top(L); res = 1; lua_unlock(L); return res; }
LUA_API const lua_WChar *lua_towstring (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); if (o == NULL) return NULL; else if (ttype(o) == LUA_TWSTRING) return wsvalue(o); else { const lua_WChar *s; lua_lock(L); /* `luaV_tostring' may create a new string */ s = (luaV_towstring(L, o) == 0) ? wsvalue(o) : NULL; lua_unlock(L); return s; } }
LUA_API size_t lua_strlen (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); if (o == NULL) return 0; else if (ttisstring(o)) return tsvalue(o)->tsv.len; else { size_t l; lua_lock(L); /* `luaV_tostring' may create a new string */ l = (luaV_tostring(L, o) ? tsvalue(o)->tsv.len : 0); lua_unlock(L); return l; } }
LUA_API const void *lua_topointer (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); if (o == NULL) return NULL; else { switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TFUNCTION: return clvalue(o); case LUA_TTHREAD: return thvalue(o); case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: return lua_touserdata(L, idx); default: return NULL; } } }
LUA_API const char *lua_tostring (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); if (o == NULL) return NULL; else if (ttisstring(o)) return svalue(o); else { const char *s; lua_lock(L); /* `luaV_tostring' may create a new string */ s = (luaV_tostring(L, o) ? svalue(o) : NULL); luaC_checkGC(L); lua_unlock(L); return s; } }
LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { TObject n; const TObject *o = luaA_indexAcceptable(L, idx); #if LUA_REFCOUNT setnilvalue2n(&n); if (o != NULL && tonumber(o, &n)) { lua_Number theNumber = nvalue(o); setnilvalue(&n); return theNumber; } #else !LUA_REFCOUNT if (o != NULL && tonumber(o, &n)) return nvalue(o); #endif LUA_REFCOUNT else return 0; }
LUA_API int lua_tag (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL) ? LUA_NOTAG : luaT_tag(o); }
LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); return (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->c.f; }
LUA_API int lua_toboolean (lua_State *L, int idx) { const TObject *o = luaA_indexAcceptable(L, idx); return (o != NULL) && !l_isfalse(o); // weet: 这个处理方式有意思. }
LUA_API void *lua_touserdata (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : tsvalue(o)->u.d.value; }
LUA_API int lua_isnumber (lua_State *L, int index) { TObject *o = luaA_indexAcceptable(L, index); return (o == NULL) ? 0 : (tonumber(o) == 0); }
LUA_API double lua_tonumber (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tonumber(o)) ? 0 : nvalue(o); }
LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { StkId o1 = luaA_indexAcceptable(L, index1); StkId o2 = luaA_indexAcceptable(L, index2); return (o1 == NULL || o2 == NULL) ? 0 /* index out of range */ : luaO_rawequalObj(o1, o2); }
LUA_API int lua_isuserdata (lua_State *L, int idx) { const TObject *o = luaA_indexAcceptable(L, idx); return (o != NULL && (ttisuserdata(o) || ttislightuserdata(o))); }
LUA_API int lua_iscfunction (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); return (o == NULL) ? 0 : iscfunction(o); }
LUA_API int lua_type (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); return (o == NULL) ? LUA_TNONE : ttype(o); }
LUA_API const char *lua_tostring (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tostring(L, o)) ? NULL : svalue(o); }
LUA_API lua_State *lua_tothread (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); return (o == NULL || !ttisthread(o)) ? NULL : thvalue(o); }
LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { StkId o1 = luaA_indexAcceptable(L, index1); StkId o2 = luaA_indexAcceptable(L, index2); if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ else return luaV_lessthan(L, o1, o2, L->top); }
LUA_API int lua_equal (lua_State *L, int index1, int index2) { StkId o1 = luaA_indexAcceptable(L, index1); StkId o2 = luaA_indexAcceptable(L, index2); if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ else return luaO_equalObj(o1, o2); }
LUA_API int lua_isnumber (lua_State *L, int idx) { TObject n; const TObject *o = luaA_indexAcceptable(L, idx); return (o != NULL && tonumber(o, &n)); }
LUA_API size_t lua_strlen (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tostring(L, o)) ? 0 : tsvalue(o)->len; }