From 2e3363ef7d1492bf8644b7cad89e500c3fc3251b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 31 Aug 2008 19:50:47 +0000 Subject: 25571: when parsing use line numbers for the start of a token, not the end add test and move debug trap tests to new file --- ChangeLog | 7 ++++ Src/lex.c | 15 +++++++ Src/parse.c | 2 +- Test/.distfiles | 1 + Test/C03traps.ztst | 88 ----------------------------------------- Test/C05debug.ztst | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 138 insertions(+), 89 deletions(-) create mode 100644 Test/C05debug.ztst diff --git a/ChangeLog b/ChangeLog index 44d897154..05a2e57e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-08-31 Peter Stephenson + + * 25571: Src/lex.c, Src/parse.c, Test/.distfiles, + Test/C03traps.ztst, Test/C05debug.ztst: make line numbers when + parsing reflect the start of a parsed token rather than the end; + add a test and move debug trap tests to a separate file. + 2008-08-31 Clint Adams * Frank Terbeck: 25561: Completion/Unix/Command/_git: fix quoting diff --git a/Src/lex.c b/Src/lex.c index 739a6f391..025387ca1 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -46,6 +46,17 @@ mod_export int tok; /**/ mod_export int tokfd; +/* + * Line number at which the first character of a token was found. + * We always set this in gettok(), which is always called from + * yylex() unless we have reached an error. So it is always + * valid when parsing. It is not useful during execution + * of the parsed structure. + */ + +/**/ +zlong toklineno; + /* lexical analyzer error flag */ /**/ @@ -211,6 +222,7 @@ struct lexstack { unsigned char *cstack; int csp; + zlong toklineno; }; static struct lexstack *lstack = NULL; @@ -269,6 +281,7 @@ lexsave(void) ls->ecsoffs = ecsoffs; ls->ecssub = ecssub; ls->ecnfunc = ecnfunc; + ls->toklineno = toklineno; cmdsp = 0; inredir = 0; hdocs = NULL; @@ -333,6 +346,7 @@ lexrestore(void) ecssub = lstack->ecssub; ecnfunc = lstack->ecnfunc; hlinesz = lstack->hlinesz; + toklineno = lstack->toklineno; errflag = 0; ln = lstack->next; @@ -661,6 +675,7 @@ gettok(void) beginning: tokstr = NULL; while (iblank(c = hgetc()) && !lexstop); + toklineno = lineno; if (lexstop) return (errflag) ? LEXERR : ENDINPUT; isfirstln = 0; diff --git a/Src/parse.c b/Src/parse.c index a455b591e..295b4922f 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -721,7 +721,7 @@ static int par_pline(int *complex) { int p; - zlong line = lineno; + zlong line = toklineno; p = ecadd(0); diff --git a/Test/.distfiles b/Test/.distfiles index 740e36d96..6b72d8965 100644 --- a/Test/.distfiles +++ b/Test/.distfiles @@ -17,6 +17,7 @@ C01arith.ztst C02cond.ztst C03traps.ztst C04funcdef.ztst +C05debug.ztst D01prompt.ztst D02glob.ztst D03procsubst.ztst diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst index f0bfd296a..7c4501413 100644 --- a/Test/C03traps.ztst +++ b/Test/C03traps.ztst @@ -350,94 +350,6 @@ >trap >Working 0 - unsetopt DEBUG_BEFORE_CMD - debug-trap-bug1() { - setopt localtraps - print "print bug file here" >bug-file - print "print this is line one - print this is line two - print this is line three - print and this is line fifty-nine." >bug-file2 - function debug_trap_handler { - print $functrace[1] - do_bug - } - function do_bug { - . ./bug-file - } - trap 'echo EXIT hit' EXIT - trap 'debug_trap_handler' DEBUG - . ./bug-file2 - } - debug-trap-bug1 -0: Relationship between traps and sources ->debug-trap-bug1:15 ->bug file here ->this is line one ->./bug-file2:1 ->bug file here ->this is line two ->./bug-file2:2 ->bug file here ->this is line three ->./bug-file2:3 ->bug file here ->and this is line fifty-nine. ->./bug-file2:4 ->bug file here ->debug-trap-bug1:16 ->bug file here ->EXIT hit - - cat >zsh-trapreturn-bug2 <<-'HERE' - cmd='./fdasfsdafd' - [[ -x $cmd ]] && rm $cmd - set -o DEBUG_BEFORE_CMD - trap '[[ $? -ne 0 ]] && exit 0' DEBUG - $cmd # invalid command - # Failure - exit 10 - HERE - $ZTST_testdir/../Src/zsh -f ./zsh-trapreturn-bug2 -0: trapreturn handling bug is properly fixed -?./zsh-trapreturn-bug2:5: no such file or directory: ./fdasfsdafd - - fn() { - setopt localtraps localoptions debugbeforecmd - trap '(( LINENO == 4 )) && setopt errexit' DEBUG - print $LINENO three - print $LINENO four - print $LINENO five - [[ -o errexit ]] && print "Hey, ERREXIT is set!" - } - fn -1:Skip line from DEBUG trap ->3 three ->5 five - - # Assignments are a special case, since they use a simpler - # wordcode type, so we need to test skipping them separately. - fn() { - setopt localtraps localoptions debugbeforecmd - trap '(( LINENO == 4 )) && setopt errexit' DEBUG - x=three - x=four - print $LINENO $x - [[ -o errexit ]] && print "Hey, ERREXIT is set!" - } - fn -1:Skip assignment from DEBUG trap ->5 three - - fn() { - setopt localtraps localoptions debugbeforecmd - trap 'print $LINENO' DEBUG - [[ a = a ]] && print a is ok - } - fn -0:line numbers of complex sublists ->3 ->a is ok %clean diff --git a/Test/C05debug.ztst b/Test/C05debug.ztst new file mode 100644 index 000000000..a6ef54bb4 --- /dev/null +++ b/Test/C05debug.ztst @@ -0,0 +1,114 @@ +%prep + + setopt localtraps + +%test + + unsetopt DEBUG_BEFORE_CMD + debug-trap-bug1() { + setopt localtraps + print "print bug file here" >bug-file + print "print this is line one + print this is line two + print this is line three + print and this is line fifty-nine." >bug-file2 + function debug_trap_handler { + print $functrace[1] + do_bug + } + function do_bug { + . ./bug-file + } + trap 'echo EXIT hit' EXIT + trap 'debug_trap_handler' DEBUG + . ./bug-file2 + } + debug-trap-bug1 +0: Relationship between traps and sources +>debug-trap-bug1:15 +>bug file here +>this is line one +>./bug-file2:1 +>bug file here +>this is line two +>./bug-file2:2 +>bug file here +>this is line three +>./bug-file2:3 +>bug file here +>and this is line fifty-nine. +>./bug-file2:4 +>bug file here +>debug-trap-bug1:16 +>bug file here +>EXIT hit + + cat >zsh-trapreturn-bug2 <<-'HERE' + cmd='./fdasfsdafd' + [[ -x $cmd ]] && rm $cmd + set -o DEBUG_BEFORE_CMD + trap '[[ $? -ne 0 ]] && exit 0' DEBUG + $cmd # invalid command + # Failure + exit 10 + HERE + $ZTST_testdir/../Src/zsh -f ./zsh-trapreturn-bug2 +0: trapreturn handling bug is properly fixed +?./zsh-trapreturn-bug2:5: no such file or directory: ./fdasfsdafd + + fn() { + setopt localtraps localoptions debugbeforecmd + trap '(( LINENO == 4 )) && setopt errexit' DEBUG + print $LINENO three + print $LINENO four + print $LINENO five + [[ -o errexit ]] && print "Hey, ERREXIT is set!" + } + fn +1:Skip line from DEBUG trap +>3 three +>5 five + + # Assignments are a special case, since they use a simpler + # wordcode type, so we need to test skipping them separately. + fn() { + setopt localtraps localoptions debugbeforecmd + trap '(( LINENO == 4 )) && setopt errexit' DEBUG + x=three + x=four + print $LINENO $x + [[ -o errexit ]] && print "Hey, ERREXIT is set!" + } + fn +1:Skip assignment from DEBUG trap +>5 three + + fn() { + setopt localtraps localoptions debugbeforecmd + trap 'print $LINENO' DEBUG + [[ a = a ]] && print a is ok + } + fn +0:line numbers of complex sublists +>3 +>a is ok + + fn() { + setopt localtraps localoptions debugbeforecmd + trap 'print $LINENO' DEBUG + print before + x=' first + second + third' + print $x + } + fn +0:line numbers of multiline assignments +>3 +>before +>4 +>7 +> first +> second +> third + -- cgit 1.4.1