diff --git a/src/core/org/luaj/vm2/lib/DebugLib.java b/src/core/org/luaj/vm2/lib/DebugLib.java index fd7c4c3c..5bb9fb6a 100644 --- a/src/core/org/luaj/vm2/lib/DebugLib.java +++ b/src/core/org/luaj/vm2/lib/DebugLib.java @@ -796,8 +796,8 @@ public class DebugLib extends TwoArgFunction { LuaString vn = (Lua.GET_OPCODE(i) == Lua.OP_GETTABLE) /* name of indexed variable */ ? p.getlocalname(t + 1, pc) : (t < p.upvalues.length ? p.upvalues[t].name : QMARK); - name = kname(p, k); - return new NameWhat( name.tojstring(), vn != null && vn.eq_b(ENV)? "global": "field" ); + String jname = kname(p, pc, k); + return new NameWhat( jname, vn != null && vn.eq_b(ENV)? "global": "field" ); } case Lua.OP_GETUPVAL: { int u = Lua.GETARG_B(i); /* upvalue index */ @@ -816,8 +816,8 @@ public class DebugLib extends TwoArgFunction { } case Lua.OP_SELF: { int k = Lua.GETARG_C(i); /* key index */ - name = kname(p, k); - return new NameWhat( name.tojstring(), "method" ); + String jname = kname(p, pc, k); + return new NameWhat( jname, "method" ); } default: break; @@ -826,11 +826,20 @@ public class DebugLib extends TwoArgFunction { return null; /* no useful name found */ } - static LuaString kname(Prototype p, int c) { - if (Lua.ISK(c) && p.k[Lua.INDEXK(c)].isstring()) - return p.k[Lua.INDEXK(c)].strvalue(); - else - return QMARK; + static String kname(Prototype p, int pc, int c) { + if (Lua.ISK(c)) { /* is 'c' a constant? */ + LuaValue k = p.k[Lua.INDEXK(c)]; + if (k.isstring()) { /* literal constant? */ + return k.tojstring(); /* it is its own name */ + } /* else no reasonable name found */ + } else { /* 'c' is a register */ + NameWhat what = getobjname(p, pc, c); /* search for 'c' */ + if (what != null && "constant".equals(what.namewhat)) { /* found a constant name? */ + return what.name; /* 'name' already filled */ + } + /* else no reasonable name found */ + } + return "?"; /* no reasonable name found */ } /*