| Index: sdk/lib/convert/utf.dart
|
| diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
|
| index 0687bb145b18f9c2d44f43ef8383435b3e2fdada..6b9feceaa7b9e703ca77fc6cf3cee6a967597ee1 100644
|
| --- a/sdk/lib/convert/utf.dart
|
| +++ b/sdk/lib/convert/utf.dart
|
| @@ -347,7 +347,7 @@ class Utf8Decoder extends Converter<List<int>, String>
|
| StringBuffer buffer = new StringBuffer();
|
| _Utf8Decoder decoder = new _Utf8Decoder(buffer, _allowMalformed);
|
| decoder.convert(codeUnits, start, end);
|
| - decoder.close();
|
| + decoder.flush(codeUnits, end);
|
| return buffer.toString();
|
| }
|
|
|
| @@ -431,11 +431,15 @@ class _Utf8Decoder {
|
| *
|
| * This method throws if the input was partial and the decoder was
|
| * constructed with `allowMalformed` set to `false`.
|
| + *
|
| + * The [source] and [offset] of the current position may be provided,
|
| + * and are included in the exception if one is thrown.
|
| */
|
| - void flush() {
|
| + void flush([List<int> source, int offset]) {
|
| if (hasPartialInput) {
|
| if (!_allowMalformed) {
|
| - throw new FormatException("Unfinished UTF-8 octet sequence");
|
| + throw new FormatException("Unfinished UTF-8 octet sequence",
|
| + source, offset);
|
| }
|
| _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
|
| _value = 0;
|
| @@ -480,7 +484,8 @@ class _Utf8Decoder {
|
| expectedUnits = 0;
|
| if (!_allowMalformed) {
|
| throw new FormatException(
|
| - "Bad UTF-8 encoding 0x${unit.toRadixString(16)}");
|
| + "Bad UTF-8 encoding 0x${unit.toRadixString(16)}",
|
| + codeUnits, i);
|
| }
|
| _isFirstCharacter = false;
|
| _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
|
| @@ -496,7 +501,8 @@ class _Utf8Decoder {
|
| // encoding.
|
| if (!_allowMalformed) {
|
| throw new FormatException(
|
| - "Overlong encoding of 0x${value.toRadixString(16)}");
|
| + "Overlong encoding of 0x${value.toRadixString(16)}",
|
| + codeUnits, i - extraUnits - 1);
|
| }
|
| expectedUnits = extraUnits = 0;
|
| value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
|
| @@ -504,7 +510,8 @@ class _Utf8Decoder {
|
| if (value > _FOUR_BYTE_LIMIT) {
|
| if (!_allowMalformed) {
|
| throw new FormatException("Character outside valid Unicode range: "
|
| - "0x${value.toRadixString(16)}");
|
| + "0x${value.toRadixString(16)}",
|
| + codeUnits, i - extraUnits - 1);
|
| }
|
| value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
|
| }
|
| @@ -532,7 +539,8 @@ class _Utf8Decoder {
|
| // TODO(floitsch): should this be unit <= 0 ?
|
| if (!_allowMalformed) {
|
| throw new FormatException(
|
| - "Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}");
|
| + "Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}",
|
| + codeUnits, i - 1);
|
| }
|
| _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
|
| } else {
|
| @@ -555,7 +563,8 @@ class _Utf8Decoder {
|
| }
|
| if (!_allowMalformed) {
|
| throw new FormatException(
|
| - "Bad UTF-8 encoding 0x${unit.toRadixString(16)}");
|
| + "Bad UTF-8 encoding 0x${unit.toRadixString(16)}",
|
| + codeUnits, i - 1);
|
| }
|
| value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
|
| expectedUnits = extraUnits = 0;
|
|
|