about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/lex.c15
-rw-r--r--Src/parse.c2
-rw-r--r--Test/.distfiles1
-rw-r--r--Test/C03traps.ztst88
-rw-r--r--Test/C05debug.ztst114
6 files changed, 138 insertions, 89 deletions
diff --git a/ChangeLog b/ChangeLog
index 44d897154..05a2e57e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-31  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 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  <clint@zsh.org>
 
 	* 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
+