Forráskód Böngészése

more precise debug information about local variables

Roberto Ierusalimschy 26 éve
szülő
commit
1f4e2ba7b2
1 módosított fájl, 16 hozzáadás és 4 törlés
  1. 16 4
      lparser.c

+ 16 - 4
lparser.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lparser.c,v 1.28 1999/03/10 14:09:45 roberto Exp roberto $
+** $Id: lparser.c,v 1.29 1999/03/11 19:00:12 roberto Exp roberto $
 ** LL(1) Parser and code generator for Lua
 ** See Copyright Notice in lua.h
 */
@@ -315,6 +315,16 @@ static void add_localvar (LexState *ls, TaggedString *name) {
 }
 
 
+static void correctvarlines (LexState *ls, int nvars) {
+  FuncState *fs = ls->fs;
+  if (fs->nvars != -1) {  /* debug information? */
+    for (; nvars; nvars--) { /* correct line information */
+      fs->f->locvars[fs->nvars-nvars].line = fs->lastsetline; 
+    }
+  }
+}
+
+
 static int aux_localname (FuncState *fs, TaggedString *n) {
   int i;
   for (i=fs->nlocalvar-1; i >= 0; i--)
@@ -652,6 +662,7 @@ TProtoFunc *luaY_parser (ZIO *z) {
   init_state(&lexstate, &funcstate, luaS_new(zname(z)));
   next(&lexstate);  /* read first token */
   chunk(&lexstate);
+  check_debugline(&lexstate);
   if (lexstate.token != EOS)
     luaX_error(&lexstate, "<eof> expected");
   close_func(&lexstate);
@@ -743,7 +754,8 @@ static int stat (LexState *ls) {
       next(ls);
       nvars = localnamelist(ls);
       decinit(ls, &d);
-      ls->fs->nlocalvar += nvars;
+      fs->nlocalvar += nvars;
+      correctvarlines(ls, nvars);  /* vars will be alive only after decinit */
       adjust_mult_assign(ls, nvars, &d);
       return 1;
     }
@@ -799,7 +811,7 @@ static void block (LexState *ls) {
   chunk(ls);
   adjuststack(ls, fs->nlocalvar - nlocalvar);
   for (; fs->nlocalvar > nlocalvar; fs->nlocalvar--)
-    luaI_unregisterlocalvar(fs, ls->linenumber);
+    luaI_unregisterlocalvar(fs, fs->lastsetline);
 }
 
 static int funcname (LexState *ls, vardesc *v) {
@@ -855,9 +867,9 @@ static void ifpart (LexState *ls, int line) {
 
 static void ret (LexState *ls) {
   /* ret -> [RETURN explist sc] */
-  check_debugline(ls);
   if (optional(ls, RETURN)) {
     listdesc e;
+    check_debugline(ls);
     explist(ls, &e); 
     if (e.pc > 0) {  /* expression is an open function call? */
       Byte *code = ls->fs->f->code;