diff --git a/src/core/org/luaj/vm2/LuaTable.java b/src/core/org/luaj/vm2/LuaTable.java index 1dd43e12..46f65056 100644 --- a/src/core/org/luaj/vm2/LuaTable.java +++ b/src/core/org/luaj/vm2/LuaTable.java @@ -49,10 +49,10 @@ public class LuaTable extends LuaValue { int nl = (lastarg!=null? lastarg.narg(): 0); presize(nu+nl, nn-(nn>>1)); for ( int i=0; i=0 && n<=1 && m<=3 && ! body.parlist.isvararg ) { switch ( m ) { case 0: - outr("new ZeroArgFunction() {"); + outr("new ZeroArgFunction(env) {"); addindent(); outb("public LuaValue call() {"); break; case 1: - outr("new OneArgFunction() {"); + outr("new OneArgFunction(env) {"); addindent(); outb("public LuaValue call(" +declareArg(body.parlist.names.get(0))+") {"); assignArg(body.parlist.names.get(0)); break; case 2: - outr("new TwoArgFunction() {"); + outr("new TwoArgFunction(env) {"); addindent(); outb("public LuaValue call(" +declareArg(body.parlist.names.get(0))+"," @@ -535,7 +536,7 @@ public class JavaCodeGen { assignArg(body.parlist.names.get(1)); break; case 3: - outr("new ThreeArgFunction() {"); + outr("new ThreeArgFunction(env) {"); addindent(); outb("public LuaValue call(" +declareArg(body.parlist.names.get(0))+"," @@ -547,20 +548,24 @@ public class JavaCodeGen { break; } } else { - outr("new VarArgFunction() {"); + outr("new VarArgFunction(env) {"); addindent(); - outb("public Varargs invoke(Varargs arg) {"); + outb("public Varargs invoke(Varargs $arg) {"); + if ( body.parlist.isvararg ) { + NamedVariable arg = body.scope.find("arg"); + javascope.setJavaName(arg,"arg"); + String value = "LuaValue.tableOf($arg,"+(m+1)+")"; + outl( arg.isupvalue? "final LuaValue[] arg = {"+value+"};": "LuaValue arg = "+value+";" ); + } for ( int i=0; i0? "arg.arg("+(i+1)+")": "arg.arg1()"; + String value = i>0? "$arg.arg("+(i+1)+")": "$arg.arg1()"; if ( name.variable.isupvalue ) outl( "final LuaValue[] "+argname+" = {"+value+"};" ); else outl( "LuaValue "+argname+" = "+value+";" ); } - if ( body.parlist.isvararg && m > 0 ) - outl( "arg = arg.subargs("+(m+1)+");" ); } writeBodyBlock(body.block); oute("}"); diff --git a/src/jse/org/luaj/vm2/lua2java/JavaScope.java b/src/jse/org/luaj/vm2/lua2java/JavaScope.java index 0b89883e..1460b43d 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaScope.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaScope.java @@ -43,7 +43,7 @@ public class JavaScope extends NameScope { private static final String[] specials = { // keywords used by our code generator - "name", "opcode", "env", "arg", + "name", "opcode", "env", // "arg", // java keywords "abstract", "continue", "for", "new", "switch", @@ -112,6 +112,11 @@ public class JavaScope extends NameScope { } } + public void setJavaName(NamedVariable astele, String javaname) { + javanames.add(javaname); + astele2javaname.put(astele,javaname); + } + private boolean isJavanameInScope(String javaname) { for ( JavaScope s = this; s != null; s = (JavaScope) s.outerScope ) if ( s.javanames.contains(javaname) ) @@ -168,5 +173,6 @@ public class JavaScope extends NameScope { } super.visit(exp); } - } + } + }