aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-03-23 16:58:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-03-23 16:58:37 -0300
commit1f4e2ba7b29628dad7d98030c8432ca7265a85c9 (patch)
treef8e6cca35129f2a6a2b383ddf0c0436efecec945
parentd6ff06751af3e52ae1e0e1697021fe884f104fc8 (diff)
downloadlua-1f4e2ba7b29628dad7d98030c8432ca7265a85c9.tar.gz
lua-1f4e2ba7b29628dad7d98030c8432ca7265a85c9.tar.bz2
lua-1f4e2ba7b29628dad7d98030c8432ca7265a85c9.zip
more precise debug information about local variables
-rw-r--r--lparser.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/lparser.c b/lparser.c
index 8f3f7efb..6e95738c 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.28 1999/03/10 14:09:45 roberto Exp roberto $ 2** $Id: lparser.c,v 1.29 1999/03/11 19:00:12 roberto Exp roberto $
3** LL(1) Parser and code generator for Lua 3** LL(1) Parser and code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -315,6 +315,16 @@ static void add_localvar (LexState *ls, TaggedString *name) {
315} 315}
316 316
317 317
318static void correctvarlines (LexState *ls, int nvars) {
319 FuncState *fs = ls->fs;
320 if (fs->nvars != -1) { /* debug information? */
321 for (; nvars; nvars--) { /* correct line information */
322 fs->f->locvars[fs->nvars-nvars].line = fs->lastsetline;
323 }
324 }
325}
326
327
318static int aux_localname (FuncState *fs, TaggedString *n) { 328static int aux_localname (FuncState *fs, TaggedString *n) {
319 int i; 329 int i;
320 for (i=fs->nlocalvar-1; i >= 0; i--) 330 for (i=fs->nlocalvar-1; i >= 0; i--)
@@ -652,6 +662,7 @@ TProtoFunc *luaY_parser (ZIO *z) {
652 init_state(&lexstate, &funcstate, luaS_new(zname(z))); 662 init_state(&lexstate, &funcstate, luaS_new(zname(z)));
653 next(&lexstate); /* read first token */ 663 next(&lexstate); /* read first token */
654 chunk(&lexstate); 664 chunk(&lexstate);
665 check_debugline(&lexstate);
655 if (lexstate.token != EOS) 666 if (lexstate.token != EOS)
656 luaX_error(&lexstate, "<eof> expected"); 667 luaX_error(&lexstate, "<eof> expected");
657 close_func(&lexstate); 668 close_func(&lexstate);
@@ -743,7 +754,8 @@ static int stat (LexState *ls) {
743 next(ls); 754 next(ls);
744 nvars = localnamelist(ls); 755 nvars = localnamelist(ls);
745 decinit(ls, &d); 756 decinit(ls, &d);
746 ls->fs->nlocalvar += nvars; 757 fs->nlocalvar += nvars;
758 correctvarlines(ls, nvars); /* vars will be alive only after decinit */
747 adjust_mult_assign(ls, nvars, &d); 759 adjust_mult_assign(ls, nvars, &d);
748 return 1; 760 return 1;
749 } 761 }
@@ -799,7 +811,7 @@ static void block (LexState *ls) {
799 chunk(ls); 811 chunk(ls);
800 adjuststack(ls, fs->nlocalvar - nlocalvar); 812 adjuststack(ls, fs->nlocalvar - nlocalvar);
801 for (; fs->nlocalvar > nlocalvar; fs->nlocalvar--) 813 for (; fs->nlocalvar > nlocalvar; fs->nlocalvar--)
802 luaI_unregisterlocalvar(fs, ls->linenumber); 814 luaI_unregisterlocalvar(fs, fs->lastsetline);
803} 815}
804 816
805static int funcname (LexState *ls, vardesc *v) { 817static int funcname (LexState *ls, vardesc *v) {
@@ -855,9 +867,9 @@ static void ifpart (LexState *ls, int line) {
855 867
856static void ret (LexState *ls) { 868static void ret (LexState *ls) {
857 /* ret -> [RETURN explist sc] */ 869 /* ret -> [RETURN explist sc] */
858 check_debugline(ls);
859 if (optional(ls, RETURN)) { 870 if (optional(ls, RETURN)) {
860 listdesc e; 871 listdesc e;
872 check_debugline(ls);
861 explist(ls, &e); 873 explist(ls, &e);
862 if (e.pc > 0) { /* expression is an open function call? */ 874 if (e.pc > 0) { /* expression is an open function call? */
863 Byte *code = ls->fs->f->code; 875 Byte *code = ls->fs->f->code;