diff --git a/build-coverage.xml b/build-coverage.xml
index a1c28f2d..8a491f8c 100644
--- a/build-coverage.xml
+++ b/build-coverage.xml
@@ -68,6 +68,9 @@
+
+
+
@@ -101,8 +104,12 @@
-
-
+
+
+
+
+
+
diff --git a/src/jse/lua2java.java b/src/jse/lua2java.java
index f460412f..270f7d67 100644
--- a/src/jse/lua2java.java
+++ b/src/jse/lua2java.java
@@ -41,7 +41,7 @@ public class lua2java {
private static final String version = Lua._VERSION + "Copyright (C) 2010 luaj.org";
private static final String usage =
- "usage: java -cp luaj-jse.jar lua2java [options] [filenames].\n" +
+ "usage: java -cp luaj-jse.jar lua2java [options] fileordir [, fileordir ...]\n" +
"Available options are:\n" +
" - process stdin\n" +
" -s src source directory\n" +
@@ -129,7 +129,7 @@ public class lua2java {
// check for at least one file
if ( files.size() <= 0 ) {
- System.err.println("no files found in "+seeds);
+ System.err.println(usage);
System.exit(-1);
}
diff --git a/src/jse/org/luaj/vm2/ast/NameResolver.java b/src/jse/org/luaj/vm2/ast/NameResolver.java
index edf3f541..645d4441 100644
--- a/src/jse/org/luaj/vm2/ast/NameResolver.java
+++ b/src/jse/org/luaj/vm2/ast/NameResolver.java
@@ -75,6 +75,7 @@ public class NameResolver extends Visitor {
public void visit(FuncDef stat) {
stat.name.name.variable = resolveNameReference(stat.name.name);
+ stat.name.name.variable.hasassignments = true;
super.visit(stat);
}
diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java
index 610dcb43..83148d53 100644
--- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java
+++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java
@@ -214,16 +214,18 @@ public class JavaCodeGen {
multiAssign(stat.names, stat.values);
}
}
+
public void visit(Assign stat) {
multiAssign(stat.vars, stat.exps);
}
+
private void multiAssign(List varsOrNames, List exps) {
int n = varsOrNames.size();
int m = exps != null? exps.size(): 0;
boolean vararglist = m>0 && exps.get(m-1).isvarargexp() && n>m;
if ( n<=m ) {
for ( int i=1; i<=n; i++ )
- singleAssign( varsOrNames.get(i-1), evalLuaValue(exps.get(i-1)) );
+ singleVarOrNameAssign( varsOrNames.get(i-1), evalLuaValue(exps.get(i-1)) );
for ( int i=n+1; i<=m; i++ )
outl( evalLuaValue(exps.get(i-1))+";" );
} else {
@@ -241,12 +243,13 @@ public class JavaCodeGen {
else if ( i==m ) valu = (vararglist? "$"+i+".arg1()": "$"+i);
else if ( vararglist ) valu = "$"+m+".arg("+(i-m+1)+")";
else valu = "NIL";
- singleAssign( varsOrNames.get(i-1), valu );
+ singleVarOrNameAssign( varsOrNames.get(i-1), valu );
}
oute( "}" );
}
}
- private void singleAssign(final Object varOrName, final String valu) {
+
+ private void singleVarOrNameAssign(final Object varOrName, final String valu) {
Visitor v = new Visitor() {
public void visit(FieldExp exp) {
outl(evalLuaValue(exp.lhs)+".set("+evalStringConstant(exp.name.name)+","+valu+");");
@@ -255,32 +258,50 @@ public class JavaCodeGen {
outl(evalLuaValue(exp.lhs)+".set("+evalLuaValue(exp.exp)+","+valu+");");
}
public void visit(NameExp exp) {
- if ( exp.name.variable.isLocal() )
- singleLocalAssign(exp.name, valu);
- else
- outl( "env.set("+evalStringConstant(exp.name.name)+","+valu+");");
+ singleAssign( exp.name, valu );
}
};
if ( varOrName instanceof VarExp )
((VarExp)varOrName).accept(v);
else if ( varOrName instanceof Name )
- singleLocalAssign((Name) varOrName, valu);
+ singleAssign((Name) varOrName, valu);
else
throw new IllegalStateException("can't assign to "+varOrName.getClass());
}
- private void singleLocalAssign(Name name, String valu) {
- outi( javascope.getJavaName(name.variable) );
- if ( name.variable.isupvalue )
- out( "[0]" );
- outr( " = "+valu+";");
+
+ private void singleAssign(Name name, String valu) {
+ if ( name.variable.isLocal() ) {
+ outi( "" );
+ singleReference( name );
+ outr( " = "+valu+";" );
+ } else
+ outl( "env.set("+evalStringConstant(name.name)+","+valu+");");
}
+
+ private void singleReference(Name name) {
+ if ( name.variable.isLocal() ) {
+ out( javascope.getJavaName(name.variable) );
+ if ( name.variable.isupvalue && name.variable.hasassignments )
+ out( "[0]" );
+ } else {
+ out( "env.get("+evalStringConstant(name.name)+")");
+ }
+ }
+
private void singleLocalDeclareAssign(Name name, String value) {
- String javaname = javascope.getJavaName(name.variable);
- if ( name.variable.isupvalue )
+ singleLocalDeclareAssign( name.variable, value );
+ }
+
+ private void singleLocalDeclareAssign(NamedVariable variable, String value) {
+ String javaname = javascope.getJavaName(variable);
+ if ( variable.isupvalue && variable.hasassignments )
outl( "final LuaValue[] "+javaname+" = {"+value+"};" );
+ else if ( variable.isupvalue )
+ outl( "final LuaValue "+javaname+(value!=null? " = "+value: "")+";" );
else
outl( "LuaValue "+javaname+(value!=null? " = "+value: "")+";" );
}
+
public void visit(Break breakstat) {
// TODO: wrap in do {} while(false), or add label as nec
outl( "break;" );
@@ -440,13 +461,7 @@ public class JavaCodeGen {
}
public void visit(NameExp exp) {
- if ( exp.name.variable.isLocal() ) {
- out( javascope.getJavaName(exp.name.variable) );
- if ( exp.name.variable.isupvalue )
- out( "[0]" );
- } else {
- out( "env.get("+evalStringConstant(exp.name.name)+")");
- }
+ singleReference( exp.name );
}
public void visit(ParensExp exp) {
@@ -574,12 +589,8 @@ public class JavaCodeGen {
outb("public Varargs invoke(Varargs $arg) {");
for ( int i=0; i0? "$arg.arg("+(i+1)+")": "$arg.arg1()";
- if ( name.variable.isupvalue )
- outl( "final LuaValue[] "+argname+" = {"+value+"};" );
- else
- outl( "LuaValue "+argname+" = "+value+";" );
+ singleLocalDeclareAssign( name, value );
}
if ( body.parlist.isvararg ) {
NamedVariable arg = body.scope.find("arg");
@@ -587,7 +598,7 @@ public class JavaCodeGen {
if ( m > 0 )
outl( "$arg = $arg.subargs("+(m+1)+");" );
String value = (javascope.usesvarargs? "NIL": "LuaValue.tableOf($arg,1)");
- outl( arg.isupvalue? "final LuaValue[] arg = {"+value+"};": "LuaValue arg = "+value+";" );
+ singleLocalDeclareAssign( arg, value );
}
}
writeBodyBlock(body.block);
@@ -605,7 +616,7 @@ public class JavaCodeGen {
private void assignArg(Name name) {
if ( name.variable.isupvalue ) {
String argname = javascope.getJavaName(name.variable);
- outl( "final LuaValue[] "+argname+" = {"+argname+"$0};" );
+ singleLocalDeclareAssign(name, argname+"$0");
}
}
@@ -616,39 +627,43 @@ public class JavaCodeGen {
int n = stat.name.dots!=null? stat.name.dots.size(): 0;
boolean m = stat.name.method != null;
if ( n>0 && !m && stat.name.name.variable.isLocal() )
- singleLocalAssign(stat.name.name,value);
+ singleAssign( stat.name.name, value );
else if ( n==0 && !m ) {
- if ( stat.name.name.variable.isLocal() ) {
- outi( javascope.getJavaName(stat.name.name.variable) );
- if ( stat.name.name.variable.isupvalue )
- out( "[0]" );
- outr( " = "+value+";" );
- } else {
- outl( "env.set("+evalStringConstant(stat.name.name.name)+","+value+");" );
- }
+ singleAssign( stat.name.name, value );
} else {
- if ( stat.name.name.variable.isLocal() ) {
- outi( javascope.getJavaName(stat.name.name.variable) );
- if ( stat.name.name.variable.isupvalue )
- out( "[0]" );
- } else {
- outi( "env.get("+evalStringConstant(stat.name.name.name)+")" );
- }
+ singleReference( stat.name.name );
for ( int i=0; i