diff --git a/src/core/org/luaj/vm2/LuaValue.java b/src/core/org/luaj/vm2/LuaValue.java index 4bdf6808..5e64fb85 100644 --- a/src/core/org/luaj/vm2/LuaValue.java +++ b/src/core/org/luaj/vm2/LuaValue.java @@ -230,6 +230,8 @@ public class LuaValue extends Varargs { public Varargs invoke(LuaValue arg1,LuaValue arg2,Varargs varargs) { return invoke(varargsOf(arg1,arg2,varargs)); } public Varargs invoke(LuaValue[] args) { return invoke(varargsOf(args)); } public Varargs invoke(LuaValue[] args,Varargs varargs) { return invoke(varargsOf(args,varargs)); } + public Varargs invokemethod(String name) { return get(name).invoke(this); } + public Varargs invokemethod(LuaValue name) { return get(name).invoke(this); } public Varargs invokemethod(String name, Varargs args) { return get(name).invoke(varargsOf(this,args)); } public Varargs invokemethod(LuaValue name, Varargs args) { return get(name).invoke(varargsOf(this,args)); } public Varargs invokemethod(String name, LuaValue[] args) { return get(name).invoke(varargsOf(this,varargsOf(args))); } diff --git a/src/jse/org/luaj/vm2/ast/Str.java b/src/jse/org/luaj/vm2/ast/Str.java index f58cef56..38f3e5ab 100644 --- a/src/jse/org/luaj/vm2/ast/Str.java +++ b/src/jse/org/luaj/vm2/ast/Str.java @@ -43,7 +43,7 @@ public class Str { } public static LuaString longString(String image) { - int i = image.indexOf('[', image.indexOf('[')+1); + int i = image.indexOf('[', image.indexOf('[')+1)+1; String s = image.substring(i,image.length()-i); byte[] b = iso88591bytes(s); return LuaString.valueOf(b); diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java index ff35b191..40dd2b33 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java @@ -183,7 +183,7 @@ public class JavaCodeGen { switch ( n ) { case 0: outl( "return NONE;" ); break; case 1: outl( "return "+evalLuaValue(s.values.get(0))+";" ); break; - default: outl( "return "+evalVarargs(s.values)+";" ); break; + default: outl( "return "+evalListAsVarargs(s.values)+";" ); break; } } @@ -288,8 +288,8 @@ public class JavaCodeGen { return c.toString(); } - public String evalVarargs(List values) { - int n = values.size(); + public String evalListAsVarargs(List values) { + int n = values!=null? values.size(): 0; switch ( n ) { case 0: return "NONE"; case 1: return evalVarargs(values.get(0)); @@ -306,17 +306,28 @@ public class JavaCodeGen { } } + Map callerExpects = new HashMap(); + public String evalLuaValue(Exp exp) { - String s = evalVarargs(exp); - return exp.isvarargexp()? s+".arg1()": s; + Writer x = pushWriter(); + callerExpects.put(exp,1); + exp.accept(this); + return popWriter(x); } public String evalVarargs(Exp exp) { Writer x = pushWriter(); + callerExpects.put(exp,-1); exp.accept(this); return popWriter(x); } + public void visit(FuncCallStat stat) { + outi(""); + stat.funccall.accept(this); + outr(";"); + } + public void visit(BinopExp exp) { String lhs = evalLuaValue(exp.lhs) ; String rhs = evalLuaValue(exp.rhs) ; @@ -429,17 +440,21 @@ public class JavaCodeGen { } public void visit(ParensExp exp) { - exp.exp.accept(this); - out(".arg1()"); + out( evalLuaValue(exp.exp) ); } public void visit(VarargsExp exp) { - out( "arg" ); + int c = callerExpects.containsKey(exp)? callerExpects.get(exp): 0; + out( c==1? "arg.arg1()": "arg" ); } public void visit(MethodCall exp) { - int n = exp.args.exps != null? exp.args.exps.size(): 0; - exp.lhs.accept(this); + List e = exp.args.exps; + int n = e != null? e.size(): 0; + int c = callerExpects.containsKey(exp)? callerExpects.get(exp): 0; + if ( c == -1 ) + n = -1; + out( evalLuaValue(exp.lhs) ); switch ( n ) { case 0: out(".method("+evalStringConstant(exp.name)+")"); @@ -449,17 +464,24 @@ public class JavaCodeGen { exp.args.accept(this); out(")"); break; - default: - out(".invokemethod("+evalStringConstant(exp.name)+","+evalVarargs(exp.args.exps)+")"); + default: + out(".invokemethod("+evalStringConstant(exp.name) + +((e==null||e.size()==0)? "": ","+evalListAsVarargs(exp.args.exps))+")"); + if ( c == 1 ) + out(".arg1()"); break; } } public void visit(FuncCall exp) { - int n = exp.args.exps != null? exp.args.exps.size(): 0; - if ( n > 0 && exp.args.exps.get(n-1).isvarargexp() ) + List e = exp.args.exps; + int n = e != null? e.size(): 0; + if ( n > 0 && e.get(n-1).isvarargexp() ) n = -1; - exp.lhs.accept(this); + int c = callerExpects.containsKey(exp)? callerExpects.get(exp): 0; + if ( c == -1 ) + n = -1; + out( evalLuaValue(exp.lhs) ); switch ( n ) { case 0: case 1: case 2: case 3: out(".call("); @@ -467,7 +489,9 @@ public class JavaCodeGen { out(")"); break; default: - out(".invoke("+evalVarargs(exp.args.exps)+")"); + out(".invoke("+((e==null||e.size()==0)? "": evalListAsVarargs(e))+")"); + if ( c == 1 ) + out(".arg1()"); break; } } @@ -557,10 +581,6 @@ public class JavaCodeGen { } } - public void visit(FuncCallStat stat) { - outl(evalVarargs(stat.funccall)+";"); - } - public void visit(FuncDef stat) { Writer x = pushWriter(); stat.body.accept(this); @@ -685,29 +705,40 @@ public class JavaCodeGen { } public void visit(TableConstructor table) { - if ( table.fields == null ) { - out("LuaValue.tableOf()"); - } else { - int n = table.fields.size(); - out("LuaValue.tableOf(new LuaValue[]{"); - for ( int i=0; i keyed = new ArrayList(); + List list = new ArrayList(); + for ( int i=0; i