runtime: make stringNext use byteindex only, fix index offset

Use stringIterator.byteindex as the loop index, and remove
stringIterator.rangeindex, as "the index of the loop is the starting
position of the current rune, measured in bytes".  This patch also fixes
the current loop index returned by stringNext, using `it.byteindex'
before - not after - `length' is added.
This commit is contained in:
Michael Teichgraeber
2019-01-27 00:08:23 +01:00
parent 9092dbcc53
commit 7461c298dd
3 changed files with 23 additions and 4 deletions
+3 -4
View File
@@ -14,8 +14,7 @@ type _string struct {
// The iterator state for a range over a string.
type stringIterator struct {
byteindex uintptr
rangeindex uintptr
byteindex uintptr
}
// Return true iff the strings match.
@@ -105,10 +104,10 @@ func stringNext(s string, it *stringIterator) (bool, int, rune) {
if len(s) <= int(it.byteindex) {
return false, 0, 0
}
i := int(it.byteindex)
r, length := decodeUTF8(s, it.byteindex)
it.byteindex += length
it.rangeindex += 1
return true, int(it.rangeindex), r
return true, i, r
}
// Convert a Unicode code point into an array of bytes and its length.