From 67216b17e174f9372189aa92c59afcc880ed3f89 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 22 Jul 2010 14:51:51 +0000 Subject: [PATCH] Improve lua2java code generator. --- src/jse/org/luaj/vm2/ast/NameResolver.java | 2 +- .../org/luaj/vm2/lua2java/JavaCodeGen.java | 31 +++++++++++++------ src/jse/org/luaj/vm2/lua2java/JavaScope.java | 27 +++++++++------- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/jse/org/luaj/vm2/ast/NameResolver.java b/src/jse/org/luaj/vm2/ast/NameResolver.java index e69bc646..c93b64fb 100644 --- a/src/jse/org/luaj/vm2/ast/NameResolver.java +++ b/src/jse/org/luaj/vm2/ast/NameResolver.java @@ -91,8 +91,8 @@ public class NameResolver extends Visitor { } public void visit(LocalAssign stat) { - defineLocalVars( stat.names ); super.visit(stat); + defineLocalVars( stat.names ); } public void visit(ParList pars) { diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java index be60b841..666f3f95 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java @@ -148,7 +148,7 @@ public class JavaCodeGen { if ( javascope.needsbinoptmp ) outl( "LuaValue $b;" ); super.visit(block); - if ( !endsInReturn(block) ) + if ( ! endsInReturn(block) ) outl( "return NONE;" ); } @@ -162,7 +162,19 @@ public class JavaCodeGen { int n = block.stats.size(); if ( n<=0 ) return false; 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) { @@ -325,9 +337,9 @@ public class JavaCodeGen { case Lua.OP_POW: out(".pow"); break; case Lua.OP_MOD: out(".mod"); 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_LE: out(".le"); break; + case Lua.OP_LE: out(".lteq"); break; case Lua.OP_EQ: out(".eq"); break; case Lua.OP_NEQ: out(".neq"); break; case Lua.OP_CONCAT: out(".concat"); break; @@ -564,7 +576,7 @@ public class JavaCodeGen { out( "[0]" ); outr( " = "+value+";" ); } else { - outi( "env.set("+evalStringConstant(stat.name.name.name)+","+value+");" ); + outl( "env.set("+evalStringConstant(stat.name.name.name)+","+value+");" ); } } else { if ( stat.name.name.variable.isLocal() ) { @@ -582,12 +594,13 @@ public class JavaCodeGen { public void visit(LocalFuncDef stat) { String javaname = javascope.getJavaName(stat.name.variable); - if ( stat.name.variable.isupvalue ) - outi("final LuaValue[] "+javaname+" = {"); - else + if ( stat.name.variable.isupvalue ) { + outl("final LuaValue[] "+javaname+" = {null};"); + outi(javaname+"[0] = "); + } else outi("LuaValue "+javaname+" = "); super.visit(stat); - outr( stat.name.variable.isupvalue? "};": ";" ); + outr( ";" ); } public void visit(NumericFor stat) { diff --git a/src/jse/org/luaj/vm2/lua2java/JavaScope.java b/src/jse/org/luaj/vm2/lua2java/JavaScope.java index 436d95d4..2b79aac3 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaScope.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaScope.java @@ -33,6 +33,7 @@ import org.luaj.vm2.ast.NameScope; import org.luaj.vm2.ast.Visitor; import org.luaj.vm2.ast.Exp.BinopExp; import org.luaj.vm2.ast.Stat.Return; +import org.luaj.vm2.lib.LibFunction; public class JavaScope extends NameScope { @@ -60,7 +61,10 @@ public class JavaScope extends NameScope { static { for ( int i=0; i staticnames; final Set javanames = new HashSet(); final Map astele2javaname = new HashMap(); -// final public List tmpvars = new ArrayList(); private JavaScope(Set staticnames, JavaScope outerScope) { super(outerScope); @@ -95,30 +98,29 @@ public class JavaScope extends NameScope { 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) { for ( int i=0; true; 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); astele2javaname.put(astele,jname); return jname; } } } + + 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) { proposal = toLegalJavaName(proposal); for ( int i=0; true; 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); staticnames.add(jname); return jname; @@ -153,6 +155,7 @@ public class JavaScope extends NameScope { public void visit(Return s) { int n = s.nreturns(); nreturns = (nreturns<0||n<0? -1: Math.max(n,nreturns)); + super.visit(s); } public void visit(BinopExp exp) { switch ( exp.op ) {