Index: sdk/lib/utf/utf_core.dart |
diff --git a/sdk/lib/utf/utf_core.dart b/sdk/lib/utf/utf_core.dart |
index cdc1ddffe8a9eb36cd4df092466c67192017d403..15ca45e356eb0c292917f7ca42c6d4f0b1c33966 100644 |
--- a/sdk/lib/utf/utf_core.dart |
+++ b/sdk/lib/utf/utf_core.dart |
@@ -45,8 +45,10 @@ const int UNICODE_UTF16_LO_MASK = 0x3ff; |
* Encode code points as UTF16 code units. |
*/ |
List<int> _codepointsToUtf16CodeUnits( |
- List<int> codepoints, [int offset = 0, int length, |
- int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) { |
+ List<int> codepoints, |
+ [int offset = 0, |
+ int length, |
+ int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) { |
_ListRange listRange = new _ListRange(codepoints, offset, length); |
int encodedLength = 0; |
@@ -62,7 +64,7 @@ List<int> _codepointsToUtf16CodeUnits( |
} |
} |
- List<int> codeUnitsBuffer = new List<int>(encodedLength); |
+ List<int> codeUnitsBuffer = new List<int>.fixedLength(encodedLength); |
int j = 0; |
for (int value in listRange) { |
if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) || |
@@ -91,18 +93,18 @@ List<int> _utf16CodeUnitsToCodepoints( |
List<int> utf16CodeUnits, [int offset = 0, int length, |
int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) { |
_ListRangeIterator source = |
- (new _ListRange(utf16CodeUnits, offset, length)).iterator(); |
+ (new _ListRange(utf16CodeUnits, offset, length)).iterator; |
Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder |
.fromListRangeIterator(source, replacementCodepoint); |
- List<int> codepoints = new List<int>(source.remaining); |
+ List<int> codepoints = new List<int>.fixedLength(source.remaining); |
int i = 0; |
- while (decoder.hasNext) { |
- codepoints[i++] = decoder.next(); |
+ while (decoder.moveNext()) { |
+ codepoints[i++] = decoder.current; |
} |
if (i == codepoints.length) { |
return codepoints; |
} else { |
- List<int> codepointTrunc = new List<int>(i); |
+ List<int> codepointTrunc = new List<int>.fixedLength(i); |
codepointTrunc.setRange(0, i, codepoints); |
return codepointTrunc; |
} |
@@ -117,26 +119,30 @@ List<int> _utf16CodeUnitsToCodepoints( |
class Utf16CodeUnitDecoder implements Iterator<int> { |
final _ListRangeIterator utf16CodeUnitIterator; |
final int replacementCodepoint; |
+ int _current = null; |
Utf16CodeUnitDecoder(List<int> utf16CodeUnits, [int offset = 0, int length, |
int this.replacementCodepoint = |
UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) : |
- utf16CodeUnitIterator = (new _ListRange(utf16CodeUnits, offset, length)) |
- .iterator(); |
+ utf16CodeUnitIterator = |
+ (new _ListRange(utf16CodeUnits, offset, length)).iterator; |
Utf16CodeUnitDecoder.fromListRangeIterator( |
_ListRangeIterator this.utf16CodeUnitIterator, |
int this.replacementCodepoint); |
- Iterator<int> iterator() => this; |
+ Iterator<int> get iterator => this; |
+ |
+ int get current => _current; |
- bool get hasNext => utf16CodeUnitIterator.hasNext; |
+ bool moveNext() { |
+ _current = null; |
+ if (!utf16CodeUnitIterator.moveNext()) return false; |
- int next() { |
- int value = utf16CodeUnitIterator.next(); |
+ int value = utf16CodeUnitIterator.current; |
if (value < 0) { |
if (replacementCodepoint != null) { |
- return replacementCodepoint; |
+ _current = replacementCodepoint; |
} else { |
throw new ArgumentError( |
"Invalid UTF16 at ${utf16CodeUnitIterator.position}"); |
@@ -144,35 +150,36 @@ class Utf16CodeUnitDecoder implements Iterator<int> { |
} else if (value < UNICODE_UTF16_RESERVED_LO || |
(value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) { |
// transfer directly |
- return value; |
+ _current = value; |
} else if (value < UNICODE_UTF16_SURROGATE_UNIT_1_BASE && |
- utf16CodeUnitIterator.hasNext) { |
+ utf16CodeUnitIterator.moveNext()) { |
// merge surrogate pair |
- int nextValue = utf16CodeUnitIterator.next(); |
+ int nextValue = utf16CodeUnitIterator.current; |
if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_1_BASE && |
nextValue <= UNICODE_UTF16_RESERVED_HI) { |
value = (value - UNICODE_UTF16_SURROGATE_UNIT_0_BASE) << 10; |
value += UNICODE_UTF16_OFFSET + |
(nextValue - UNICODE_UTF16_SURROGATE_UNIT_1_BASE); |
- return value; |
+ _current = value; |
} else { |
if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_0_BASE && |
nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) { |
utf16CodeUnitIterator.backup(); |
} |
if (replacementCodepoint != null) { |
- return replacementCodepoint; |
+ _current = replacementCodepoint; |
} else { |
throw new ArgumentError( |
"Invalid UTF16 at ${utf16CodeUnitIterator.position}"); |
} |
} |
} else if (replacementCodepoint != null) { |
- return replacementCodepoint; |
+ _current = replacementCodepoint; |
} else { |
throw new ArgumentError( |
"Invalid UTF16 at ${utf16CodeUnitIterator.position}"); |
} |
+ return true; |
} |
} |
@@ -181,7 +188,9 @@ class Utf16CodeUnitDecoder implements Iterator<int> { |
* range within a source list. DO NOT MODIFY the underlying list while |
* iterating over it. The results of doing so are undefined. |
*/ |
-class _ListRange implements Iterable { |
+// TODO(floitsch): Consider removing the extend and switch to implements since |
+// that's cheaper to allocate. |
+class _ListRange extends Iterable { |
final List _source; |
final int _offset; |
final int _length; |
@@ -201,7 +210,7 @@ class _ListRange implements Iterable { |
} |
} |
- _ListRangeIterator iterator() => |
+ _ListRangeIterator get iterator => |
new _ListRangeIteratorImpl(_source, _offset, _offset + _length); |
int get length => _length; |
@@ -213,8 +222,8 @@ class _ListRange implements Iterable { |
* and move forward/backward within the iterator. |
*/ |
abstract class _ListRangeIterator implements Iterator<int> { |
- bool hasNext; |
- int next(); |
+ bool moveNext(); |
+ int get current; |
int get position; |
void backup([by]); |
int get remaining; |
@@ -226,11 +235,12 @@ class _ListRangeIteratorImpl implements _ListRangeIterator { |
int _offset; |
final int _end; |
- _ListRangeIteratorImpl(this._source, this._offset, this._end); |
+ _ListRangeIteratorImpl(this._source, int offset, this._end) |
+ : _offset = offset - 1; |
- bool get hasNext => _offset < _end; |
+ int get current => _source[_offset]; |
- int next() => _source[_offset++]; |
+ bool moveNext() => ++_offset < _end; |
int get position => _offset; |
@@ -238,7 +248,7 @@ class _ListRangeIteratorImpl implements _ListRangeIterator { |
_offset -= by; |
} |
- int get remaining => _end - _offset; |
+ int get remaining => _end - _offset - 1; |
void skip([int count = 1]) { |
_offset += count; |