From 19f8a2d37281f22d7f9829bac412a20734d7701a Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Tue, 20 Apr 2010 00:37:23 +0000 Subject: [PATCH] Fix to tailcall processing. --- src/core/org/luaj/vm2/LuaClosure.java | 5 +++++ src/core/org/luaj/vm2/LuaError.java | 14 ++++++++++++++ src/core/org/luaj/vm2/TailcallVarargs.java | 7 +++++-- src/core/org/luaj/vm2/Varargs.java | 6 ++++++ src/core/org/luaj/vm2/lib/BaseLib.java | 5 ++--- src/core/org/luaj/vm2/lib/PackageLib.java | 14 ++++++++------ 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaClosure.java b/src/core/org/luaj/vm2/LuaClosure.java index 7e8d2692..79178dfa 100644 --- a/src/core/org/luaj/vm2/LuaClosure.java +++ b/src/core/org/luaj/vm2/LuaClosure.java @@ -101,6 +101,10 @@ public class LuaClosure extends LuaFunction { } public final Varargs invoke(Varargs varargs) { + return oninvoke( varargs ).eval(); + } + + final Varargs oninvoke(Varargs varargs) { LuaValue[] stack = new LuaValue[p.maxstacksize]; System.arraycopy(NILS, 0, stack, 0, p.maxstacksize); for ( int i=0; i ERR - throw new LuaError( arg1.isnil()? null: arg1.toString() ); + throw new LuaError( arg1.isnil()? null: arg1.toString(), arg2.optint(1) ); case 2: // "rawequal", // (v1, v2) -> boolean return valueOf(arg1 == arg2); case 3: { // "setfenv", // (f, table) -> void @@ -347,7 +346,7 @@ public class BaseLib extends OneArgFunction implements ResourceFinder { return NONE; } - private Varargs loadFile(String filename) throws IOException { + public static Varargs loadFile(String filename) throws IOException { InputStream is = FINDER.findResource(filename); if ( is == null ) return varargsOf(NIL, valueOf("not found: "+filename)); diff --git a/src/core/org/luaj/vm2/lib/PackageLib.java b/src/core/org/luaj/vm2/lib/PackageLib.java index c06389e7..5cfe9d11 100644 --- a/src/core/org/luaj/vm2/lib/PackageLib.java +++ b/src/core/org/luaj/vm2/lib/PackageLib.java @@ -21,6 +21,7 @@ ******************************************************************************/ package org.luaj.vm2.lib; +import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; @@ -306,11 +307,6 @@ public class PackageLib extends OneArgFunction { String name = args.checkString(1); InputStream is = null; - // try to use loadfile for the file - LuaValue loadfile = env.get(_LOADFILE); - if ( ! loadfile.isfunction() ) - return valueOf("loadfile is not a function" ); - // get package path LuaValue pp = PACKAGE.get(_PATH); @@ -340,7 +336,13 @@ public class PackageLib extends OneArgFunction { } // try loading the file - Varargs v = loadfile.invoke(valueOf(filename)); + Varargs v; + try { + v = BaseLib.loadFile(filename); + } catch ( IOException ioe ) { + v = varargsOf(NIL, valueOf(ioe.getMessage())); + + } if ( v.arg1().isfunction() ) return v.arg1();