| Index: sdk/lib/utf/utf32.dart
|
| diff --git a/sdk/lib/utf/utf32.dart b/sdk/lib/utf/utf32.dart
|
| index e4a13fe617ecbb643a1d6065b2bd7fdaecf95bfb..b9d9e98b48f420afa5837e479de01a7839ee0459 100644
|
| --- a/sdk/lib/utf/utf32.dart
|
| +++ b/sdk/lib/utf/utf32.dart
|
| @@ -182,12 +182,14 @@ typedef Utf32BytesDecoder Utf32BytesDecoderProvider();
|
| * provides an iterator on demand and the iterator will only translate bytes
|
| * as requested by the user of the iterator. (Note: results are not cached.)
|
| */
|
| -class IterableUtf32Decoder implements Iterable<int> {
|
| +// TODO(floitsch): Consider removing the extend and switch to implements since
|
| +// that's cheaper to allocate.
|
| +class IterableUtf32Decoder extends Iterable<int> {
|
| final Utf32BytesDecoderProvider codeunitsProvider;
|
|
|
| IterableUtf32Decoder._(this.codeunitsProvider);
|
|
|
| - Utf32BytesDecoder iterator() => codeunitsProvider();
|
| + Utf32BytesDecoder get iterator => codeunitsProvider();
|
| }
|
|
|
| /**
|
| @@ -196,6 +198,7 @@ class IterableUtf32Decoder implements Iterable<int> {
|
| class Utf32BytesDecoder implements _ListRangeIterator {
|
| final _ListRangeIterator utf32EncodedBytesIterator;
|
| final int replacementCodepoint;
|
| + int _current = null;
|
|
|
| Utf32BytesDecoder._fromListRangeIterator(
|
| this.utf32EncodedBytesIterator, this.replacementCodepoint);
|
| @@ -219,21 +222,23 @@ class Utf32BytesDecoder implements _ListRangeIterator {
|
| }
|
|
|
| List<int> decodeRest() {
|
| - List<int> codeunits = new List<int>(remaining);
|
| + List<int> codeunits = new List<int>.fixedLength(remaining);
|
| int i = 0;
|
| - while (hasNext) {
|
| - codeunits[i++] = next();
|
| + while (moveNext()) {
|
| + codeunits[i++] = current;
|
| }
|
| return codeunits;
|
| }
|
|
|
| - bool get hasNext => utf32EncodedBytesIterator.hasNext;
|
| + int get current => _current;
|
|
|
| - int next() {
|
| + bool moveNext() {
|
| + _current = null;
|
| if (utf32EncodedBytesIterator.remaining < 4) {
|
| utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining);
|
| if (replacementCodepoint != null) {
|
| - return replacementCodepoint;
|
| + _current = replacementCodepoint;
|
| + return true;
|
| } else {
|
| throw new ArgumentError(
|
| "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
|
| @@ -241,9 +246,11 @@ class Utf32BytesDecoder implements _ListRangeIterator {
|
| } else {
|
| int codepoint = decode();
|
| if (_validCodepoint(codepoint)) {
|
| - return codepoint;
|
| + _current = codepoint;
|
| + return true;
|
| } else if (replacementCodepoint != null) {
|
| - return replacementCodepoint;
|
| + _current = replacementCodepoint;
|
| + return true;
|
| } else {
|
| throw new ArgumentError(
|
| "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
|
| @@ -274,18 +281,23 @@ class Utf32beBytesDecoder extends Utf32BytesDecoder {
|
| Utf32beBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
|
| int length, bool stripBom = true,
|
| int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
|
| - super._fromListRangeIterator((new _ListRange(utf32EncodedBytes, offset,
|
| - length)).iterator(), replacementCodepoint) {
|
| + super._fromListRangeIterator(
|
| + (new _ListRange(utf32EncodedBytes, offset, length)).iterator,
|
| + replacementCodepoint) {
|
| if (stripBom && hasUtf32beBom(utf32EncodedBytes, offset, length)) {
|
| skip();
|
| }
|
| }
|
|
|
| int decode() {
|
| - int value = utf32EncodedBytesIterator.next();
|
| - value = (value << 8) + utf32EncodedBytesIterator.next();
|
| - value = (value << 8) + utf32EncodedBytesIterator.next();
|
| - value = (value << 8) + utf32EncodedBytesIterator.next();
|
| + utf32EncodedBytesIterator.moveNext();
|
| + int value = utf32EncodedBytesIterator.current;
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value = (value << 8) + utf32EncodedBytesIterator.current;
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value = (value << 8) + utf32EncodedBytesIterator.current;
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value = (value << 8) + utf32EncodedBytesIterator.current;
|
| return value;
|
| }
|
| }
|
| @@ -298,18 +310,23 @@ class Utf32leBytesDecoder extends Utf32BytesDecoder {
|
| Utf32leBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
|
| int length, bool stripBom = true,
|
| int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
|
| - super._fromListRangeIterator((new _ListRange(utf32EncodedBytes, offset,
|
| - length)).iterator(), replacementCodepoint) {
|
| + super._fromListRangeIterator(
|
| + (new _ListRange(utf32EncodedBytes, offset, length)).iterator,
|
| + replacementCodepoint) {
|
| if (stripBom && hasUtf32leBom(utf32EncodedBytes, offset, length)) {
|
| skip();
|
| }
|
| }
|
|
|
| int decode() {
|
| - int value = (utf32EncodedBytesIterator.next());
|
| - value += (utf32EncodedBytesIterator.next() << 8);
|
| - value += (utf32EncodedBytesIterator.next() << 16);
|
| - value += (utf32EncodedBytesIterator.next() << 24);
|
| + utf32EncodedBytesIterator.moveNext();
|
| + int value = utf32EncodedBytesIterator.current;
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value += (utf32EncodedBytesIterator.current << 8);
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value += (utf32EncodedBytesIterator.current << 16);
|
| + utf32EncodedBytesIterator.moveNext();
|
| + value += (utf32EncodedBytesIterator.current << 24);
|
| return value;
|
| }
|
| }
|
|
|