int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { const TValue *tm; lua_assert(ttype(t1) == ttype(t2)); switch (ttype(t1)) { case LUA_TNIL: return 1; case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); case LUA_TUSERDATA: { if (uvalue(t1) == uvalue(t2)) return 1; tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } case LUA_TTABLE: { if (hvalue(t1) == hvalue(t2)) return 1; tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } default: return gcvalue(t1) == gcvalue(t2); } if (tm == NULL) return 0; /* no TM? */ callTMres(L, L->top, tm, t1, t2); /* call TM */ return !l_isfalse(L->top); }
/* Note: 'luaV_equalval()' and 'luaO_rawequalObj()' have largely overlapping * implementation. */ int luaV_equalval (lua_State *L, const TValue *l, const TValue *r) { const TValue *tm; lua_assert( ttype_ext(l) == ttype_ext(r) ); switch (ttype(l)) { case LUA_TNIL: return 1; #ifdef LUA_TINT case LUA_TINT: #endif case LUA_TNUMBER: return luaO_rawequalObj(l,r); case LUA_TBOOLEAN: return bvalue(l) == bvalue(r); /* true must be 1 !! */ case LUA_TLIGHTUSERDATA: return pvalue(l) == pvalue(r); case LUA_TUSERDATA: { if (uvalue(l) == uvalue(r)) return 1; tm = get_compTM(L, uvalue(l)->metatable, uvalue(r)->metatable, TM_EQ); break; /* will try TM */ } case LUA_TTABLE: { if (hvalue(l) == hvalue(r)) return 1; tm = get_compTM(L, hvalue(l)->metatable, hvalue(r)->metatable, TM_EQ); break; /* will try TM */ } default: return gcvalue(l) == gcvalue(r); } if (tm == NULL) return 0; /* no TM? */ callTMres(L, L->top, tm, l, r); /* call TM */ return !l_isfalse(L->top); }