| Index: tool/input_sdk/lib/convert/latin1.dart
|
| diff --git a/tool/input_sdk/lib/convert/latin1.dart b/tool/input_sdk/lib/convert/latin1.dart
|
| index 7f7fef883ca18a23d209a27193fdfea92e7ff277..1d8546d189b4b052a48c77586a97f2d3f047ad4e 100644
|
| --- a/tool/input_sdk/lib/convert/latin1.dart
|
| +++ b/tool/input_sdk/lib/convert/latin1.dart
|
| @@ -59,9 +59,9 @@ class Latin1Codec extends Encoding {
|
| }
|
| }
|
|
|
| - Converter<String, List<int>> get encoder => const Latin1Encoder();
|
| + Latin1Encoder get encoder => const Latin1Encoder();
|
|
|
| - Converter<List<int>, String> get decoder =>
|
| + Latin1Decoder get decoder =>
|
| _allowInvalid ? const Latin1Decoder(allowInvalid: true)
|
| : const Latin1Decoder(allowInvalid: false);
|
| }
|
| @@ -116,6 +116,7 @@ class _Latin1DecoderSink extends ByteConversionSinkBase {
|
|
|
| void close() {
|
| _sink.close();
|
| + _sink = null;
|
| }
|
|
|
| void add(List<int> source) {
|
| @@ -132,19 +133,40 @@ class _Latin1DecoderSink extends ByteConversionSinkBase {
|
| }
|
|
|
| void addSlice(List<int> source, int start, int end, bool isLast) {
|
| - RangeError.checkValidRange(start, end, source.length);
|
| + end = RangeError.checkValidRange(start, end, source.length);
|
| + if (start == end) return;
|
| + if (source is! Uint8List) {
|
| + // List may contain value outside of the 0..255 range. If so, throw.
|
| + // Technically, we could excuse Uint8ClampedList as well, but it unlikely
|
| + // to be relevant.
|
| + _checkValidLatin1(source, start, end);
|
| + }
|
| + _addSliceToSink(source, start, end, isLast);
|
| + }
|
| +
|
| + static void _checkValidLatin1(List<int> source, int start, int end) {
|
| + int mask = 0;
|
| for (int i = start; i < end; i++) {
|
| - int char = source[i];
|
| - if (char > _LATIN1_MASK || char < 0) {
|
| - throw new FormatException("Source contains non-Latin-1 characters.");
|
| - }
|
| + mask |= source[i];
|
| }
|
| - if (start < end) {
|
| - _addSliceToSink(source, start, end, isLast);
|
| + if (mask >= 0 && mask <= _LATIN1_MASK) {
|
| + return;
|
| }
|
| - if (isLast) {
|
| - close();
|
| + _reportInvalidLatin1(source, start, end); // Always throws.
|
| + }
|
| +
|
| +
|
| + static void _reportInvalidLatin1(List<int> source, int start, int end) {
|
| + // Find the index of the first non-Latin-1 character code.
|
| + for (int i = start; i < end; i++) {
|
| + int char = source[i];
|
| + if (char < 0 || char > _LATIN1_MASK) {
|
| + throw new FormatException("Source contains non-Latin-1 characters.",
|
| + source, i);
|
| + }
|
| }
|
| + // Unreachable - we only call the function if the loop above throws.
|
| + assert(false);
|
| }
|
| }
|
|
|
|
|