Index: tool/input_sdk/lib/convert/utf.dart |
diff --git a/tool/input_sdk/lib/convert/utf.dart b/tool/input_sdk/lib/convert/utf.dart |
index d16d2c67d399774e25372684723764a7bbf542d2..a93c9aec2c19a56680936d50c899900faed50a06 100644 |
--- a/tool/input_sdk/lib/convert/utf.dart |
+++ b/tool/input_sdk/lib/convert/utf.dart |
@@ -66,7 +66,7 @@ class Utf8Codec extends Encoding { |
return new Utf8Decoder(allowMalformed: allowMalformed).convert(codeUnits); |
} |
- Utf8Encoder get encoder => new Utf8Encoder(); |
+ Utf8Encoder get encoder => const Utf8Encoder(); |
Utf8Decoder get decoder { |
return new Utf8Decoder(allowMalformed: _allowMalformed); |
} |
@@ -76,7 +76,8 @@ class Utf8Codec extends Encoding { |
* This class converts strings to their UTF-8 code units (a list of |
* unsigned 8-bit integers). |
*/ |
-class Utf8Encoder extends Converter<String, List<int>> { |
+class Utf8Encoder extends |
+ ChunkedConverter<String, List<int>, String, List<int>> { |
const Utf8Encoder(); |
@@ -304,7 +305,8 @@ class _Utf8EncoderSink extends _Utf8Encoder with StringConversionSinkMixin { |
* This class converts UTF-8 code units (lists of unsigned 8-bit integers) |
* to a string. |
*/ |
-class Utf8Decoder extends Converter<List<int>, String> { |
+class Utf8Decoder extends |
+ ChunkedConverter<List<int>, String, List<int>, String> { |
final bool _allowMalformed; |
/** |
@@ -331,6 +333,13 @@ class Utf8Decoder extends Converter<List<int>, String> { |
* character is discarded. |
*/ |
String convert(List<int> codeUnits, [int start = 0, int end]) { |
+ // Allow the implementation to intercept and specialize based on the type |
+ // of codeUnits. |
+ String result = _convertIntercepted(_allowMalformed, codeUnits, start, end); |
+ if (result != null) { |
+ return result; |
+ } |
+ |
int length = codeUnits.length; |
RangeError.checkValidRange(start, end, length); |
if (end == null) end = length; |
@@ -361,6 +370,9 @@ class Utf8Decoder extends Converter<List<int>, String> { |
Stream<String> bind(Stream<List<int>> stream) => super.bind(stream); |
external Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next); |
+ |
+ external static String _convertIntercepted( |
+ bool allowMalformed, List<int> codeUnits, int start, int end); |
} |
// UTF-8 constants. |
@@ -376,8 +388,6 @@ const int _SURROGATE_VALUE_MASK = 0x3FF; |
const int _LEAD_SURROGATE_MIN = 0xD800; |
const int _TAIL_SURROGATE_MIN = 0xDC00; |
-bool _isSurrogate(int codeUnit) => |
- (codeUnit & _SURROGATE_MASK) == _LEAD_SURROGATE_MIN; |
bool _isLeadSurrogate(int codeUnit) => |
(codeUnit & _SURROGATE_TAG_MASK) == _LEAD_SURROGATE_MIN; |
bool _isTailSurrogate(int codeUnit) => |
@@ -386,7 +396,6 @@ int _combineSurrogatePair(int lead, int tail) => |
0x10000 + ((lead & _SURROGATE_VALUE_MASK) << 10) |
| (tail & _SURROGATE_VALUE_MASK); |
- |
/** |
* Decodes UTF-8. |
* |