diff options
Diffstat (limited to 'src/unicode/utf16/utf16.go')
| -rw-r--r-- | src/unicode/utf16/utf16.go | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/unicode/utf16/utf16.go b/src/unicode/utf16/utf16.go index 38d8be6060..1c6d2c66c3 100644 --- a/src/unicode/utf16/utf16.go +++ b/src/unicode/utf16/utf16.go @@ -103,23 +103,31 @@ func AppendRune(a []uint16, r rune) []uint16 { // Decode returns the Unicode code point sequence represented // by the UTF-16 encoding s. func Decode(s []uint16) []rune { - a := make([]rune, len(s)) - n := 0 + // Preallocate capacity to hold up to 64 runes. + // Decode inlines, so the allocation can live on the stack. + buf := make([]rune, 0, 64) + return decode(s, buf) +} + +// decode appends to buf the Unicode code point sequence represented +// by the UTF-16 encoding s and return the extended buffer. +func decode(s []uint16, buf []rune) []rune { for i := 0; i < len(s); i++ { + var ar rune switch r := s[i]; { case r < surr1, surr3 <= r: // normal rune - a[n] = rune(r) + ar = rune(r) case surr1 <= r && r < surr2 && i+1 < len(s) && surr2 <= s[i+1] && s[i+1] < surr3: // valid surrogate sequence - a[n] = DecodeRune(rune(r), rune(s[i+1])) + ar = DecodeRune(rune(r), rune(s[i+1])) i++ default: // invalid surrogate sequence - a[n] = replacementChar + ar = replacementChar } - n++ + buf = append(buf, ar) } - return a[:n] + return buf } |
