Improve __eq metatag processing.

This commit is contained in:
James Roseborough
2010-08-25 17:56:51 +00:00
parent 328c986ca9
commit d32ef20360
13 changed files with 189 additions and 128 deletions

View File

@@ -70,9 +70,4 @@ public class LuaBoolean extends LuaValue {
public LuaValue getmetatable() {
return s_metatable;
}
// equality
public boolean eq_b( LuaValue val ) {
return this == val || (s_metatable!=null && val.isboolean() && LuaValue.eqmtcall(this, val, s_metatable));
}
}

View File

@@ -75,7 +75,8 @@ public class LuaDouble extends LuaNumber {
public boolean equals(Object o) { return o instanceof LuaDouble? ((LuaDouble)o).v == v: false; }
// equality w/ metatable processing
public boolean eq_b( LuaValue val ) { return val.raweq(v) || (s_metatable!=null && val.type()==TNUMBER && LuaValue.eqmtcall(val, this, s_metatable)); }
public LuaValue eq( LuaValue val ) { return val.raweq(v)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return val.raweq(v); }
// equality w/o metatable processing
public boolean raweq( LuaValue val ) { return val.raweq(v); }

View File

@@ -67,9 +67,4 @@ public class LuaFunction extends LuaValue {
public void setfenv(LuaValue env) {
this.env = env!=null? env: NIL;
}
// equality
public boolean eq_b( LuaValue val ) {
return this == val || (s_metatable!=null && val.isfunction() && LuaValue.eqmtcall(this, val, s_metatable));
}
}

View File

@@ -105,7 +105,8 @@ public class LuaInteger extends LuaNumber {
public boolean equals(Object o) { return o instanceof LuaInteger? ((LuaInteger)o).v == v: false; }
// equality w/ metatable processing
public boolean eq_b( LuaValue val ) { return val.raweq(v) || (s_metatable!=null && val.type()==TNUMBER && LuaValue.eqmtcall(val, this, s_metatable)); }
public LuaValue eq( LuaValue val ) { return val.raweq(v)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return val.raweq(v); }
// equality w/o metatable processing
public boolean raweq( LuaValue val ) { return val.raweq(v); }

View File

@@ -83,8 +83,4 @@ public class LuaNil extends LuaValue {
public Object optuserdata(Object defval) { return defval; }
public Object optuserdata(Class c, Object defval) { return defval; }
public LuaValue optvalue(LuaValue defval) { return defval; }
// equality
public LuaValue eq( LuaValue val ) { return this == val? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return this == val; }
}

View File

@@ -298,17 +298,8 @@ public class LuaString extends LuaValue {
}
// equality w/ metatable processing
public boolean eq_b( LuaValue val ) {
if ( val.raweq(this) ) return true;
if ( s_metatable == null || val.type()!=TSTRING || s_inmeta) return false;
s_inmeta = true;
try {
return LuaValue.eqmtcall(val, this, s_metatable);
} finally {
s_inmeta = false;
}
}
private static boolean s_inmeta = false;
public LuaValue eq( LuaValue val ) { return val.raweq(this)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return val.raweq(this); }
// equality w/o metatable processing
public boolean raweq( LuaValue val ) {

View File

@@ -577,6 +577,7 @@ public class LuaTable extends LuaValue {
}
// equality w/ metatable processing
public LuaValue eq( LuaValue val ) { return eq_b(val)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) {
if ( this == val ) return true;
if ( m_metatable == null || !val.istable() ) return false;

View File

@@ -242,9 +242,4 @@ public class LuaThread extends LuaValue implements Runnable {
}
}
// equality
public boolean eq_b( LuaValue val ) {
return this == val || (s_metatable!=null && val.isthread() && LuaValue.eqmtcall(this, val, s_metatable));
}
}

View File

@@ -105,8 +105,8 @@ public class LuaUserdata extends LuaValue {
}
// equality w/ metatable processing
public LuaValue eq( LuaValue val ) { return val.eq_b(this)? TRUE: FALSE; }
public boolean eq_b( LuaUserdata val ) {
public LuaValue eq( LuaValue val ) { return eq_b(val)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) {
if ( val.raweq(this) ) return true;
if ( m_metatable == null || !val.isuserdata() ) return false;
LuaValue valmt = val.getmetatable();

View File

@@ -256,9 +256,9 @@ public class LuaValue extends Varargs {
public boolean equals(Object obj) { return this == obj; }
// arithmetic equality with metatag processing
public LuaValue eq( LuaValue val ) { return eq_b(val)? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return false; }
public LuaValue neq( LuaValue val ) { return eq_b(val)? FALSE: TRUE; }
public LuaValue eq( LuaValue val ) { return this == val? TRUE: FALSE; }
public boolean eq_b( LuaValue val ) { return this == val; }
public LuaValue neq( LuaValue val ) { return eq_b(val)? FALSE: TRUE; }
public boolean neq_b( LuaValue val ) { return !eq_b(val); }
// equality without metatag processing
@@ -273,10 +273,6 @@ public class LuaValue extends Varargs {
LuaValue h = lhsmt.rawget(EQ);
return h.isnil() || h!=rhsmt.rawget(EQ)? false: h.call(lhs,rhs).toboolean();
}
public static final boolean eqmtcall(LuaValue lhs, LuaValue rhs, LuaValue sharedmt) {
LuaValue h = sharedmt.rawget(EQ);
return h.isnil()? false: h.call(lhs,rhs).toboolean();
}
// arithmetic operators
public LuaValue add( LuaValue rhs ) { return arithmt(ADD,rhs); }

View File

@@ -303,9 +303,11 @@ public class BaseLib extends OneArgFunction implements ResourceFinder {
case 17: { // "tostring", // (e) -> value
LuaValue arg = args.checkvalue(1);
LuaValue h = arg.metatag(TOSTRING);
if ( ! h.isnil() ) return h.call(arg);
if ( ! h.isnil() )
return h.call(arg);
LuaValue v = arg.tostring();
if ( ! v.isnil() ) return v;
if ( ! v.isnil() )
return v;
return valueOf(arg.tojstring());
}
case 18: { // "tonumber", // (e [,base]) -> value