diff --git a/src/core/org/luaj/vm2/LuaClosure.java b/src/core/org/luaj/vm2/LuaClosure.java index 7877cc62..8214690c 100644 --- a/src/core/org/luaj/vm2/LuaClosure.java +++ b/src/core/org/luaj/vm2/LuaClosure.java @@ -21,6 +21,8 @@ ******************************************************************************/ package org.luaj.vm2; +import org.luaj.vm2.lib.DebugLib.CallFrame; + /** * Extension of {@link LuaFunction} which executes lua bytecode. *
@@ -547,8 +549,24 @@ public class LuaClosure extends LuaFunction { } private void processErrorHooks(LuaError le, Prototype p, int pc) { - le.fileline = (p.source != null? p.source.tojstring(): "?") + ":" - + (p.lineinfo != null && pc >= 0 && pc < p.lineinfo.length? String.valueOf(p.lineinfo[pc]): "?"); + String file = "?"; + int line = -1; + { + CallFrame frame = null; + if (globals != null && globals.debuglib != null) { + frame = globals.debuglib.getCallFrame(le.level); + if (frame != null) { + String src = frame.shortsource(); + file = src != null ? src : "?"; + line = frame.currentline(); + } + } + if (frame == null) { + file = p.source != null? p.source.tojstring(): "?"; + line = p.lineinfo != null && pc >= 0 && pc < p.lineinfo.length ? p.lineinfo[pc] : -1; + } + } + le.fileline = file + ":" + line; le.traceback = errorHook(le.getMessage(), le.level); } diff --git a/src/core/org/luaj/vm2/lib/BaseLib.java b/src/core/org/luaj/vm2/lib/BaseLib.java index 26e1d8c7..fb86825b 100644 --- a/src/core/org/luaj/vm2/lib/BaseLib.java +++ b/src/core/org/luaj/vm2/lib/BaseLib.java @@ -173,9 +173,9 @@ public class BaseLib extends TwoArgFunction implements ResourceFinder { // "error", // ( message [,level] ) -> ERR static final class error extends TwoArgFunction { public LuaValue call(LuaValue arg1, LuaValue arg2) { - throw arg1.isnil()? new LuaError(null, arg2.optint(1)): - arg1.isstring()? new LuaError(arg1.tojstring(), arg2.optint(1)): - new LuaError(arg1); + if (arg1.isnil()) throw new LuaError(NIL); + if (!arg1.isstring() || arg2.optint(1) == 0) throw new LuaError(arg1); + throw new LuaError(arg1.tojstring(), arg2.optint(1)); } } diff --git a/src/core/org/luaj/vm2/lib/DebugLib.java b/src/core/org/luaj/vm2/lib/DebugLib.java index a81ef230..167ea36c 100644 --- a/src/core/org/luaj/vm2/lib/DebugLib.java +++ b/src/core/org/luaj/vm2/lib/DebugLib.java @@ -442,6 +442,10 @@ public class DebugLib extends TwoArgFunction { return callstack().traceback(level); } + public CallFrame getCallFrame(int level) { + return callstack().getCallFrame(level); + } + void callHook(LuaThread.State s, LuaValue type, LuaValue arg) { if (s.inhook || s.hookfunc == null) return; s.inhook = true; @@ -645,7 +649,7 @@ public class DebugLib extends TwoArgFunction { } - static class CallFrame { + public static class CallFrame { LuaFunction f; int pc; int top; @@ -691,7 +695,7 @@ public class DebugLib extends TwoArgFunction { return NIL; } } - int currentline() { + public int currentline() { if ( !f.isclosure() ) return -1; int[] li = f.checkclosure().p.lineinfo; return li==null || pc<0 || pc>=li.length? -1: li[pc];