| 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;
|
|
|