aboutsummaryrefslogtreecommitdiff
path: root/ldebug.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-03-12 16:14:06 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-03-12 16:14:06 -0300
commit25c557ec6367870c127e879cce8ed8fa21f34398 (patch)
tree37d322402a8163145a0f3a5728f98115402f352f /ldebug.c
parentf292760f12022a83cf01e788482a264aeeb3c276 (diff)
downloadlua-25c557ec6367870c127e879cce8ed8fa21f34398.tar.gz
lua-25c557ec6367870c127e879cce8ed8fa21f34398.tar.bz2
lua-25c557ec6367870c127e879cce8ed8fa21f34398.zip
first version of _ENV; no more global variables
Diffstat (limited to 'ldebug.c')
-rw-r--r--ldebug.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/ldebug.c b/ldebug.c
index 2e6eb698..898efe53 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.64 2010/02/26 20:40:29 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.65 2010/03/05 14:01:29 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -260,11 +260,14 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
260*/ 260*/
261 261
262 262
263static const char *kname (Proto *p, int c) { 263static void kname (Proto *p, int c, int reg, const char *what,
264 if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) 264 const char **name) {
265 return svalue(&p->k[INDEXK(c)]); 265 if (c == reg && *what == 'c')
266 return; /* index is a constant; name already correct */
267 else if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))
268 *name = svalue(&p->k[INDEXK(c)]);
266 else 269 else
267 return "?"; 270 *name = "?";
268} 271}
269 272
270 273
@@ -283,17 +286,6 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg,
283 OpCode op = GET_OPCODE(i); 286 OpCode op = GET_OPCODE(i);
284 int a = GETARG_A(i); 287 int a = GETARG_A(i);
285 switch (op) { 288 switch (op) {
286 case OP_GETGLOBAL: {
287 if (reg == a) {
288 int g = GETARG_Bx(i);
289 if (g != 0) g--;
290 else g = GETARG_Ax(p->code[++pc]);
291 lua_assert(ttisstring(&p->k[g]));
292 *name = svalue(&p->k[g]);
293 what = "global";
294 }
295 break;
296 }
297 case OP_MOVE: { 289 case OP_MOVE: {
298 if (reg == a) { 290 if (reg == a) {
299 int b = GETARG_B(i); /* move from 'b' to 'a' */ 291 int b = GETARG_B(i); /* move from 'b' to 'a' */
@@ -307,8 +299,12 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg,
307 case OP_GETTABLE: { 299 case OP_GETTABLE: {
308 if (reg == a) { 300 if (reg == a) {
309 int k = GETARG_C(i); /* key index */ 301 int k = GETARG_C(i); /* key index */
310 *name = kname(p, k); 302 int t = GETARG_B(i);
311 what = "field"; 303 const char *tabname = (op == OP_GETTABLE)
304 ? luaF_getlocalname(p, t + 1, pc)
305 : getstr(p->upvalues[t].name);
306 kname(p, k, a, what, name);
307 what = (tabname && strcmp(tabname, "_ENV") == 0) ? "global" : "field";
312 } 308 }
313 break; 309 break;
314 } 310 }
@@ -321,6 +317,17 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg,
321 } 317 }
322 break; 318 break;
323 } 319 }
320 case OP_LOADK: {
321 if (reg == a) {
322 int b = GETARG_Bx(i);
323 b = (b > 0) ? b - 1 : GETARG_Ax(p->code[pc + 1]);
324 if (ttisstring(&p->k[b])) {
325 what = "constant";
326 *name = svalue(&p->k[b]);
327 }
328 }
329 break;
330 }
324 case OP_LOADNIL: { 331 case OP_LOADNIL: {
325 int b = GETARG_B(i); /* move from 'b' to 'a' */ 332 int b = GETARG_B(i); /* move from 'b' to 'a' */
326 if (a <= reg && reg <= b) /* set registers from 'a' to 'b' */ 333 if (a <= reg && reg <= b) /* set registers from 'a' to 'b' */
@@ -330,7 +337,7 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg,
330 case OP_SELF: { 337 case OP_SELF: {
331 if (reg == a) { 338 if (reg == a) {
332 int k = GETARG_C(i); /* key index */ 339 int k = GETARG_C(i); /* key index */
333 *name = kname(p, k); 340 kname(p, k, a, what, name);
334 what = "method"; 341 what = "method";
335 } 342 }
336 break; 343 break;
@@ -378,11 +385,10 @@ static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
378 *name = "for iterator"; 385 *name = "for iterator";
379 return "for iterator"; 386 return "for iterator";
380 } 387 }
381 case OP_GETGLOBAL:
382 case OP_SELF: 388 case OP_SELF:
383 case OP_GETTABUP: 389 case OP_GETTABUP:
384 case OP_GETTABLE: tm = TM_INDEX; break; 390 case OP_GETTABLE: tm = TM_INDEX; break;
385 case OP_SETGLOBAL: 391 case OP_SETTABUP:
386 case OP_SETTABLE: tm = TM_NEWINDEX; break; 392 case OP_SETTABLE: tm = TM_NEWINDEX; break;
387 case OP_EQ: tm = TM_EQ; break; 393 case OP_EQ: tm = TM_EQ; break;
388 case OP_ADD: tm = TM_ADD; break; 394 case OP_ADD: tm = TM_ADD; break;