diff --git a/lapi.c b/lapi.c index ceb17bca..7388db33 100644 --- a/lapi.c +++ b/lapi.c @@ -1,5 +1,5 @@ /* -** $Id: lapi.c,v 2.144 2010/12/29 18:00:23 roberto Exp roberto $ +** $Id: lapi.c,v 2.145 2011/04/05 14:26:23 roberto Exp roberto $ ** Lua API ** See Copyright Notice in lua.h */ @@ -278,7 +278,7 @@ LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { StkId o1 = index2addr(L, index1); StkId o2 = index2addr(L, index2); return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 - : luaO_rawequalObj(o1, o2); + : luaV_rawequalObj(o1, o2); } diff --git a/lcode.c b/lcode.c index a1650979..572564d7 100644 --- a/lcode.c +++ b/lcode.c @@ -1,5 +1,5 @@ /* -** $Id: lcode.c,v 2.53 2011/04/19 16:22:13 roberto Exp roberto $ +** $Id: lcode.c,v 2.54 2011/04/28 14:00:11 roberto Exp roberto $ ** Code generator for Lua ** See Copyright Notice in lua.h */ @@ -23,6 +23,7 @@ #include "lparser.h" #include "lstring.h" #include "ltable.h" +#include "lvm.h" #define hasjumps(e) ((e)->t != (e)->f) @@ -295,7 +296,7 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { if (ttisnumber(idx)) { lua_Number n = nvalue(idx); lua_number2int(k, n); - if (luaO_rawequalObj(&f->k[k], v)) + if (luaV_rawequalObj(&f->k[k], v)) return k; /* else may be a collision (e.g., between 0.0 and "\0\0\0\0\0\0\0\0"); go through and create a new entry for this value */ diff --git a/lobject.c b/lobject.c index bd541a1e..7b7110cb 100644 --- a/lobject.c +++ b/lobject.c @@ -1,5 +1,5 @@ /* -** $Id: lobject.c,v 2.47 2011/04/05 18:32:06 roberto Exp roberto $ +** $Id: lobject.c,v 2.48 2011/05/03 16:01:57 roberto Exp roberto $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ @@ -70,28 +70,6 @@ int luaO_ceillog2 (unsigned int x) { } -int luaO_rawequalObj (const TValue *t1, const TValue *t2) { - if (!ttisequal(t1, t2)) return 0; - else 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); /* boolean true must be 1 !! */ - case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2); - case LUA_TSTRING: - return rawtsvalue(t1) == rawtsvalue(t2); - case LUA_TLCF: - return fvalue(t1) == fvalue(t2); - default: - lua_assert(iscollectable(t1)); - return gcvalue(t1) == gcvalue(t2); - } -} - - lua_Number luaO_arith (int op, lua_Number v1, lua_Number v2) { switch (op) { case LUA_OPADD: return luai_numadd(NULL, v1, v2); diff --git a/lobject.h b/lobject.h index 79617c5f..8c27c522 100644 --- a/lobject.h +++ b/lobject.h @@ -1,5 +1,5 @@ /* -** $Id: lobject.h,v 2.53 2011/05/05 19:43:14 roberto Exp roberto $ +** $Id: lobject.h,v 2.54 2011/05/26 17:12:31 roberto Exp roberto $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ @@ -431,11 +431,11 @@ typedef struct Table { LUAI_DDEC const TValue luaO_nilobject_; + LUAI_FUNC int luaO_int2fb (unsigned int x); LUAI_FUNC int luaO_fb2int (int x); LUAI_FUNC int luaO_ceillog2 (unsigned int x); LUAI_FUNC lua_Number luaO_arith (int op, lua_Number v1, lua_Number v2); -LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); LUAI_FUNC int luaO_str2d (const char *s, size_t len, lua_Number *result); LUAI_FUNC int luaO_hexavalue (int c); LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, diff --git a/ltable.c b/ltable.c index e8789a55..60f579a6 100644 --- a/ltable.c +++ b/ltable.c @@ -1,5 +1,5 @@ /* -** $Id: ltable.c,v 2.54 2011/04/05 18:32:28 roberto Exp roberto $ +** $Id: ltable.c,v 2.55 2011/05/02 16:45:32 roberto Exp roberto $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ @@ -33,6 +33,7 @@ #include "lstate.h" #include "lstring.h" #include "ltable.h" +#include "lvm.h" /* @@ -148,7 +149,7 @@ static int findindex (lua_State *L, Table *t, StkId key) { Node *n = mainposition(t, key); do { /* check whether `key' is somewhere in the chain */ /* key may be dead already, but it is ok to use it in `next' */ - if (luaO_rawequalObj(gkey(n), key) || + if (luaV_rawequalObj(gkey(n), key) || (ttisdeadkey(gkey(n)) && iscollectable(key) && gcvalue(gkey(n)) == gcvalue(key))) { i = cast_int(n - gnode(t, 0)); /* key index in hash table */ @@ -481,7 +482,7 @@ const TValue *luaH_get (Table *t, const TValue *key) { default: { Node *n = mainposition(t, key); do { /* check whether `key' is somewhere in the chain */ - if (luaO_rawequalObj(gkey(n), key)) + if (luaV_rawequalObj(gkey(n), key)) return gval(n); /* that's it */ else n = gnext(n); } while (n); diff --git a/lvm.c b/lvm.c index 02d17fad..1f4b7bc1 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.136 2011/04/19 16:22:13 roberto Exp roberto $ +** $Id: lvm.c,v 2.137 2011/05/05 16:16:33 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -174,7 +174,7 @@ static const TValue *get_equalTM (lua_State *L, Table *mt1, Table *mt2, if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ tm2 = fasttm(L, mt2, event); if (tm2 == NULL) return NULL; /* no metamethod */ - if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ + if (luaV_rawequalObj(tm1, tm2)) /* same metamethods? */ return tm1; return NULL; } @@ -237,6 +237,9 @@ int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { } +/* +** equality of Lua values. L == NULL means raw equality (no metamethods) +*/ int luaV_equalval_ (lua_State *L, const TValue *t1, const TValue *t2) { const TValue *tm; lua_assert(ttisequal(t1, t2)); @@ -249,15 +252,19 @@ int luaV_equalval_ (lua_State *L, const TValue *t1, const TValue *t2) { case LUA_TSTRING: return eqstr(rawtsvalue(t1), rawtsvalue(t2)); case LUA_TUSERDATA: { if (uvalue(t1) == uvalue(t2)) return 1; + else if (L == NULL) return 0; tm = get_equalTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } case LUA_TTABLE: { if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; tm = get_equalTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } - default: return gcvalue(t1) == gcvalue(t2); + default: + lua_assert(iscollectable(t1)); + return gcvalue(t1) == gcvalue(t2); } if (tm == NULL) return 0; /* no TM? */ callTM(L, tm, t1, t2, L->top, 1); /* call TM */ diff --git a/lvm.h b/lvm.h index 8e61cf34..39c50b9a 100644 --- a/lvm.h +++ b/lvm.h @@ -1,5 +1,5 @@ /* -** $Id: lvm.h,v 2.14 2009/12/17 16:20:01 roberto Exp roberto $ +** $Id: lvm.h,v 2.15 2011/04/05 18:32:06 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -19,10 +19,14 @@ #define equalobj(L,o1,o2) (ttisequal(o1, o2) && luaV_equalval_(L, o1, o2)) +#define luaV_rawequalObj(t1,t2) \ + (ttisequal(t1,t2) && luaV_equalval_(NULL,t1,t2)) + /* not to called directly */ LUAI_FUNC int luaV_equalval_ (lua_State *L, const TValue *t1, const TValue *t2); + LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n);