|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: ldebug.c,v 2.121 2016/10/19 12:32:10 roberto Exp roberto $
|
|
|
+** $Id: ldebug.c,v 2.122 2017/04/26 17:46:52 roberto Exp roberto $
|
|
|
** Debug Interface
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -350,28 +350,36 @@ static const char *getobjname (Proto *p, int lastpc, int reg,
|
|
|
|
|
|
|
|
|
/*
|
|
|
-** find a "name" for the RK value 'c'
|
|
|
+** Find a "name" for the constant 'c'.
|
|
|
*/
|
|
|
-static void kname (Proto *p, int pc, int c, const char **name) {
|
|
|
- if (ISK(c)) { /* is 'c' a constant? */
|
|
|
- TValue *kvalue = &p->k[INDEXK(c)];
|
|
|
- if (ttisstring(kvalue)) { /* literal constant? */
|
|
|
- *name = svalue(kvalue); /* it is its own name */
|
|
|
- return;
|
|
|
- }
|
|
|
- /* else no reasonable name found */
|
|
|
- }
|
|
|
- else { /* 'c' is a register */
|
|
|
- const char *what = getobjname(p, pc, c, name); /* search for 'c' */
|
|
|
- if (what && *what == 'c') { /* found a constant name? */
|
|
|
- return; /* 'name' already filled */
|
|
|
- }
|
|
|
- /* else no reasonable name found */
|
|
|
- }
|
|
|
- *name = "?"; /* no reasonable name found */
|
|
|
+static void kname (Proto *p, int c, const char **name) {
|
|
|
+ TValue *kvalue = &p->k[INDEXK(c)];
|
|
|
+ *name = (ttisstring(kvalue)) ? svalue(kvalue) : "?";
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+** Find a "name" for the register 'c'.
|
|
|
+*/
|
|
|
+static void rname (Proto *p, int pc, int c, const char **name) {
|
|
|
+ const char *what = getobjname(p, pc, c, name); /* search for 'c' */
|
|
|
+ if (!(what && *what == 'c')) /* did not find a constant name? */
|
|
|
+ *name = "?";
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+** Find a "name" for the R/K index 'c'.
|
|
|
+*/
|
|
|
+static void rkname (Proto *p, int pc, int c, const char **name) {
|
|
|
+ if (ISK(c)) /* is 'c' a constant? */
|
|
|
+ kname(p, INDEXK(c), name);
|
|
|
+ else /* 'c' is a register */
|
|
|
+ rname(p, pc, c, name);
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
static int filterpc (int pc, int jmptarget) {
|
|
|
if (pc < jmptarget) /* is code conditional (inside a jump)? */
|
|
|
return -1; /* cannot know who sets that register */
|
|
@@ -428,8 +436,22 @@ static int findsetreg (Proto *p, int lastpc, int reg) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-static const char *getobjname (Proto *p, int lastpc, int reg,
|
|
|
- const char **name) {
|
|
|
+/*
|
|
|
+** Check whether table being indexed by instruction 'i' is the
|
|
|
+** environment '_ENV'
|
|
|
+*/
|
|
|
+static const char *gxf (Proto *p, int pc, Instruction i, int isup) {
|
|
|
+ int t = GETARG_B(i); /* table index */
|
|
|
+ const char *name; /* name of indexed variable */
|
|
|
+ if (isup) /* is an upvalue? */
|
|
|
+ name = upvalname(p, t);
|
|
|
+ else
|
|
|
+ getobjname(p, pc, t, &name);
|
|
|
+ return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field";
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ const char *getobjname (Proto *p, int lastpc, int reg, const char **name) {
|
|
|
int pc;
|
|
|
*name = luaF_getlocalname(p, reg + 1, lastpc);
|
|
|
if (*name) /* is a local? */
|
|
@@ -446,15 +468,24 @@ static const char *getobjname (Proto *p, int lastpc, int reg,
|
|
|
return getobjname(p, pc, b, name); /* get name for 'b' */
|
|
|
break;
|
|
|
}
|
|
|
- case OP_GETTABUP:
|
|
|
+ case OP_GETTABUP: {
|
|
|
+ int k = GETARG_C(i); /* key index */
|
|
|
+ kname(p, k, name);
|
|
|
+ return gxf(p, pc, i, 1);
|
|
|
+ }
|
|
|
case OP_GETTABLE: {
|
|
|
int k = GETARG_C(i); /* key index */
|
|
|
- int t = GETARG_B(i); /* table index */
|
|
|
- const char *vn = (op == OP_GETTABLE) /* name of indexed variable */
|
|
|
- ? luaF_getlocalname(p, t + 1, pc)
|
|
|
- : upvalname(p, t);
|
|
|
- kname(p, pc, k, name);
|
|
|
- return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field";
|
|
|
+ rname(p, pc, k, name);
|
|
|
+ return gxf(p, pc, i, 0);
|
|
|
+ }
|
|
|
+ case OP_GETI: {
|
|
|
+ *name = "integer index";
|
|
|
+ return "field";
|
|
|
+ }
|
|
|
+ case OP_GETFIELD: {
|
|
|
+ int k = GETARG_C(i); /* key index */
|
|
|
+ kname(p, k, name);
|
|
|
+ return gxf(p, pc, i, 0);
|
|
|
}
|
|
|
case OP_GETUPVAL: {
|
|
|
*name = upvalname(p, GETARG_B(i));
|
|
@@ -472,7 +503,7 @@ static const char *getobjname (Proto *p, int lastpc, int reg,
|
|
|
}
|
|
|
case OP_SELF: {
|
|
|
int k = GETARG_C(i); /* key index */
|
|
|
- kname(p, pc, k, name);
|
|
|
+ rkname(p, pc, k, name);
|
|
|
return "method";
|
|
|
}
|
|
|
default: break; /* go through to return NULL */
|
|
@@ -508,9 +539,10 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
|
|
|
}
|
|
|
/* other instructions can do calls through metamethods */
|
|
|
case OP_SELF: case OP_GETTABUP: case OP_GETTABLE:
|
|
|
+ case OP_GETI: case OP_GETFIELD:
|
|
|
tm = TM_INDEX;
|
|
|
break;
|
|
|
- case OP_SETTABUP: case OP_SETTABLE:
|
|
|
+ case OP_SETTABUP: case OP_SETTABLE: case OP_SETI: case OP_SETFIELD:
|
|
|
tm = TM_NEWINDEX;
|
|
|
break;
|
|
|
case OP_ADDI:
|