From 0c93edfd56ce9db4038c2edc37b592a8e154a141 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Fri, 21 Sep 2012 14:32:07 +0000 Subject: [PATCH] Improve compatibility with lua 5.2. --- src/core/org/luaj/vm2/Lua.java | 19 ++- src/core/org/luaj/vm2/LuaFunction.java | 11 +- src/core/org/luaj/vm2/compiler/LexState.java | 19 +-- src/core/org/luaj/vm2/lib/DebugLib.java | 151 ++++++++----------- test/lua/debuglib.lua | 36 ++++- test/lua/luaj3.0-tests.zip | Bin 299026 -> 299255 bytes 6 files changed, 125 insertions(+), 111 deletions(-) diff --git a/src/core/org/luaj/vm2/Lua.java b/src/core/org/luaj/vm2/Lua.java index 0666c332..9b9b0ce1 100644 --- a/src/core/org/luaj/vm2/Lua.java +++ b/src/core/org/luaj/vm2/Lua.java @@ -340,5 +340,22 @@ public class Lua { /* number of list items to accumulate before a SETLIST instruction */ public static final int LFIELDS_PER_FLUSH = 50; - + + private static final int MAXSRC = 80; + + public static String chunkid( String source ) { + if ( source.startsWith("=") ) + return source.substring(1); + String end = ""; + if ( source.startsWith("@") ) { + source = source.substring(1); + } else { + source = "[string \""+source; + end = "\"]"; + } + int n = source.length() + end.length(); + if ( n > MAXSRC ) + source = source.substring(0,MAXSRC-end.length()-3) + "..."; + return source + end; + } } diff --git a/src/core/org/luaj/vm2/LuaFunction.java b/src/core/org/luaj/vm2/LuaFunction.java index deb8b954..3e7d86a9 100644 --- a/src/core/org/luaj/vm2/LuaFunction.java +++ b/src/core/org/luaj/vm2/LuaFunction.java @@ -71,11 +71,18 @@ public class LuaFunction extends LuaValue { } public String tojstring() { - String s = getClass().getName(); - return "function: " + s.substring(Math.max(s.lastIndexOf('.'),s.lastIndexOf('$'))+1); + return "function: " + classnamestub(); } public LuaString strvalue() { return valueOf(tojstring()); } + + /** Return the last part of the class name, to be used as a function name in tojstring and elsewhere. + * @return String naming the last part of the class name after the last dot (.) or dollar sign ($). + */ + public String classnamestub() { + String s = getClass().getName(); + return s.substring(Math.max(s.lastIndexOf('.'),s.lastIndexOf('$'))+1); + } } diff --git a/src/core/org/luaj/vm2/compiler/LexState.java b/src/core/org/luaj/vm2/compiler/LexState.java index 677b73d8..3b48ca0c 100644 --- a/src/core/org/luaj/vm2/compiler/LexState.java +++ b/src/core/org/luaj/vm2/compiler/LexState.java @@ -61,7 +61,6 @@ public class LexState { } private static final int EOZ = (-1); - private static final int MAXSRC = 80; private static final int MAX_INT = Integer.MAX_VALUE-2; private static final int UCHAR_MAX = 255; // TODO, convert to unicode CHAR_MAX? private static final int LUAI_MAXCCALLS = 200; @@ -260,29 +259,13 @@ public class LexState { } void lexerror( String msg, int token ) { - String cid = chunkid( source.tojstring() ); // TODO: get source name from source + String cid = Lua.chunkid( source.tojstring() ); L.pushfstring( cid+":"+linenumber+": "+msg ); if ( token != 0 ) L.pushfstring( "syntax error: "+msg+" near "+txtToken(token) ); throw new LuaError(cid+":"+linenumber+": "+msg); } - String chunkid( String source ) { - if ( source.startsWith("=") ) - return source.substring(1); - String end = ""; - if ( source.startsWith("@") ) { - source = source.substring(1); - } else { - source = "[string \""+source; - end = "\"]"; - } - int n = source.length() + end.length(); - if ( n > MAXSRC ) - source = source.substring(0,MAXSRC-end.length()-3) + "..."; - return source + end; - } - void syntaxerror( String msg ) { lexerror( msg, t.token ); } diff --git a/src/core/org/luaj/vm2/lib/DebugLib.java b/src/core/org/luaj/vm2/lib/DebugLib.java index 99b8138b..0edba9e4 100644 --- a/src/core/org/luaj/vm2/lib/DebugLib.java +++ b/src/core/org/luaj/vm2/lib/DebugLib.java @@ -37,6 +37,7 @@ import org.luaj.vm2.LuaValue; import org.luaj.vm2.Print; import org.luaj.vm2.Prototype; import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.DebugLib.CallFrame; /** * Subclass of {@link LibFunction} which implements the lua standard {@code debug} @@ -207,13 +208,13 @@ public class DebugLib extends OneArgFunction { } if (what.indexOf('n') >= 0) { if (frame != null) { - LuaString[] kind = getfuncname(frame); - info.set(NAME, kind!=null? kind[0]: QMARK); - info.set(NAMEWHAT, kind!=null? kind[1]: EMPTYSTRING); + DebugInfo ar = frame.getinfo("n"); + info.set(NAME, LuaValue.valueOf(ar.name)); + info.set(NAMEWHAT, LuaValue.valueOf(ar.namewhat)); } } if (what.indexOf('t') >= 0) { - info.set(ISTAILCALL, frame != null && frame.istailcall()? ONE: ZERO); + info.set(ISTAILCALL, ZERO); } if (what.indexOf('L') >= 0) { LuaTable lines = new LuaTable(); @@ -505,6 +506,8 @@ public class DebugLib extends OneArgFunction { for (int i = frame.length; i < n; ++i) f[i] = new CallFrame(); frame = f; + for (int i = 1; i < n; ++i) + f[i].previous = f[i-1]; } return frame[calls++]; } @@ -534,24 +537,30 @@ public class DebugLib extends OneArgFunction { String traceback(int level) { StringBuffer sb = new StringBuffer(); sb.append( "stack traceback:" ); - for (DebugLib.CallFrame c, prev = null; (c = getCallFrame(level++)) != null; prev = c ) { - DebugInfo ar = c.getinfo("Slnt", prev); - prev = c; + for (DebugLib.CallFrame c; (c = getCallFrame(level++)) != null; ) { sb.append("\n\t"); sb.append( c.shortsource() ); sb.append( ':' ); if (c.currentline() > 0) sb.append( c.currentline()+":" ); sb.append( " in " ); - sb.append( c.tracename() ); - if (c.istailcall()) - sb.append("\n\t(...tail calls...)"); + DebugInfo ar = c.getinfo("n"); + if (c.linedefined() == 0) + sb.append("main chunk"); + else if ( ar.name != null ) { + sb.append( "function '" ); + sb.append( ar.name ); + sb.append( '\'' ); + } else { + sb.append( "function <"+c.shortsource()+":"+c.linedefined()+">" ); + } } + sb.append("\n\t[Java]: in ?"); return sb.toString(); } DebugLib.CallFrame getCallFrame(int level) { - if (level < 1 || level >= calls) + if (level < 1 || level > calls) return null; return frame[calls-level]; } @@ -570,12 +579,11 @@ public class DebugLib extends OneArgFunction { int top; Varargs v; LuaValue[] stack; - boolean tail; + CallFrame previous; void set(LuaClosure function, Varargs varargs, LuaValue[] stack) { this.f = function; this.v = varargs; this.stack = stack; - this.tail = false; } public String shortsource() { return f.isclosure()? DebugLib.shortsource(f.checkclosure().p): "[Java]"; @@ -592,8 +600,6 @@ public class DebugLib extends OneArgFunction { this.pc = pc; this.v = v; this.top = top; - if (f.checkclosure().p.code[pc] == Lua.OP_TAILCALL) - this.tail = true; if (TRACE) Print.printState(f.checkclosure(), pc, stack, top, v); } @@ -620,20 +626,7 @@ public class DebugLib extends OneArgFunction { } String sourceline() { if ( !f.isclosure() ) return f.tojstring(); - String s = f.checkclosure().p.source.tojstring(); - int line = currentline(); - return (s.startsWith("@")||s.startsWith("=")? s.substring(1): s) + ":" + line; - } - String tracename() { - LuaString[] kind = getfuncname(this); - if (kind[0] == null) - return "function "+kind[1].tojstring(); -// if (kind[0] == M) -// return "main chunk"; - if (kind[0] == JAVA) - return "function "+kind[1].tojstring(); - return "function <"+shortsource()+":"+linedefined()+">"; - + return DebugLib.shortsource(f.checkclosure().p) + ":" + currentline(); } private int linedefined() { return f.isclosure()? f.checkclosure().p.linedefined: -1; @@ -642,14 +635,7 @@ public class DebugLib extends OneArgFunction { if ( !f.isclosure() ) return null; return f.checkclosure().p.getlocalname(index, pc); } - String tojstring() { - return tracename()+" "+sourceline(); - } - boolean istailcall() { - return tail; - } - - DebugInfo getinfo(String what, CallFrame previous) { + DebugInfo getinfo(String what) { DebugInfo ar = new DebugInfo(); for (int i = 0, n = what.length(); i < n; ++i) { switch (what.charAt(i)) { @@ -660,13 +646,14 @@ public class DebugLib extends OneArgFunction { ar.linedefined = p.linedefined; ar.lastlinedefined = p.lastlinedefined; ar.what = (ar.linedefined == 0) ? "main" : "Lua"; + ar.short_src = DebugLib.shortsource(p); } else { - ar.source = "=[Java]"; - ar.linedefined = -1; - ar.lastlinedefined = -1; - ar.what = "Java"; + ar.source = "=[Java]"; + ar.linedefined = -1; + ar.lastlinedefined = -1; + ar.what = "Java"; + ar.short_src = f.classnamestub(); } - ar.short_src = chunkid(ar.source); break; case 'l': ar.currentline = currentline(); @@ -684,47 +671,33 @@ public class DebugLib extends OneArgFunction { } break; case 't': - ar.istailcall = this.tail; + ar.istailcall = false; break; case 'n': { - /* calling function is a known Lua function? */ - if (!tail && (previous != null && previous.f.isclosure())) { - LuaString[] kind = getfuncname(previous); - ar.name = String.valueOf(kind[0]); - ar.namewhat = String.valueOf(kind[1]); - } - else - ar.namewhat = null; - if (ar.namewhat == null) { - ar.namewhat = ""; /* not found */ - ar.name = null; - } - break; + /* calling function is a known Lua function? */ + if (previous != null && previous.f.isclosure()) { + NameWhat nw = getfuncname(previous); + if (nw != null) { + ar.name = nw.name; + ar.namewhat = nw.namewhat; + } + } + else + ar.namewhat = null; + if (ar.namewhat == null) { + ar.namewhat = ""; /* not found */ + ar.name = null; + } + break; } default: break; } } - return null; + return ar; } } - static String chunkid( String source ) { - if ( source.startsWith("=") ) - return source.substring(1); - String end = ""; - if ( source.startsWith("@") ) { - source = source.substring(1); - } else { - source = "[string \""+source; - end = "\"]"; - } - int n = source.length() + end.length(); - if ( n > 50 ) - source = source.substring(0,50-end.length()-3) + "..."; - return source + end; - } - static LuaString findupvalue(LuaClosure c, int up) { if ( c.upValues != null && up > 0 && up <= c.upValues.length ) { if ( c.p.upvalues != null && up <= c.p.upvalues.length ) @@ -748,9 +721,19 @@ public class DebugLib extends OneArgFunction { if (!x) throw new RuntimeException("lua_assert failed"); } - public static LuaString[] getfuncname(DebugLib.CallFrame frame) { + static class NameWhat { + final String name; + final String namewhat; + NameWhat(String name, String namewhat) { + this.name = name; + this.namewhat = namewhat; + } + } + + // Return the name info if found, or null if no useful information could be found. + static NameWhat getfuncname(DebugLib.CallFrame frame) { if (!frame.f.isclosure()) - return new LuaString[] { frame.f.strvalue(), JAVA }; + return new NameWhat(frame.f.classnamestub(), "Java"); Prototype p = frame.f.checkclosure().p; int pc = frame.pc; int i = p.code[pc]; /* calling instruction */ @@ -760,7 +743,7 @@ public class DebugLib extends OneArgFunction { case Lua.OP_TAILCALL: /* get function name */ return getobjname(p, pc, Lua.GETARG_A(i)); case Lua.OP_TFORCALL: /* for iterator */ - return new LuaString[] { FOR_ITERATOR, FOR_ITERATOR}; + return new NameWhat("(for iterator)", "(for iterator"); /* all other instructions can call only through metamethods */ case Lua.OP_SELF: case Lua.OP_GETTABUP: @@ -782,15 +765,15 @@ public class DebugLib extends OneArgFunction { default: return null; /* else no useful name can be found */ } - return new LuaString[] { tm, METAMETHOD }; + return new NameWhat( tm.tojstring(), "metamethod" ); } - // return StrValue[] { name, namewhat } if found, null if not - public static LuaString[] getobjname(Prototype p, int lastpc, int reg) { + // return NameWhat if found, null if not + public static NameWhat getobjname(Prototype p, int lastpc, int reg) { int pc = lastpc; // currentpc(L, ci); LuaString name = p.getlocalname(reg + 1, pc); if (name != null) /* is a local? */ - return new LuaString[] { name, LOCAL }; + return new NameWhat( name.tojstring(), "local" ); /* else try symbolic execution */ pc = findsetreg(p, lastpc, reg); @@ -812,12 +795,12 @@ public class DebugLib extends OneArgFunction { ? p.getlocalname(t + 1, pc) : (t < p.upvalues.length ? p.upvalues[t].name : QMARK); name = kname(p, k); - return new LuaString[] { name, vn != null && vn.eq_b(ENV)? GLOBAL: FIELD }; + return new NameWhat( name.tojstring(), vn != null && vn.eq_b(ENV)? "global": "field" ); } case Lua.OP_GETUPVAL: { int u = Lua.GETARG_B(i); /* upvalue index */ name = u < p.upvalues.length ? p.upvalues[u].name : QMARK; - return new LuaString[] { name, UPVALUE }; + return new NameWhat( name.tojstring(), "upvalue" ); } case Lua.OP_LOADK: case Lua.OP_LOADKX: { @@ -825,14 +808,14 @@ public class DebugLib extends OneArgFunction { : Lua.GETARG_Ax(p.code[pc + 1]); if (p.k[b].isstring()) { name = p.k[b].strvalue(); - return new LuaString[] { name, CONSTANT }; + return new NameWhat( name.tojstring(), "constant" ); } break; } case Lua.OP_SELF: { int k = Lua.GETARG_C(i); /* key index */ name = kname(p, k); - return new LuaString[] { name, METHOD }; + return new NameWhat( name.tojstring(), "method" ); } default: break; diff --git a/test/lua/debuglib.lua b/test/lua/debuglib.lua index c8463245..11894486 100644 --- a/test/lua/debuglib.lua +++ b/test/lua/debuglib.lua @@ -150,12 +150,6 @@ function test() printinfo( 'debug.getinfo(2,"fL")', debug.getinfo(2, "fL") ) printinfo( 'debug.getinfo(10,"")', pcall( debug.getinfo, 10, "" ) ) printinfo( 'debug.getinfo(-10,"")', pcall( debug.getinfo, -10, "" ) ) - --[[ - for i=1,3 do - printinfo( 'debug.traceback("msg")', debug.traceback('msg') ) - printinfo( 'debug.traceback("another",'..i..')', debug.traceback('another',i) ) - end - --]] print( '---' ) return x end @@ -216,6 +210,36 @@ tryhooks("r") tryhooks("l") tryhooks("crl") +print( '----- debug.traceback' ) +function test() + function a(msg) + print((string.gsub(debug.traceback(msg), "%[Java]", "[C]"))) + end + local function b(msg) + pcall(a,msg) + end + c = function(i) + if i <= 0 then b('hi') return end + return c(i-1) + end + d = setmetatable({},{__index=function(t,k) v = c(k) return v end}) + local e = function() + return d[0] + end + local f = { + g = function() + e() + end + } + h = function() + f.g() + end + local i = h + i() +end +pcall(test) + + print( '----- debug.upvalueid' ) local x,y = 100,200 function a(b,c) diff --git a/test/lua/luaj3.0-tests.zip b/test/lua/luaj3.0-tests.zip index 50515d1ccf65534dd855f583f967a6869076e9bd..bfea528a095cac913b1dba0ea42632cb49d14ec6 100644 GIT binary patch delta 14618 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