Index: sdk/lib/convert/utf.dart |
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart |
index 819013913540a3e403d1cfee98bb9c78ec03419c..5b281934ff93aad9b8d19af940fafc7421f9ea77 100644 |
--- a/sdk/lib/convert/utf.dart |
+++ b/sdk/lib/convert/utf.dart |
@@ -420,10 +420,24 @@ class _Utf8Decoder { |
int value = _value; |
int expectedUnits = _expectedUnits; |
int extraUnits = _extraUnits; |
+ int singleBytesCount = 0; |
_value = 0; |
_expectedUnits = 0; |
_extraUnits = 0; |
+ void addSingleBytes(int from, int to) { |
+ assert(singleBytesCount > 0); |
+ assert(from >= startIndex && from <= endIndex); |
+ assert(to >= startIndex && to <= endIndex); |
+ if (from == 0 && to == codeUnits.length) { |
+ _stringSink.write(new String.fromCharCodes(codeUnits)); |
+ } else { |
+ _stringSink.write( |
+ new String.fromCharCodes(codeUnits.sublist(from, to))); |
+ } |
+ singleBytesCount = 0; |
+ } |
+ |
int i = startIndex; |
loop: while (true) { |
multibyte: if (expectedUnits > 0) { |
@@ -479,6 +493,10 @@ class _Utf8Decoder { |
// https://codereview.chromium.org/22929022/diff/1/sdk/lib/convert/utf.dart?column_width=80 |
if (unit < 0) { |
// TODO(floitsch): should this be unit <= 0 ? |
+ if (singleBytesCount > 0) { |
+ int to = i - 1; |
+ addSingleBytes(to - singleBytesCount, to); |
+ } |
if (!_allowMalformed) { |
throw new FormatException( |
"Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}"); |
@@ -486,8 +504,12 @@ class _Utf8Decoder { |
_stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE); |
} else if (unit <= _ONE_BYTE_LIMIT) { |
_isFirstCharacter = false; |
- _stringSink.writeCharCode(unit); |
+ singleBytesCount++; |
} else { |
+ if (singleBytesCount > 0) { |
+ int to = i - 1; |
+ addSingleBytes(to - singleBytesCount, to); |
+ } |
if ((unit & 0xE0) == 0xC0) { |
value = unit & 0x1F; |
expectedUnits = extraUnits = 1; |
@@ -516,6 +538,9 @@ class _Utf8Decoder { |
} |
break loop; |
} |
+ if (singleBytesCount > 0) { |
+ addSingleBytes(i - singleBytesCount, endIndex); |
+ } |
if (expectedUnits > 0) { |
_value = value; |
_expectedUnits = expectedUnits; |