unicode/norm: bug fix in Iter
i.p is overwritten by setDone, so must be saved before
calling it.
Fixes golang/go#20710
Change-Id: I5744687c11f0c1101712bb5aa290ebe009ff6d05
Reviewed-on: https://go-review.googlesource.com/c/145559
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ross Light <light@google.com>
diff --git a/unicode/norm/iter.go b/unicode/norm/iter.go
index ce17f96..417c6b2 100644
--- a/unicode/norm/iter.go
+++ b/unicode/norm/iter.go
@@ -128,8 +128,9 @@
func nextASCIIBytes(i *Iter) []byte {
p := i.p + 1
if p >= i.rb.nsrc {
+ p0 := i.p
i.setDone()
- return i.rb.src.bytes[i.p:p]
+ return i.rb.src.bytes[p0:p]
}
if i.rb.src.bytes[p] < utf8.RuneSelf {
p0 := i.p
diff --git a/unicode/norm/iter_test.go b/unicode/norm/iter_test.go
index d95aa30..5a8fdab 100644
--- a/unicode/norm/iter_test.go
+++ b/unicode/norm/iter_test.go
@@ -9,7 +9,7 @@
"testing"
)
-func doIterNorm(f Form, s string) []byte {
+func doIterNormString(f Form, s string) []byte {
acc := []byte{}
i := Iter{}
i.InitString(f, s)
@@ -19,8 +19,21 @@
return acc
}
+func doIterNorm(f Form, s string) []byte {
+ acc := []byte{}
+ i := Iter{}
+ i.Init(f, []byte(s))
+ for !i.Done() {
+ acc = append(acc, i.Next()...)
+ }
+ return acc
+}
+
func TestIterNext(t *testing.T) {
runNormTests(t, "IterNext", func(f Form, out []byte, s string) []byte {
+ return doIterNormString(f, string(append(out, s...)))
+ })
+ runNormTests(t, "IterNext", func(f Form, out []byte, s string) []byte {
return doIterNorm(f, string(append(out, s...)))
})
}