From cd35ad7cbd6676139b8a0e6d95513496e9d8ba3c Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 29 Jul 2010 15:10:12 +0000 Subject: [PATCH] Improve lua2java code generation. --- src/core/org/luaj/vm2/TailcallVarargs.java | 2 +- .../org/luaj/vm2/lua2java/JavaCodeGen.java | 3 +- test/java/org/luaj/luajc/TestLuaJC.java | 88 +++++++++++++------ test/junit/org/luaj/vm2/FragmentsTest.java | 28 +++++- 4 files changed, 90 insertions(+), 31 deletions(-) diff --git a/src/core/org/luaj/vm2/TailcallVarargs.java b/src/core/org/luaj/vm2/TailcallVarargs.java index d55febd7..083de10d 100644 --- a/src/core/org/luaj/vm2/TailcallVarargs.java +++ b/src/core/org/luaj/vm2/TailcallVarargs.java @@ -34,7 +34,7 @@ public class TailcallVarargs extends Varargs { public TailcallVarargs(LuaValue object, LuaValue methodname, Varargs args) { this.func = object.get(methodname); - this.args = args; + this.args = LuaValue.varargsOf(object, args); } public boolean isTailcall() { diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java index 5350d3bf..eda48ac0 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java @@ -243,7 +243,7 @@ public class JavaCodeGen { } } - private void multiAssign(List varsOrNames, List exps) { + private void multiAssign(final List varsOrNames, List exps) { final boolean[] needsTmpvarsMultiAssign = { false }; if ( exps.size() > 1 ) { new Visitor() { @@ -252,6 +252,7 @@ public class JavaCodeGen { public void visit(FuncCall exp) { needsTmpvarsMultiAssign[0] = true; } public void visit(IndexExp exp) { needsTmpvarsMultiAssign[0] = true; } public void visit(MethodCall exp) { needsTmpvarsMultiAssign[0] = true; } + public void visit(NameExp exp) { needsTmpvarsMultiAssign[0] = true; } }.visitExps(exps); } if ( needsTmpvarsMultiAssign[0] ) diff --git a/test/java/org/luaj/luajc/TestLuaJC.java b/test/java/org/luaj/luajc/TestLuaJC.java index c18ca5d7..dbc8d81b 100644 --- a/test/java/org/luaj/luajc/TestLuaJC.java +++ b/test/java/org/luaj/luajc/TestLuaJC.java @@ -22,7 +22,10 @@ package org.luaj.luajc; import java.io.ByteArrayInputStream; +import java.io.FileOutputStream; import java.io.InputStream; +import java.util.Enumeration; +import java.util.Hashtable; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; @@ -34,36 +37,69 @@ public class TestLuaJC { // create the script public static String name = "script"; public static String script = - "local a='a\\ab\\bf\\fn\\nt\\tv\\vw\\133x\\222y'\n"+ - "local t={string.byte(a,1,#a)}\n"+ - "print( table.concat(t,',') )\n"; + "for i = 1,2 do\n"+ + " t[i] = function()\n"+ + " return i\n"+ + " end\n"+ + "end\n"; public static void main(String[] args) throws Exception { System.out.println(script); - - // create an environment to run in - LuaTable _G = JsePlatform.standardGlobals(); - - // compile into a chunk, or load as a class - LuaValue chunk; - if ( ! (args.length>0 && args[0].equals("nocompile")) ) { - InputStream is = new ByteArrayInputStream( script.getBytes() ); - chunk = LuaJC.getInstance().load(is, "script", _G); - } else { - chunk = (LuaValue) Class.forName("script").newInstance(); + try { + + // create an environment to run in + LuaTable _G = JsePlatform.standardGlobals(); + + // compile into a chunk, or load as a class + LuaValue chunk; + if ( ! (args.length>0 && args[0].equals("nocompile")) ) { + InputStream is = new ByteArrayInputStream( script.getBytes() ); + chunk = LuaJC.getInstance().load(is, "script", _G); + } else { + chunk = (LuaValue) Class.forName("script").newInstance(); + } + chunk.setfenv(_G); + + // call with arguments + LuaValue[] vargs = new LuaValue[args.length]; + for ( int i=0; ic), (b>0)\n" ); } + + public void testNumericForUpvalues() { + runFragment( LuaValue.valueOf(8), + "for i = 3,4 do\n"+ + " i = i + 5\n"+ + " local a = function()\n"+ + " return i\n"+ + " end\n" + + " return a()\n"+ + "end\n"); + } }