diff --git a/src/addon/java/lua/addon/luajava/LuaJava.java b/src/addon/java/lua/addon/luajava/LuaJava.java index cc7631ea..fbf3f512 100644 --- a/src/addon/java/lua/addon/luajava/LuaJava.java +++ b/src/addon/java/lua/addon/luajava/LuaJava.java @@ -128,7 +128,7 @@ public final class LuaJava extends LFunction { LValue v = CoerceJavaToLua.coerce( o ); vm.push( v ); } catch (NoSuchFieldException nsfe) { - vm.setResult( new LMethod(m_instance,clazz,s) ); + vm.push( new LMethod(m_instance,clazz,s) ); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/test/java/LuaJavaAppRunner.java b/src/test/java/LuaJavaAppRunner.java index 519b36d4..13202b8f 100644 --- a/src/test/java/LuaJavaAppRunner.java +++ b/src/test/java/LuaJavaAppRunner.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.InputStream; import lua.StackState; +import lua.addon.luacompat.LuaCompat; import lua.addon.luajava.LuaJava; import lua.io.Closure; import lua.io.LoadState; @@ -20,6 +21,9 @@ public class LuaJavaAppRunner { public static void main( String[] args ) throws IOException { + // add LuaCompat bindings + LuaCompat.install(); + // add LuaJava bindings LuaJava.install(); diff --git a/src/test/java/lua/LuaJTest.java b/src/test/java/lua/LuaJTest.java index 66bd93c7..74571f59 100644 --- a/src/test/java/lua/LuaJTest.java +++ b/src/test/java/lua/LuaJTest.java @@ -51,7 +51,11 @@ public class LuaJTest extends TestCase { public void testBoolean() throws IOException, InterruptedException { runTest( "boolean" ); } - + + public void testCalls() throws IOException, InterruptedException { + runTest( "calls" ); + } + public void testCoercions() throws IOException, InterruptedException { runTest( "coercions" ); } diff --git a/src/test/res/autoload.lua b/src/test/res/autoload.lua index 723e53ed..4bd6047f 100644 --- a/src/test/res/autoload.lua +++ b/src/test/res/autoload.lua @@ -1,11 +1,14 @@ +-- Clear out builtin math package +math = nil + local function autoload(table, key) - local chunk = loadfile("/"..key..".luac") + local chunk = loadfile(key..".luac") table[key] = chunk() end -autoload_mt = { __index = autoload } - -setmetatable(_G, autoload_mt) +setmetatable(_G, { __index = autoload } ) +-- local result = math.sqrt(9.0) +-- print("x=", result) print("square root of 9.0 is ", math.sqrt(9.0)) print("math.pi=", math.pi); diff --git a/src/test/res/autoload.luac b/src/test/res/autoload.luac index e49e9fc4..aa2a1964 100644 Binary files a/src/test/res/autoload.luac and b/src/test/res/autoload.luac differ diff --git a/src/test/res/calls-expected.out b/src/test/res/calls-expected.out new file mode 100644 index 00000000..efcced8d --- /dev/null +++ b/src/test/res/calls-expected.out @@ -0,0 +1,4 @@ +15 +15 +1.2246467991473532E-16 +1.2246467991473532E-16 diff --git a/src/test/res/calls.lua b/src/test/res/calls.lua new file mode 100644 index 00000000..f9d8aa2f --- /dev/null +++ b/src/test/res/calls.lua @@ -0,0 +1,24 @@ +local function f(x) + -- tailcall to a builtin + return math.sin(x) +end + +local function factorial(i) + local function helper(sum, n) + if n <= 0 then + return sum + else + -- tail call to a nested Lua function + return helper(n + sum, n - 1) + end + end + return helper(0, i) +end + +local result1 = factorial(5) +print(result1) +print(factorial(5)) + +local result2 = f(math.pi) +print(result2) +print(f(math.pi)) diff --git a/src/test/res/calls.luac b/src/test/res/calls.luac new file mode 100644 index 00000000..4cad7222 Binary files /dev/null and b/src/test/res/calls.luac differ