aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lvm.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/lvm.c b/lvm.c
index d9fd32a6..aef1b376 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.111 2010/04/13 20:48:12 roberto Exp roberto $ 2** $Id: lvm.c,v 2.112 2010/04/15 19:43:43 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*/
@@ -167,7 +167,7 @@ static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
167} 167}
168 168
169 169
170static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, 170static const TValue *get_equalTM (lua_State *L, Table *mt1, Table *mt2,
171 TMS event) { 171 TMS event) {
172 const TValue *tm1 = fasttm(L, mt1, event); 172 const TValue *tm1 = fasttm(L, mt1, event);
173 const TValue *tm2; 173 const TValue *tm2;
@@ -183,14 +183,10 @@ static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,
183 183
184static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, 184static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,
185 TMS event) { 185 TMS event) {
186 const TValue *tm1 = luaT_gettmbyobj(L, p1, event); 186 if (!call_binTM(L, p1, p2, L->top, event))
187 const TValue *tm2; 187 return -1; /* no metamethod */
188 if (ttisnil(tm1)) return -1; /* no metamethod? */ 188 else
189 tm2 = luaT_gettmbyobj(L, p2, event); 189 return !l_isfalse(L->top);
190 if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */
191 return -1;
192 callTM(L, tm1, p1, p2, L->top, 1);
193 return !l_isfalse(L->top);
194} 190}
195 191
196 192
@@ -218,11 +214,9 @@ static int l_strcmp (const TString *ls, const TString *rs) {
218 214
219int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { 215int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
220 int res; 216 int res;
221 if (ttypenv(l) != ttypenv(r)) 217 if (ttisnumber(l) && ttisnumber(r))
222 return luaG_ordererror(L, l, r);
223 else if (ttisnumber(l))
224 return luai_numlt(L, nvalue(l), nvalue(r)); 218 return luai_numlt(L, nvalue(l), nvalue(r));
225 else if (ttisstring(l)) 219 else if (ttisstring(l) && ttisstring(r))
226 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; 220 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;
227 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) 221 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)
228 return res; 222 return res;
@@ -232,11 +226,9 @@ int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
232 226
233int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { 227int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {
234 int res; 228 int res;
235 if (ttypenv(l) != ttypenv(r)) 229 if (ttisnumber(l) && ttisnumber(r))
236 return luaG_ordererror(L, l, r);
237 else if (ttisnumber(l))
238 return luai_numle(L, nvalue(l), nvalue(r)); 230 return luai_numle(L, nvalue(l), nvalue(r));
239 else if (ttisstring(l)) 231 else if (ttisstring(l) && ttisstring(r))
240 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; 232 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;
241 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ 233 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */
242 return res; 234 return res;
@@ -258,12 +250,12 @@ int luaV_equalval_ (lua_State *L, const TValue *t1, const TValue *t2) {
258 case LUA_TSTRING: return eqstr(rawtsvalue(t1), rawtsvalue(t2)); 250 case LUA_TSTRING: return eqstr(rawtsvalue(t1), rawtsvalue(t2));
259 case LUA_TUSERDATA: { 251 case LUA_TUSERDATA: {
260 if (uvalue(t1) == uvalue(t2)) return 1; 252 if (uvalue(t1) == uvalue(t2)) return 1;
261 tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ); 253 tm = get_equalTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ);
262 break; /* will try TM */ 254 break; /* will try TM */
263 } 255 }
264 case LUA_TTABLE: { 256 case LUA_TTABLE: {
265 if (hvalue(t1) == hvalue(t2)) return 1; 257 if (hvalue(t1) == hvalue(t2)) return 1;
266 tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); 258 tm = get_equalTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ);
267 break; /* will try TM */ 259 break; /* will try TM */
268 } 260 }
269 default: return gcvalue(t1) == gcvalue(t2); 261 default: return gcvalue(t1) == gcvalue(t2);