diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2016-11-29 12:31:33 -0800 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2016-11-29 12:31:33 -0800 |
commit | a9fe87e18cbe37d938fb1a02f71f8f905141e0f4 (patch) | |
tree | 5dc639bb9f74fa915362366c4c08ed50f332e083 | |
parent | 596ba302e6f23089e58ff05d75fedfca8e79a7d2 (diff) | |
download | zsh-a9fe87e18cbe37d938fb1a02f71f8f905141e0f4.tar.gz zsh-a9fe87e18cbe37d938fb1a02f71f8f905141e0f4.tar.xz zsh-a9fe87e18cbe37d938fb1a02f71f8f905141e0f4.zip |
40032: consistency in handling of subscript slices outside the bounds of an array parameter
unposted: README: example describing 40032
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | README | 39 | ||||
-rw-r--r-- | Src/params.c | 11 |
3 files changed, 55 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 27c35849a..6ed44eb4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2016-11-29 Barton E. Schaefer <schaefer@brasslantern.com> + + * unposted: README: example describing 40032 + + * 40032: Src/params.c: consistency in handling of subscript + slices outside the bounds of an array parameter + 2016-11-29 Peter Stephenson <p.stephenson@samsung.com> * 40037: Joshua Rubin: Unicode 9 character width support. diff --git a/README b/README index 568f1ad6c..eed8e4d5b 100644 --- a/README +++ b/README @@ -121,6 +121,45 @@ Previously, only "typeset" commands were output, never using "-g". <Tab> would be accepted to mean [Y]. Now <Space> and <Tab> are invalid choices: typing either of them remains at the prompt. +9) The $ary[i,j] subscript syntax to take a slice of an array behaves +differently when both i and j are larger than the number of elements in +the array. When i == j, such a slice always yields an empty array, and +when i < j it always yields an array of one empty string element. The +following example illustrates how this differs from past versions. + + nargs() { print $# } + a=(one two) + for i in 1 2 3 4; do + for j in 1 2 3 4 5; do + print -n "$i $j => " + nargs "${(@)a[i,j]}" + done + done + + 5.2 | 5.3 ** + ----------+---------- + 1 1 => 1 | 1 1 => 1 + 1 2 => 2 | 1 2 => 2 + 1 3 => 2 | 1 3 => 2 + 1 4 => 2 | 1 4 => 2 + 1 5 => 2 | 1 5 => 2 + 2 1 => 0 | 2 1 => 0 + 2 2 => 1 | 2 2 => 1 + 2 3 => 1 | 2 3 => 1 + 2 4 => 1 | 2 4 => 1 + 2 5 => 1 | 2 5 => 1 + 3 1 => 0 | 3 1 => 0 + 3 2 => 0 | 3 2 => 0 + 3 3 => 0 | 3 3 => 0 + 3 4 => 0 | 3 4 => 1 ** + 3 5 => 0 | 3 5 => 1 ** + 4 1 => 0 | 4 1 => 0 + 4 2 => 0 | 4 2 => 0 + 4 3 => 0 | 4 3 => 0 + 4 4 => 1 | 4 4 => 0 ** + 4 5 => 1 | 4 5 => 1 + + Incompatibilities between 5.0.8 and 5.2 --------------------------------------- diff --git a/Src/params.c b/Src/params.c index 45f398a27..aa8b196bd 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2299,9 +2299,16 @@ getarrvalue(Value v) if (v->end <= v->start) { s = arrdup_max(nular, 0); } - else if (arrlen_lt(s, v->start) || v->start < 0) { + else if (v->start < 0) { s = arrdup_max(nular, 1); - } else { + } + else if (arrlen_le(s, v->start)) { + /* Handle $ary[i,i] consistently for any $i > $#ary + * and $ary[i,j] consistently for any $j > $i > $#ary + */ + s = arrdup_max(nular, v->end - (v->start + 1)); + } + else { /* Copy to a point before the end of the source array: * arrdup_max will copy at most v->end - v->start elements, * starting from v->start element. Original code said: |