Improve lua2java code generator.
This commit is contained in:
@@ -91,8 +91,8 @@ public class NameResolver extends Visitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void visit(LocalAssign stat) {
|
public void visit(LocalAssign stat) {
|
||||||
defineLocalVars( stat.names );
|
|
||||||
super.visit(stat);
|
super.visit(stat);
|
||||||
|
defineLocalVars( stat.names );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visit(ParList pars) {
|
public void visit(ParList pars) {
|
||||||
|
|||||||
@@ -162,7 +162,19 @@ public class JavaCodeGen {
|
|||||||
int n = block.stats.size();
|
int n = block.stats.size();
|
||||||
if ( n<=0 ) return false;
|
if ( n<=0 ) return false;
|
||||||
Stat s = block.stats.get(n-1);
|
Stat s = block.stats.get(n-1);
|
||||||
return s instanceof Return || s instanceof Break;
|
if ( s instanceof Return || s instanceof Break )
|
||||||
|
return true;
|
||||||
|
else if ( s instanceof IfThenElse ) {
|
||||||
|
IfThenElse ite = (IfThenElse) s;
|
||||||
|
if ( ite.elseblock == null || ! endsInReturn(ite.ifblock) || ! endsInReturn(ite.elseblock) )
|
||||||
|
return false;
|
||||||
|
if ( ite.elseifblocks != null )
|
||||||
|
for ( Block b : ite.elseifblocks )
|
||||||
|
if ( ! endsInReturn(b) )
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visit(Stat.Return s) {
|
public void visit(Stat.Return s) {
|
||||||
@@ -325,9 +337,9 @@ public class JavaCodeGen {
|
|||||||
case Lua.OP_POW: out(".pow"); break;
|
case Lua.OP_POW: out(".pow"); break;
|
||||||
case Lua.OP_MOD: out(".mod"); break;
|
case Lua.OP_MOD: out(".mod"); break;
|
||||||
case Lua.OP_GT: out(".gt"); break;
|
case Lua.OP_GT: out(".gt"); break;
|
||||||
case Lua.OP_GE: out(".ge"); break;
|
case Lua.OP_GE: out(".gteq"); break;
|
||||||
case Lua.OP_LT: out(".lt"); break;
|
case Lua.OP_LT: out(".lt"); break;
|
||||||
case Lua.OP_LE: out(".le"); break;
|
case Lua.OP_LE: out(".lteq"); break;
|
||||||
case Lua.OP_EQ: out(".eq"); break;
|
case Lua.OP_EQ: out(".eq"); break;
|
||||||
case Lua.OP_NEQ: out(".neq"); break;
|
case Lua.OP_NEQ: out(".neq"); break;
|
||||||
case Lua.OP_CONCAT: out(".concat"); break;
|
case Lua.OP_CONCAT: out(".concat"); break;
|
||||||
@@ -564,7 +576,7 @@ public class JavaCodeGen {
|
|||||||
out( "[0]" );
|
out( "[0]" );
|
||||||
outr( " = "+value+";" );
|
outr( " = "+value+";" );
|
||||||
} else {
|
} else {
|
||||||
outi( "env.set("+evalStringConstant(stat.name.name.name)+","+value+");" );
|
outl( "env.set("+evalStringConstant(stat.name.name.name)+","+value+");" );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ( stat.name.name.variable.isLocal() ) {
|
if ( stat.name.name.variable.isLocal() ) {
|
||||||
@@ -582,12 +594,13 @@ public class JavaCodeGen {
|
|||||||
|
|
||||||
public void visit(LocalFuncDef stat) {
|
public void visit(LocalFuncDef stat) {
|
||||||
String javaname = javascope.getJavaName(stat.name.variable);
|
String javaname = javascope.getJavaName(stat.name.variable);
|
||||||
if ( stat.name.variable.isupvalue )
|
if ( stat.name.variable.isupvalue ) {
|
||||||
outi("final LuaValue[] "+javaname+" = {");
|
outl("final LuaValue[] "+javaname+" = {null};");
|
||||||
else
|
outi(javaname+"[0] = ");
|
||||||
|
} else
|
||||||
outi("LuaValue "+javaname+" = ");
|
outi("LuaValue "+javaname+" = ");
|
||||||
super.visit(stat);
|
super.visit(stat);
|
||||||
outr( stat.name.variable.isupvalue? "};": ";" );
|
outr( ";" );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visit(NumericFor stat) {
|
public void visit(NumericFor stat) {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import org.luaj.vm2.ast.NameScope;
|
|||||||
import org.luaj.vm2.ast.Visitor;
|
import org.luaj.vm2.ast.Visitor;
|
||||||
import org.luaj.vm2.ast.Exp.BinopExp;
|
import org.luaj.vm2.ast.Exp.BinopExp;
|
||||||
import org.luaj.vm2.ast.Stat.Return;
|
import org.luaj.vm2.ast.Stat.Return;
|
||||||
|
import org.luaj.vm2.lib.LibFunction;
|
||||||
|
|
||||||
|
|
||||||
public class JavaScope extends NameScope {
|
public class JavaScope extends NameScope {
|
||||||
@@ -60,7 +61,10 @@ public class JavaScope extends NameScope {
|
|||||||
static {
|
static {
|
||||||
for ( int i=0; i<specials.length; i++ )
|
for ( int i=0; i<specials.length; i++ )
|
||||||
SPECIALS.add(specials[i]);
|
SPECIALS.add(specials[i]);
|
||||||
// TODO: add any via reflection from LuaValue
|
for ( java.lang.reflect.Field f : LibFunction.class.getFields() )
|
||||||
|
SPECIALS.add(f.getName());
|
||||||
|
for ( java.lang.reflect.Method m : LibFunction.class.getMethods() )
|
||||||
|
SPECIALS.add(m.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int nreturns;
|
public int nreturns;
|
||||||
@@ -69,7 +73,6 @@ public class JavaScope extends NameScope {
|
|||||||
final Set<String> staticnames;
|
final Set<String> staticnames;
|
||||||
final Set<String> javanames = new HashSet<String>();
|
final Set<String> javanames = new HashSet<String>();
|
||||||
final Map<Object,String> astele2javaname = new HashMap<Object,String>();
|
final Map<Object,String> astele2javaname = new HashMap<Object,String>();
|
||||||
// final public List<String> tmpvars = new ArrayList<String>();
|
|
||||||
|
|
||||||
private JavaScope(Set<String> staticnames, JavaScope outerScope) {
|
private JavaScope(Set<String> staticnames, JavaScope outerScope) {
|
||||||
super(outerScope);
|
super(outerScope);
|
||||||
@@ -95,18 +98,10 @@ public class JavaScope extends NameScope {
|
|||||||
return allocateJavaName( nv, nv.name );
|
return allocateJavaName( nv, nv.name );
|
||||||
}
|
}
|
||||||
|
|
||||||
// public String getTempVar(BinopExp exp) {
|
|
||||||
// return astele2javaname.containsKey(exp)? astele2javaname.get(exp): "$t";
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void allocateTempVar(BinopExp exp) {
|
|
||||||
// tmpvars.add( allocateJavaName( exp, "t" ) );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
final private String allocateJavaName(Object astele, String proposal) {
|
final private String allocateJavaName(Object astele, String proposal) {
|
||||||
for ( int i=0; true; i++ ) {
|
for ( int i=0; true; i++ ) {
|
||||||
String jname = proposal+(i==0? "": "$"+i);
|
String jname = proposal+(i==0? "": "$"+i);
|
||||||
if ( ! javanames.contains(jname) && ! SPECIALS.contains(jname) ) {
|
if ( ! javanames.contains(jname) && ! SPECIALS.contains(jname) && !staticnames.contains(jname) ) {
|
||||||
javanames.add(jname);
|
javanames.add(jname);
|
||||||
astele2javaname.put(astele,jname);
|
astele2javaname.put(astele,jname);
|
||||||
return jname;
|
return jname;
|
||||||
@@ -114,11 +109,18 @@ public class JavaScope extends NameScope {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isJavanameInScope(String javaname) {
|
||||||
|
for ( JavaScope s = this; s != null; s = (JavaScope) s.outerScope )
|
||||||
|
if ( s.javanames.contains(javaname) )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public String createConstantName(String proposal) {
|
public String createConstantName(String proposal) {
|
||||||
proposal = toLegalJavaName(proposal);
|
proposal = toLegalJavaName(proposal);
|
||||||
for ( int i=0; true; i++ ) {
|
for ( int i=0; true; i++ ) {
|
||||||
String jname = proposal+(i==0? "": "$"+i);
|
String jname = proposal+(i==0? "": "$"+i);
|
||||||
if ( ! javanames.contains(jname) && ! SPECIALS.contains(jname) && !staticnames.contains(jname) ) {
|
if ( ! isJavanameInScope(jname) && ! SPECIALS.contains(jname) && !staticnames.contains(jname) ) {
|
||||||
javanames.add(jname);
|
javanames.add(jname);
|
||||||
staticnames.add(jname);
|
staticnames.add(jname);
|
||||||
return jname;
|
return jname;
|
||||||
@@ -153,6 +155,7 @@ public class JavaScope extends NameScope {
|
|||||||
public void visit(Return s) {
|
public void visit(Return s) {
|
||||||
int n = s.nreturns();
|
int n = s.nreturns();
|
||||||
nreturns = (nreturns<0||n<0? -1: Math.max(n,nreturns));
|
nreturns = (nreturns<0||n<0? -1: Math.max(n,nreturns));
|
||||||
|
super.visit(s);
|
||||||
}
|
}
|
||||||
public void visit(BinopExp exp) {
|
public void visit(BinopExp exp) {
|
||||||
switch ( exp.op ) {
|
switch ( exp.op ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user