Improve __concat

This commit is contained in:
James Roseborough
2010-08-23 15:26:21 +00:00
parent 00bf5ff4d8
commit ee62eefc38
5 changed files with 43 additions and 28 deletions

View File

@@ -63,8 +63,7 @@ public class LuaNumber extends LuaValue {
} }
public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); } public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); }
public Buffer concat(Buffer rhs) { return rhs.prepend(this.strvalue()); } public Buffer concat(Buffer rhs) { return concat(rhs.value()).buffer(); }
public LuaValue concatTo(LuaValue lhs) { return lhs.concaterror(); }
public LuaValue concatTo(LuaNumber lhs) { return strvalue().concatTo(lhs.strvalue()); } public LuaValue concatTo(LuaNumber lhs) { return strvalue().concatTo(lhs.strvalue()); }
public LuaValue concatTo(LuaString lhs) { return strvalue().concatTo(lhs); } public LuaValue concatTo(LuaString lhs) { return strvalue().concatTo(lhs); }

View File

@@ -157,7 +157,6 @@ public class LuaString extends LuaValue {
// concatenation // concatenation
public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); } public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); }
public Buffer concat(Buffer rhs) { return rhs.prepend(this); } public Buffer concat(Buffer rhs) { return rhs.prepend(this); }
public LuaValue concatTo(LuaValue lhs) { return lhs.concaterror(); }
public LuaValue concatTo(LuaNumber lhs) { return concatTo(lhs.strvalue()); } public LuaValue concatTo(LuaNumber lhs) { return concatTo(lhs.strvalue()); }
public LuaValue concatTo(LuaString lhs) { public LuaValue concatTo(LuaString lhs) {
byte[] b = new byte[lhs.m_length+this.m_length]; byte[] b = new byte[lhs.m_length+this.m_length];

View File

@@ -347,15 +347,14 @@ public class LuaValue extends Varargs {
// concatenation // concatenation
public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); } public LuaValue concat(LuaValue rhs) { return rhs.concatTo(this); }
public LuaValue concatTo(LuaValue lhs) { return lhs.concatmt(this); } public LuaValue concatTo(LuaValue lhs) { return lhs.concatmt(this); }
public LuaValue concatTo(LuaNumber lhs) { return concaterror(); } public LuaValue concatTo(LuaNumber lhs) { return lhs.concatmt(this); }
public LuaValue concatTo(LuaString lhs) { return concaterror(); } public LuaValue concatTo(LuaString lhs) { return lhs.concatmt(this); }
public Buffer buffer() { return new Buffer(this); } public Buffer buffer() { return new Buffer(this); }
public Buffer concat(Buffer rhs) { return rhs.setvalue(concat(rhs.value())); } public Buffer concat(Buffer rhs) { return rhs.setvalue(concat(rhs.value())); }
public LuaValue concatmt(LuaValue rhs) { public LuaValue concatmt(LuaValue rhs) {
LuaValue h=metatag(CONCAT); LuaValue h=metatag(CONCAT);
LuaValue v=this; if ( h.isnil() && (h=rhs.metatag(CONCAT)).isnil())
if ( h.isnil() && (h=(v=rhs).metatag(CONCAT)).isnil()) return (isstring()? rhs: this).concaterror();
return v.concaterror();
return h.call(this,rhs); return h.call(this,rhs);
} }

View File

@@ -37,10 +37,26 @@ public class CompatibiltyTest extends TestSuite {
private static final String dir = "test/lua"; private static final String dir = "test/lua";
abstract protected static class CompatibiltyTestSuite extends ScriptDrivenTest { abstract protected static class CompatibiltyTestSuite extends ScriptDrivenTest {
LuaValue savedStringMetatable;
protected CompatibiltyTestSuite(PlatformType platform) { protected CompatibiltyTestSuite(PlatformType platform) {
super(platform,dir); super(platform,dir);
} }
protected void setUp() throws Exception {
savedStringMetatable = LuaString.s_metatable;
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
LuaNil.s_metatable = null;
LuaBoolean.s_metatable = null;
LuaNumber.s_metatable = null;
LuaFunction.s_metatable = null;
LuaThread.s_metatable = null;
LuaString.s_metatable = savedStringMetatable;
}
public void testBaseLib() { runTest("baselib"); } public void testBaseLib() { runTest("baselib"); }
public void testCoroutineLib() { runTest("coroutinelib"); } public void testCoroutineLib() { runTest("coroutinelib"); }
public void testDebugLib() { runTest("debuglib"); } public void testDebugLib() { runTest("debuglib"); }

View File

@@ -665,16 +665,18 @@ public class UnaryBinaryOperatorsTest extends TestCase {
} } ); } } );
assertEquals( tru, tru.concat(tbl) ); assertEquals( tru, tru.concat(tbl) );
assertEquals( tbl, tbl.concat(tru) ); assertEquals( tbl, tbl.concat(tru) );
assertEquals( tru, tru.concat(new Buffer(tbl)).value() ); assertEquals( tru, tru.concat(tbl) );
assertEquals( tbl, tbl.concat(new Buffer(tru)).value() ); assertEquals( tbl, tbl.concat(tru) );
assertEquals( fal, fal.concat(tbl.concat(new Buffer(tru))).value() ); assertEquals( tru, tru.concat(tbl.buffer()).value() );
assertEquals( uda, uda.concat(tru.concat(new Buffer(tbl))).value() ); assertEquals( tbl, tbl.concat(tru.buffer()).value() );
try { tru.concat(def); fail("did not throw error"); } catch ( LuaError le ) { }; assertEquals( fal, fal.concat(tbl.concat(tru.buffer())).value() );
try { def.concat(tru); fail("did not throw error"); } catch ( LuaError le ) { }; assertEquals( uda, uda.concat(tru.concat(tbl.buffer())).value() );
try { tru.concat(new Buffer(def)).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { tbl.concat(def); fail("did not throw error"); } catch ( LuaError le ) { };
try { def.concat(new Buffer(tru)).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { def.concat(tbl); fail("did not throw error"); } catch ( LuaError le ) { };
try { fal.concat(def.concat(new Buffer(tru))).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { tbl.concat(def.buffer()).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { ghi.concat(tru.concat(new Buffer(def))).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { def.concat(tbl.buffer()).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { uda.concat(def.concat(tbl.buffer())).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { ghi.concat(tbl.concat(def.buffer())).value(); fail("did not throw error"); } catch ( LuaError le ) { };
// always use right argument // always use right argument
LuaBoolean.s_metatable = LuaValue.tableOf( new LuaValue[] { LuaBoolean.s_metatable = LuaValue.tableOf( new LuaValue[] {
@@ -685,16 +687,16 @@ public class UnaryBinaryOperatorsTest extends TestCase {
} } ); } } );
assertEquals( tbl, tru.concat(tbl) ); assertEquals( tbl, tru.concat(tbl) );
assertEquals( tru, tbl.concat(tru) ); assertEquals( tru, tbl.concat(tru) );
assertEquals( tbl, tru.concat(new Buffer(tbl)).value() ); assertEquals( tbl, tru.concat(tbl.buffer()).value() );
assertEquals( tru, tbl.concat(new Buffer(tru)).value() ); assertEquals( tru, tbl.concat(tru.buffer()).value() );
assertEquals( tru, uda.concat(tbl.concat(new Buffer(tru))).value() ); assertEquals( tru, uda.concat(tbl.concat(tru.buffer())).value() );
assertEquals( tbl, fal.concat(tru.concat(new Buffer(tbl))).value() ); assertEquals( tbl, fal.concat(tru.concat(tbl.buffer())).value() );
try { tru.concat(def); fail("did not throw error"); } catch ( LuaError le ) { }; try { tbl.concat(def); fail("did not throw error"); } catch ( LuaError le ) { };
try { def.concat(tru); fail("did not throw error"); } catch ( LuaError le ) { }; try { def.concat(tbl); fail("did not throw error"); } catch ( LuaError le ) { };
try { tru.concat(new Buffer(def)).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { tbl.concat(def.buffer()).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { def.concat(new Buffer(tru)).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { def.concat(tbl.buffer()).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { uda.concat(def.concat(new Buffer(tru))).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { uda.concat(def.concat(tbl.buffer())).value(); fail("did not throw error"); } catch ( LuaError le ) { };
try { fal.concat(tru.concat(new Buffer(def))).value(); fail("did not throw error"); } catch ( LuaError le ) { }; try { uda.concat(tbl.concat(def.buffer())).value(); fail("did not throw error"); } catch ( LuaError le ) { };
} finally { } finally {
LuaBoolean.s_metatable = null; LuaBoolean.s_metatable = null;