From 828e4be019a60ff19e2ec5a6554c5524b8042867 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 13 Sep 2018 11:53:00 +0200 Subject: [PATCH] Fix JsePlatform.luaMain() to provide an "arg" table in the chunk's environment. --- README.html | 42 ++++++++++--------- src/core/org/luaj/vm2/LuaClosure.java | 7 +++- src/jse/org/luaj/vm2/lib/jse/JsePlatform.java | 10 +++-- test/junit/org/luaj/vm2/AllTests.java | 2 + .../org/luaj/vm2/lib/jse/JsePlatformTest.java | 21 ++++++++++ version.properties | 2 +- 6 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 test/junit/org/luaj/vm2/lib/jse/JsePlatformTest.java diff --git a/README.html b/README.html index cd0f790a..f8b9a896 100644 --- a/README.html +++ b/README.html @@ -16,7 +16,7 @@ Getting Started with LuaJ -James Roseborough, Ian Farmer, Version 3.0.1 +James Roseborough, Ian Farmer, Version 3.0.2

Copyright © 2009-2014 Luaj.org. @@ -120,7 +120,7 @@ in comparison with the standard C distribution. 16.794 11.274 Java - java -cp luaj-jse-3.0.1.jar;bcel-5.2.jar lua -b fannkuch.lua 10 + java -cp luaj-jse-3.0.2.jar;bcel-5.2.jar lua -b fannkuch.lua 10 @@ -130,7 +130,7 @@ in comparison with the standard C distribution. 36.894 15.163 - java -cp luaj-jse-3.0.1.jar lua -n fannkuch.lua 10 + java -cp luaj-jse-3.0.2.jar lua -n fannkuch.lua 10 lua 5.1.4 @@ -186,7 +186,7 @@ It is also faster than Java-lua implementations Jill, Kahlua, and Mochalua for a From the main distribution directory line type:

-	java -cp lib/luaj-jse-3.0.1.jar lua examples/lua/hello.lua
+	java -cp lib/luaj-jse-3.0.2.jar lua examples/lua/hello.lua
 

@@ -198,7 +198,7 @@ You should see the following output: To see how luaj can be used to acccess most Java API's including swing, try:

-	java -cp lib/luaj-jse-3.0.1.jar lua examples/lua/swingapp.lua
+	java -cp lib/luaj-jse-3.0.2.jar lua examples/lua/swingapp.lua
 

@@ -213,8 +213,8 @@ Links to sources:

 From the main distribution directory line type:
 
 
-	java -cp lib/luaj-jse-3.0.1.jar luac examples/lua/hello.lua
-	java -cp lib/luaj-jse-3.0.1.jar lua luac.out
+	java -cp lib/luaj-jse-3.0.2.jar luac examples/lua/hello.lua
+	java -cp lib/luaj-jse-3.0.2.jar lua luac.out
 

@@ -228,8 +228,8 @@ Luaj can compile lua sources or binaries directly to java bytecode if the bcel l

 	ant bcel-lib
-	java -cp "lib/luaj-jse-3.0.1.jar;lib/bcel-5.2.jar" luajc -s examples/lua -d . hello.lua
-	java -cp "lib/luaj-jse-3.0.1.jar;." lua -l hello
+	java -cp "lib/luaj-jse-3.0.2.jar;lib/bcel-5.2.jar" luajc -s examples/lua -d . hello.lua
+	java -cp "lib/luaj-jse-3.0.2.jar;." lua -l hello
 

@@ -240,7 +240,7 @@ but the compiled classes must be in the class path at runtime, unless runtime ji

Lua scripts can also be run directly in this mode without precompiling using the lua command with the -b option and providing the bcel library in the class path:

-	java -cp "lib/luaj-jse-3.0.1.jar;lib/bcel-5.2.jar" lua -b examples/lua/hello.lua
+	java -cp "lib/luaj-jse-3.0.2.jar;lib/bcel-5.2.jar" lua -b examples/lua/hello.lua
 
@@ -284,7 +284,7 @@ A simple example may be found in

-You must include the library lib/luaj-jse-3.0.1.jar in your class path. +You must include the library lib/luaj-jse-3.0.2.jar in your class path.

Run a script in a MIDlet

@@ -311,7 +311,7 @@ A simple example may be found in

-You must include the library lib/luaj-jme-3.0.1.jar in your midlet jar. +You must include the library lib/luaj-jme-3.0.2.jar in your midlet jar.

An ant script to build and run the midlet is in @@ -341,7 +341,7 @@ You can also look up the engine by language "lua" or mimetypes "text/lua" or "ap All standard aspects of script engines including compiled statements are supported.

-You must include the library lib/luaj-jse-3.0.1.jar in your class path. +You must include the library lib/luaj-jse-3.0.2.jar in your class path.

A working example may be found in @@ -352,8 +352,8 @@ A working example may be found in To compile and run it using Java 1.6 or higher:

-	javac -cp lib/luaj-jse-3.0.1.jar examples/jse/ScriptEngineSample.java
-	java -cp "lib/luaj-jse-3.0.1.jar;examples/jse" ScriptEngineSample
+	javac -cp lib/luaj-jse-3.0.2.jar examples/jse/ScriptEngineSample.java
+	java -cp "lib/luaj-jse-3.0.2.jar;examples/jse" ScriptEngineSample
 

Excluding the lua bytecode compiler

@@ -593,7 +593,7 @@ The following lua script will open a swing frame on Java SE: See a longer sample in examples/lua/swingapp.lua for details, including a simple animation loop, rendering graphics, mouse and key handling, and image loading. Or try running it using:
-	java -cp lib/luaj-jse-3.0.1.jar lua examples/lua/swingapp.lua
+	java -cp lib/luaj-jse-3.0.2.jar lua examples/lua/swingapp.lua
 

@@ -842,7 +842,7 @@ For JSE projects, add this dependency for the luaj-jse jar: <dependency> <groupId>org.luaj</groupId> <artifactId>luaj-jse</artifactId> - <version>3.0.1</version> + <version>3.0.2</version> </dependency> while for JME projects, use the luaj-jme jar: @@ -850,7 +850,7 @@ while for JME projects, use the luaj-jme jar: <dependency> <groupId>org.luaj</groupId> <artifactId>luaj-jme</artifactId> - <version>3.0.1</version> + <version>3.0.2</version> </dependency> @@ -880,7 +880,7 @@ Unit test scripts can be found in these locations test/lua/*.lua test/lua/errors/*.lua test/lua/perf/*.lua - test/lua/luaj3.0.1-tests.zip + test/lua/luaj3.0.2-tests.zip

Code coverage

@@ -1017,6 +1017,10 @@ and at http://luaj.sour
  • Move online docs to http://luaj.org/luaj/3.0/api/
  • Fix os.time() conversions for pm times.
  • +  3.0.2 diff --git a/src/core/org/luaj/vm2/LuaClosure.java b/src/core/org/luaj/vm2/LuaClosure.java index 4d176b5d..9f766924 100644 --- a/src/core/org/luaj/vm2/LuaClosure.java +++ b/src/core/org/luaj/vm2/LuaClosure.java @@ -97,14 +97,19 @@ public class LuaClosure extends LuaFunction { */ public LuaClosure(Prototype p, LuaValue env) { this.p = p; + this.initupvalue1(env); + globals = env instanceof Globals? (Globals) env: null; + } + + public void initupvalue1(LuaValue env) { if (p.upvalues == null || p.upvalues.length == 0) this.upValues = NOUPVALUES; else { this.upValues = new UpValue[p.upvalues.length]; this.upValues[0] = new UpValue(new LuaValue[] {env}, 0); } - globals = env instanceof Globals? (Globals) env: null; } + public boolean isclosure() { return true; diff --git a/src/jse/org/luaj/vm2/lib/jse/JsePlatform.java b/src/jse/org/luaj/vm2/lib/jse/JsePlatform.java index 196ea8ba..e3ad8477 100644 --- a/src/jse/org/luaj/vm2/lib/jse/JsePlatform.java +++ b/src/jse/org/luaj/vm2/lib/jse/JsePlatform.java @@ -25,6 +25,7 @@ import org.luaj.vm2.Globals; import org.luaj.vm2.LoadState; import org.luaj.vm2.LuaThread; import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; import org.luaj.vm2.compiler.LuaC; import org.luaj.vm2.lib.Bit32Lib; import org.luaj.vm2.lib.CoroutineLib; @@ -124,10 +125,11 @@ public class JsePlatform { /** Simple wrapper for invoking a lua function with command line arguments. - * The supplied function is first given a new Globals object, - * then the program is run with arguments. + * The supplied function is first given a new Globals object as its environment + * then the program is run with arguments. + * @return {@link Varargs} containing any values returned by mainChunk. */ - public static void luaMain(LuaValue mainChunk, String[] args) { + public static Varargs luaMain(LuaValue mainChunk, String[] args) { Globals g = standardGlobals(); int n = args.length; LuaValue[] vargs = new LuaValue[args.length]; @@ -137,6 +139,6 @@ public class JsePlatform { arg.set("n", n); g.set("arg", arg); mainChunk.initupvalue1(g); - mainChunk.invoke(LuaValue.varargsOf(vargs)); + return mainChunk.invoke(LuaValue.varargsOf(vargs)); } } diff --git a/test/junit/org/luaj/vm2/AllTests.java b/test/junit/org/luaj/vm2/AllTests.java index f7f60dd7..0062371f 100644 --- a/test/junit/org/luaj/vm2/AllTests.java +++ b/test/junit/org/luaj/vm2/AllTests.java @@ -32,6 +32,7 @@ import org.luaj.vm2.compiler.DumpLoadEndianIntTest; import org.luaj.vm2.compiler.LuaParserTests; import org.luaj.vm2.compiler.RegressionTests; import org.luaj.vm2.compiler.SimpleTests; +import org.luaj.vm2.lib.jse.JsePlatformTest; import org.luaj.vm2.lib.jse.LuaJavaCoercionTest; import org.luaj.vm2.lib.jse.LuajavaAccessibleMembersTest; import org.luaj.vm2.lib.jse.LuajavaClassMembersTest; @@ -85,6 +86,7 @@ public class AllTests { // library tests TestSuite lib = new TestSuite("Library Tests"); + lib.addTestSuite(JsePlatformTest.class); lib.addTestSuite(LuajavaAccessibleMembersTest.class); lib.addTestSuite(LuajavaClassMembersTest.class); lib.addTestSuite(LuaJavaCoercionTest.class); diff --git a/test/junit/org/luaj/vm2/lib/jse/JsePlatformTest.java b/test/junit/org/luaj/vm2/lib/jse/JsePlatformTest.java new file mode 100644 index 00000000..80f3e773 --- /dev/null +++ b/test/junit/org/luaj/vm2/lib/jse/JsePlatformTest.java @@ -0,0 +1,21 @@ +package org.luaj.vm2.lib.jse; + +import junit.framework.TestCase; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; + + +public class JsePlatformTest extends TestCase { + public void testLuaMainPassesArguments() { + Globals globals = JsePlatform.standardGlobals(); + LuaValue chunk = globals.load("return #arg, arg.n, arg[2], arg[1]"); + Varargs results = JsePlatform.luaMain(chunk, new String[] { "aaa", "bbb" }); + assertEquals(results.narg(), 4); + assertEquals(results.arg(1), LuaValue.valueOf(2)); + assertEquals(results.arg(2), LuaValue.valueOf(2)); + assertEquals(results.arg(3), LuaValue.valueOf("bbb")); + assertEquals(results.arg(4), LuaValue.valueOf("aaa")); + } +} diff --git a/version.properties b/version.properties index 0138b12c..fa48e2d2 100644 --- a/version.properties +++ b/version.properties @@ -1 +1 @@ -version: 3.0.1 \ No newline at end of file +version: 3.0.2 \ No newline at end of file