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

@@ -235,6 +235,10 @@ public class UnaryBinaryOperatorsTest extends TestCase {
LuaValue tbl = new LuaTable();
LuaValue tbl2 = new LuaTable();
LuaValue tbl3 = new LuaTable();
LuaValue uda = new LuaUserdata(new Object());
LuaValue udb = new LuaUserdata(uda.touserdata());
LuaValue uda2 = new LuaUserdata(new Object());
LuaValue uda3 = new LuaUserdata(uda.touserdata());
LuaValue nilb = LuaValue.valueOf( LuaValue.NIL.toboolean() );
LuaValue oneb = LuaValue.valueOf( LuaValue.ONE.toboolean() );
assertEquals( LuaValue.FALSE, nilb );
@@ -247,26 +251,30 @@ public class UnaryBinaryOperatorsTest extends TestCase {
LuaString.s_metatable = LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } );
tbl.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
tbl2.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
uda.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
udb.setmetatable(uda.getmetatable());
uda2.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
// diff metatag function
tbl3.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
uda3.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
// same type, same value, does not invoke metatag op
// primitive types or same valu do not invoke metatag as per C implementation
assertEquals( tru, tru.eq(tru) );
assertEquals( tru, tbl.eq(tbl) );
assertEquals( tru, one.eq(one) );
// same type, different value, same metatag op. comparabile via metatag op
assertEquals( nilb, tbl.eq(tbl2) );
assertEquals( nilb, tbl2.eq(tbl) );
assertEquals( nilb, tru.eq(fal) );
assertEquals( nilb, fal.eq(tru) );
assertEquals( nilb, zer.eq(one) );
assertEquals( nilb, one.eq(zer) );
assertEquals( nilb, pi.eq(ee) );
assertEquals( nilb, ee.eq(pi) );
assertEquals( nilb, pi.eq(one) );
assertEquals( nilb, one.eq(pi) );
assertEquals( nilb, abc.eq(def) );
assertEquals( nilb, def.eq(abc) );
assertEquals( tru, abc.eq(abc) );
assertEquals( tru, tbl.eq(tbl) );
assertEquals( tru, uda.eq(uda) );
assertEquals( tru, uda.eq(udb) );
assertEquals( fal, tru.eq(fal) );
assertEquals( fal, fal.eq(tru) );
assertEquals( fal, zer.eq(one) );
assertEquals( fal, one.eq(zer) );
assertEquals( fal, pi.eq(ee) );
assertEquals( fal, ee.eq(pi) );
assertEquals( fal, pi.eq(one) );
assertEquals( fal, one.eq(pi) );
assertEquals( fal, abc.eq(def) );
assertEquals( fal, def.eq(abc) );
// different types. not comparable
assertEquals( fal, fal.eq(tbl) );
assertEquals( fal, tbl.eq(fal) );
@@ -276,9 +284,20 @@ public class UnaryBinaryOperatorsTest extends TestCase {
assertEquals( fal, one.eq(fal) );
assertEquals( fal, abc.eq(one) );
assertEquals( fal, one.eq(abc) );
assertEquals( fal, tbl.eq(uda) );
assertEquals( fal, uda.eq(tbl) );
// same type, same value, does not invoke metatag op
assertEquals( tru, tbl.eq(tbl) );
// same type, different value, same metatag op. comparabile via metatag op
assertEquals( nilb, tbl.eq(tbl2) );
assertEquals( nilb, tbl2.eq(tbl) );
assertEquals( nilb, uda.eq(uda2) );
assertEquals( nilb, uda2.eq(uda) );
// same type, different metatag ops. not comparable
assertEquals( fal, tbl.eq(tbl3) );
assertEquals( fal, tbl3.eq(tbl) );
assertEquals( fal, uda.eq(uda3) );
assertEquals( fal, uda3.eq(uda) );
// always use right argument
LuaBoolean.s_metatable = LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } );
@@ -286,26 +305,30 @@ public class UnaryBinaryOperatorsTest extends TestCase {
LuaString.s_metatable = LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } );
tbl.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
tbl2.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
uda.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
udb.setmetatable(uda.getmetatable());
uda2.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_ONE, } ));
// diff metatag function
tbl3.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
uda3.setmetatable(LuaValue.tableOf( new LuaValue[] { LuaValue.EQ, RETURN_NIL, } ));
// same type, same value, does not invoke metatag op
// primitive types or same value do not invoke metatag as per C implementation
assertEquals( tru, tru.eq(tru) );
assertEquals( tru, tbl.eq(tbl) );
assertEquals( tru, one.eq(one) );
// same type, different value, same metatag op. comparabile via metatag op
assertEquals( oneb, tbl.eq(tbl2) );
assertEquals( oneb, tbl2.eq(tbl) );
assertEquals( oneb, tru.eq(fal) );
assertEquals( oneb, fal.eq(tru) );
assertEquals( oneb, zer.eq(one) );
assertEquals( oneb, one.eq(zer) );
assertEquals( oneb, pi.eq(ee) );
assertEquals( oneb, ee.eq(pi) );
assertEquals( oneb, pi.eq(one) );
assertEquals( oneb, one.eq(pi) );
assertEquals( oneb, abc.eq(def) );
assertEquals( oneb, def.eq(abc) );
assertEquals( tru, abc.eq(abc) );
assertEquals( tru, tbl.eq(tbl) );
assertEquals( tru, uda.eq(uda) );
assertEquals( tru, uda.eq(udb) );
assertEquals( fal, tru.eq(fal) );
assertEquals( fal, fal.eq(tru) );
assertEquals( fal, zer.eq(one) );
assertEquals( fal, one.eq(zer) );
assertEquals( fal, pi.eq(ee) );
assertEquals( fal, ee.eq(pi) );
assertEquals( fal, pi.eq(one) );
assertEquals( fal, one.eq(pi) );
assertEquals( fal, abc.eq(def) );
assertEquals( fal, def.eq(abc) );
// different types. not comparable
assertEquals( fal, fal.eq(tbl) );
assertEquals( fal, tbl.eq(fal) );
@@ -315,9 +338,20 @@ public class UnaryBinaryOperatorsTest extends TestCase {
assertEquals( fal, one.eq(fal) );
assertEquals( fal, abc.eq(one) );
assertEquals( fal, one.eq(abc) );
assertEquals( fal, tbl.eq(uda) );
assertEquals( fal, uda.eq(tbl) );
// same type, same value, does not invoke metatag op
assertEquals( tru, tbl.eq(tbl) );
// same type, different value, same metatag op. comparabile via metatag op
assertEquals( oneb, tbl.eq(tbl2) );
assertEquals( oneb, tbl2.eq(tbl) );
assertEquals( oneb, uda.eq(uda2) );
assertEquals( oneb, uda2.eq(uda) );
// same type, different metatag ops. not comparable
assertEquals( fal, tbl.eq(tbl3) );
assertEquals( fal, tbl3.eq(tbl) );
assertEquals( fal, uda.eq(uda3) );
assertEquals( fal, uda3.eq(uda) );
} finally {
LuaBoolean.s_metatable = null;