| Index: sdk/lib/utf/utf16.dart
|
| diff --git a/sdk/lib/utf/utf16.dart b/sdk/lib/utf/utf16.dart
|
| index 7c67a301f24afee79798364da6c7390f0bae0b2f..4fbb80ff9618352ab030b752ea439c10654433e0 100644
|
| --- a/sdk/lib/utf/utf16.dart
|
| +++ b/sdk/lib/utf/utf16.dart
|
| @@ -113,7 +113,7 @@ List<int> encodeUtf16(String str) =>
|
| List<int> encodeUtf16be(String str, [bool writeBOM = false]) {
|
| List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
|
| List<int> encoding =
|
| - new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
|
| + new List<int>.fixedLength(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
|
| int i = 0;
|
| if (writeBOM) {
|
| encoding[i++] = UNICODE_UTF_BOM_HI;
|
| @@ -133,7 +133,7 @@ List<int> encodeUtf16be(String str, [bool writeBOM = false]) {
|
| List<int> encodeUtf16le(String str, [bool writeBOM = false]) {
|
| List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
|
| List<int> encoding =
|
| - new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
|
| + new List<int>.fixedLength(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
|
| int i = 0;
|
| if (writeBOM) {
|
| encoding[i++] = UNICODE_UTF_BOM_LO;
|
| @@ -188,13 +188,15 @@ typedef _ListRangeIterator _CodeUnitsProvider();
|
| * 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 IterableUtf16Decoder implements Iterable<int> {
|
| +// TODO(floitsch): Consider removing the extend and switch to implements since
|
| +// that's cheaper to allocate.
|
| +class IterableUtf16Decoder extends Iterable<int> {
|
| final _CodeUnitsProvider codeunitsProvider;
|
| final int replacementCodepoint;
|
|
|
| IterableUtf16Decoder._(this.codeunitsProvider, this.replacementCodepoint);
|
|
|
| - Utf16CodeUnitDecoder iterator() =>
|
| + Utf16CodeUnitDecoder get iterator =>
|
| new Utf16CodeUnitDecoder.fromListRangeIterator(codeunitsProvider(),
|
| replacementCodepoint);
|
| }
|
| @@ -207,6 +209,7 @@ class IterableUtf16Decoder implements Iterable<int> {
|
| class Utf16BytesToCodeUnitsDecoder implements _ListRangeIterator {
|
| final _ListRangeIterator utf16EncodedBytesIterator;
|
| final int replacementCodepoint;
|
| + int _current = null;
|
|
|
| Utf16BytesToCodeUnitsDecoder._fromListRangeIterator(
|
| this.utf16EncodedBytesIterator, this.replacementCodepoint);
|
| @@ -235,33 +238,36 @@ class Utf16BytesToCodeUnitsDecoder implements _ListRangeIterator {
|
| * over-allocates the List containing results.
|
| */
|
| 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;
|
| }
|
| if (i == codeunits.length) {
|
| return codeunits;
|
| } else {
|
| - List<int> truncCodeunits = new List<int>(i);
|
| + List<int> truncCodeunits = new List<int>.fixedLength(i);
|
| truncCodeunits.setRange(0, i, codeunits);
|
| return truncCodeunits;
|
| }
|
| }
|
|
|
| - bool get hasNext => utf16EncodedBytesIterator.hasNext;
|
| + int get current => _current;
|
|
|
| - int next() {
|
| + bool moveNext() {
|
| + _current = null;
|
| if (utf16EncodedBytesIterator.remaining < 2) {
|
| - utf16EncodedBytesIterator.next();
|
| + utf16EncodedBytesIterator.moveNext();
|
| if (replacementCodepoint != null) {
|
| - return replacementCodepoint;
|
| + _current = replacementCodepoint;
|
| + return true;
|
| } else {
|
| throw new ArgumentError(
|
| "Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
|
| }
|
| } else {
|
| - return decode();
|
| + _current = decode();
|
| + return true;
|
| }
|
| }
|
|
|
| @@ -288,16 +294,19 @@ class Utf16beBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
|
| Utf16beBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
|
| int offset = 0, int length, bool stripBom = true,
|
| int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
|
| - super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset,
|
| - length)).iterator(), replacementCodepoint) {
|
| + super._fromListRangeIterator(
|
| + (new _ListRange(utf16EncodedBytes, offset, length)).iterator,
|
| + replacementCodepoint) {
|
| if (stripBom && hasUtf16beBom(utf16EncodedBytes, offset, length)) {
|
| skip();
|
| }
|
| }
|
|
|
| int decode() {
|
| - int hi = utf16EncodedBytesIterator.next();
|
| - int lo = utf16EncodedBytesIterator.next();
|
| + utf16EncodedBytesIterator.moveNext();
|
| + int hi = utf16EncodedBytesIterator.current;
|
| + utf16EncodedBytesIterator.moveNext();
|
| + int lo = utf16EncodedBytesIterator.current;
|
| return (hi << 8) + lo;
|
| }
|
| }
|
| @@ -310,16 +319,19 @@ class Utf16leBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
|
| Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
|
| int offset = 0, int length, bool stripBom = true,
|
| int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
|
| - super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset,
|
| - length)).iterator(), replacementCodepoint) {
|
| + super._fromListRangeIterator(
|
| + (new _ListRange(utf16EncodedBytes, offset, length)).iterator,
|
| + replacementCodepoint) {
|
| if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) {
|
| skip();
|
| }
|
| }
|
|
|
| int decode() {
|
| - int lo = utf16EncodedBytesIterator.next();
|
| - int hi = utf16EncodedBytesIterator.next();
|
| + utf16EncodedBytesIterator.moveNext();
|
| + int lo = utf16EncodedBytesIterator.current;
|
| + utf16EncodedBytesIterator.moveNext();
|
| + int hi = utf16EncodedBytesIterator.current;
|
| return (hi << 8) + lo;
|
| }
|
| }
|
|
|