aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-13 10:39:55 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-13 10:39:55 -0300
commit864c96f36ce8410b03652b1cb9800e4b3c76bcf7 (patch)
treed5061c0babf25cf222953e5195673534f8287f34 /lvm.c
parent0052930ffe8c86f0df7ab99dd1b6668f9e10c781 (diff)
downloadlua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.tar.gz
lua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.tar.bz2
lua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.zip
new fallback for equality `__eq'
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/lvm.c b/lvm.c
index d68710b8..758018b3 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.236 2002/06/06 18:17:33 roberto Exp roberto $ 2** $Id: lvm.c,v 1.237 2002/06/12 14:51:31 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -250,6 +250,34 @@ static int luaV_lessequal (lua_State *L, const TObject *l, const TObject *r) {
250} 250}
251 251
252 252
253int luaV_equalval (lua_State *L, const TObject *t1, const TObject *t2) {
254 const TObject *tm = NULL;
255 lua_assert(ttype(t1) == ttype(t2));
256 switch (ttype(t1)) {
257 case LUA_TNIL: return 1;
258 case LUA_TNUMBER: return nvalue(t1) == nvalue(t2);
259 case LUA_TSTRING: return tsvalue(t1) == tsvalue(t2);
260 case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */
261 case LUA_TUDATAVAL: return pvalue(t1) == pvalue(t2);
262 case LUA_TFUNCTION: return clvalue(t1) == clvalue(t2);
263 case LUA_TUSERDATA:
264 if (uvalue(t1) == uvalue(t2)) return 1;
265 else if ((tm = fasttm(L, uvalue(t1)->uv.metatable, TM_EQ)) == NULL &&
266 (tm = fasttm(L, uvalue(t2)->uv.metatable, TM_EQ)) == NULL)
267 return 0; /* no TM */
268 else break; /* will try TM */
269 case LUA_TTABLE:
270 if (hvalue(t1) == hvalue(t2)) return 1;
271 else if ((tm = fasttm(L, hvalue(t1)->metatable, TM_EQ)) == NULL &&
272 (tm = fasttm(L, hvalue(t2)->metatable, TM_EQ)) == NULL)
273 return 0; /* no TM */
274 else break; /* will try TM */
275 }
276 callTMres(L, tm, t1, t2, L->top); /* call TM */
277 return !l_isfalse(L->top);
278}
279
280
253void luaV_concat (lua_State *L, int total, int last) { 281void luaV_concat (lua_State *L, int total, int last) {
254 do { 282 do {
255 StkId top = L->ci->base + last + 1; 283 StkId top = L->ci->base + last + 1;
@@ -464,7 +492,7 @@ StkId luaV_execute (lua_State *L) {
464 break; 492 break;
465 } 493 }
466 case OP_EQ: { /* skip next instruction if test fails */ 494 case OP_EQ: { /* skip next instruction if test fails */
467 if (luaO_equalObj(ra, RKC(i)) != GETARG_B(i)) pc++; 495 if (equalobj(L, ra, RKC(i)) != GETARG_B(i)) pc++;
468 else dojump(pc, GETARG_sBx(*pc) + 1); 496 else dojump(pc, GETARG_sBx(*pc) + 1);
469 break; 497 break;
470 } 498 }