diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-06-13 10:39:55 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-06-13 10:39:55 -0300 |
commit | 864c96f36ce8410b03652b1cb9800e4b3c76bcf7 (patch) | |
tree | d5061c0babf25cf222953e5195673534f8287f34 /lvm.c | |
parent | 0052930ffe8c86f0df7ab99dd1b6668f9e10c781 (diff) | |
download | lua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.tar.gz lua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.tar.bz2 lua-864c96f36ce8410b03652b1cb9800e4b3c76bcf7.zip |
new fallback for equality `__eq'
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 32 |
1 files changed, 30 insertions, 2 deletions
@@ -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 | ||
253 | int 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 | |||
253 | void luaV_concat (lua_State *L, int total, int last) { | 281 | void 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 | } |