Improve __eq metatag processing.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user