Improve __concat metatag
This commit is contained in:
@@ -104,6 +104,18 @@ public final class Buffer {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Buffer concatTo(LuaValue lhs) {
|
||||||
|
return setvalue(lhs.concat(value()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Buffer concatTo(LuaString lhs) {
|
||||||
|
return value!=null? setvalue(lhs.concat(value)): prepend(lhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Buffer concatTo(LuaNumber lhs) {
|
||||||
|
return value!=null? setvalue(lhs.concat(value)): prepend(lhs.strvalue());
|
||||||
|
}
|
||||||
|
|
||||||
public Buffer prepend(LuaString s) {
|
public Buffer prepend(LuaString s) {
|
||||||
int n = s.m_length;
|
int n = s.m_length;
|
||||||
makeroom( n, 0 );
|
makeroom( n, 0 );
|
||||||
|
|||||||
@@ -63,7 +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 concat(rhs.value()).buffer(); }
|
public Buffer concat(Buffer rhs) { return rhs.concatTo(this); }
|
||||||
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); }
|
||||||
|
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ 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.concatTo(this); }
|
||||||
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];
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ public class LuaValue extends Varargs {
|
|||||||
public LuaValue concatTo(LuaNumber lhs) { return lhs.concatmt(this); }
|
public LuaValue concatTo(LuaNumber lhs) { return lhs.concatmt(this); }
|
||||||
public LuaValue concatTo(LuaString lhs) { return lhs.concatmt(this); }
|
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.concatTo(this); }
|
||||||
public LuaValue concatmt(LuaValue rhs) {
|
public LuaValue concatmt(LuaValue rhs) {
|
||||||
LuaValue h=metatag(CONCAT);
|
LuaValue h=metatag(CONCAT);
|
||||||
if ( h.isnil() && (h=rhs.metatag(CONCAT)).isnil())
|
if ( h.isnil() && (h=rhs.metatag(CONCAT)).isnil())
|
||||||
|
|||||||
@@ -583,14 +583,19 @@ public class JavaCodeGen {
|
|||||||
case Lua.OP_NEQ: out(evalLuaValue(exp.lhs)+".neq("+evalLuaValue(exp.rhs)+")"); return;
|
case Lua.OP_NEQ: out(evalLuaValue(exp.lhs)+".neq("+evalLuaValue(exp.rhs)+")"); return;
|
||||||
case Lua.OP_CONCAT:
|
case Lua.OP_CONCAT:
|
||||||
if ( isConcatExp(exp.rhs) ) {
|
if ( isConcatExp(exp.rhs) ) {
|
||||||
out( "new Buffer().append("+evalLuaValue(exp.lhs)+")" );
|
out( evalLuaValue(exp.lhs) );
|
||||||
Exp e = exp.rhs;
|
Exp e = exp.rhs;
|
||||||
for ( ; isConcatExp(e); e=((BinopExp)e).rhs )
|
String close = "";
|
||||||
out( ".append("+evalLuaValue(((BinopExp)e).lhs)+")" );
|
for ( ; isConcatExp(e); e=((BinopExp)e).rhs ) {
|
||||||
out( ".append("+evalLuaValue(e)+")" );
|
out( ".concat("+evalLuaValue(((BinopExp)e).lhs) );
|
||||||
out( ".tostring()" );
|
close += ')';
|
||||||
} else
|
}
|
||||||
|
out( ".concat("+evalLuaValue(e)+".buffer())" );
|
||||||
|
out( close );
|
||||||
|
out( ".value()" );
|
||||||
|
} else {
|
||||||
out(evalLuaValue(exp.lhs)+".concat("+evalLuaValue(exp.rhs)+")");
|
out(evalLuaValue(exp.lhs)+".concat("+evalLuaValue(exp.rhs)+")");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
default: throw new IllegalStateException("unknown bin op:"+exp.op);
|
default: throw new IllegalStateException("unknown bin op:"+exp.op);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ public class JavaBuilder {
|
|||||||
private static final Type[] ARG_TYPES_STRING = { Type.STRING };
|
private static final Type[] ARG_TYPES_STRING = { Type.STRING };
|
||||||
private static final Type[] ARG_TYPES_CHARARRAY = { TYPE_CHARARRAY };
|
private static final Type[] ARG_TYPES_CHARARRAY = { TYPE_CHARARRAY };
|
||||||
private static final Type[] ARG_TYPES_VARARGS_INT = { TYPE_VARARGS, Type.INT };
|
private static final Type[] ARG_TYPES_VARARGS_INT = { TYPE_VARARGS, Type.INT };
|
||||||
private static final Type[] ARG_TYPES_LUASTRING = { TYPE_LUASTRING };
|
|
||||||
private static final Type[] ARG_TYPES_INT_LUAVALUE = { Type.INT, TYPE_LUAVALUE };
|
private static final Type[] ARG_TYPES_INT_LUAVALUE = { Type.INT, TYPE_LUAVALUE };
|
||||||
private static final Type[] ARG_TYPES_INT_VARARGS = { Type.INT, TYPE_VARARGS };
|
private static final Type[] ARG_TYPES_INT_VARARGS = { Type.INT, TYPE_VARARGS };
|
||||||
private static final Type[] ARG_TYPES_LUAVALUE_VARARGS = { TYPE_LUAVALUE, TYPE_VARARGS };
|
private static final Type[] ARG_TYPES_LUAVALUE_VARARGS = { TYPE_LUAVALUE, TYPE_VARARGS };
|
||||||
@@ -121,6 +120,7 @@ public class JavaBuilder {
|
|||||||
private static final Type[] ARG_TYPES_LUAVALUE_LUAVALUE = { TYPE_LUAVALUE, TYPE_LUAVALUE };
|
private static final Type[] ARG_TYPES_LUAVALUE_LUAVALUE = { TYPE_LUAVALUE, TYPE_LUAVALUE };
|
||||||
private static final Type[] ARG_TYPES_INT_INT = { Type.INT, Type.INT };
|
private static final Type[] ARG_TYPES_INT_INT = { Type.INT, Type.INT };
|
||||||
private static final Type[] ARG_TYPES_LUAVALUE = { TYPE_LUAVALUE };
|
private static final Type[] ARG_TYPES_LUAVALUE = { TYPE_LUAVALUE };
|
||||||
|
private static final Type[] ARG_TYPES_BUFFER = { TYPE_BUFFER };
|
||||||
|
|
||||||
// names, arg types for main prototype classes
|
// names, arg types for main prototype classes
|
||||||
private static final String[] SUPER_NAME_N = { STR_FUNC0, STR_FUNC1, STR_FUNC2, STR_FUNC3, STR_FUNCV, };
|
private static final String[] SUPER_NAME_N = { STR_FUNC0, STR_FUNC1, STR_FUNC2, STR_FUNC3, STR_FUNCV, };
|
||||||
@@ -773,14 +773,19 @@ public class JavaBuilder {
|
|||||||
append(factory.createInvoke(STR_LUAVALUE, "rawsetlist", Type.VOID, ARG_TYPES_INT_VARARGS, Constants.INVOKEVIRTUAL));
|
append(factory.createInvoke(STR_LUAVALUE, "rawsetlist", Type.VOID, ARG_TYPES_INT_VARARGS, Constants.INVOKEVIRTUAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void newBuffer() {
|
public void concatvalue() {
|
||||||
append(factory.createNew(TYPE_BUFFER));
|
append(factory.createInvoke(STR_LUAVALUE, "concat", TYPE_LUAVALUE, ARG_TYPES_LUAVALUE, Constants.INVOKEVIRTUAL));
|
||||||
append(InstructionConstants.DUP);
|
|
||||||
append(factory.createInvoke(STR_BUFFER, "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void appendBuffer() {
|
public void concatbuffer() {
|
||||||
append(factory.createInvoke(STR_LUAVALUE, "checkstring", TYPE_LUASTRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
|
append(factory.createInvoke(STR_LUAVALUE, "concat", TYPE_BUFFER, ARG_TYPES_BUFFER, Constants.INVOKEVIRTUAL));
|
||||||
append(factory.createInvoke(STR_BUFFER, "append", TYPE_BUFFER, ARG_TYPES_LUASTRING, Constants.INVOKEVIRTUAL));
|
}
|
||||||
|
|
||||||
|
public void tobuffer() {
|
||||||
|
append(factory.createInvoke(STR_LUAVALUE, "buffer", TYPE_BUFFER, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tovalue() {
|
||||||
|
append(factory.createInvoke(STR_BUFFER, "value", TYPE_LUAVALUE, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
package org.luaj.vm2.luajc;
|
package org.luaj.vm2.luajc;
|
||||||
|
|
||||||
|
import org.luaj.vm2.Buffer;
|
||||||
import org.luaj.vm2.Lua;
|
import org.luaj.vm2.Lua;
|
||||||
import org.luaj.vm2.Prototype;
|
import org.luaj.vm2.Prototype;
|
||||||
|
|
||||||
@@ -180,12 +181,16 @@ public class JavaGen {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Lua.OP_CONCAT: /* A B C R(A):= R(B).. ... ..R(C) */
|
case Lua.OP_CONCAT: /* A B C R(A):= R(B).. ... ..R(C) */
|
||||||
builder.newBuffer();
|
for ( int k=b; k<=c; k++ )
|
||||||
while ( b<=c ) {
|
builder.loadLocal(pc, k);
|
||||||
builder.loadLocal(pc, b++);
|
if ( c > b+1 ) {
|
||||||
builder.appendBuffer();
|
builder.tobuffer();
|
||||||
|
for ( int k=c; --k>=b; )
|
||||||
|
builder.concatbuffer();
|
||||||
|
builder.tovalue();
|
||||||
|
} else {
|
||||||
|
builder.concatvalue();
|
||||||
}
|
}
|
||||||
builder.tostring();
|
|
||||||
builder.storeLocal(pc, a);
|
builder.storeLocal(pc, a);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user