Index: runtime/lib/string_patch.dart |
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart |
index 7fad31b0452cbf1fa99a4f4583178a53280f33a9..9c7e5843b1f77fcc73dbc06fe80bc79e642be115 100644 |
--- a/runtime/lib/string_patch.dart |
+++ b/runtime/lib/string_patch.dart |
@@ -7,48 +7,42 @@ const int _maxLatin1 = 0xff; |
const int _maxUtf16 = 0xffff; |
const int _maxUnicode = 0x10ffff; |
-@patch |
-class String { |
- @patch |
- factory String.fromCharCodes(Iterable<int> charCodes, |
- [int start = 0, int end]) { |
- if (charCodes is! Iterable) |
- throw new ArgumentError.value(charCodes, "charCodes"); |
+@patch class String { |
+ @patch factory String.fromCharCodes(Iterable<int> charCodes, |
+ [int start = 0, int end]) { |
+ if (charCodes is! Iterable) throw new ArgumentError.value(charCodes, "charCodes"); |
if (start is! int) throw new ArgumentError.value(start, "start"); |
if (end != null && end is! int) throw new ArgumentError.value(end, "end"); |
return _StringBase.createFromCharCodes(charCodes, start, end, null); |
} |
- @patch |
- factory String.fromCharCode(int charCode) { |
+ @patch factory String.fromCharCode(int charCode) { |
if (charCode >= 0) { |
if (charCode <= 0xff) { |
return _OneByteString._allocate(1).._setAt(0, charCode); |
} |
if (charCode <= 0xffff) { |
- return _StringBase._createFromCodePoints( |
- new _List(1)..[0] = charCode, 0, 1); |
+ return _StringBase._createFromCodePoints(new _List(1)..[0] = charCode, |
+ 0, 1); |
} |
if (charCode <= 0x10ffff) { |
var low = 0xDC00 | (charCode & 0x3ff); |
int bits = charCode - 0x10000; |
var high = 0xD800 | (bits >> 10); |
- return _StringBase._createFromCodePoints( |
- new _List(2) |
- ..[0] = high |
- ..[1] = low, |
- 0, |
- 2); |
+ return _StringBase._createFromCodePoints(new _List(2)..[0] = high |
+ ..[1] = low, |
+ 0, 2); |
} |
} |
throw new RangeError.range(charCode, 0, 0x10ffff); |
} |
- @patch |
- const factory String.fromEnvironment(String name, {String defaultValue}) |
+ @patch const factory String.fromEnvironment(String name, |
+ {String defaultValue}) |
native "String_fromEnvironment"; |
} |
+ |
/** |
* [_StringBase] contains common methods used by concrete String |
* implementations, e.g., _OneByteString. |
@@ -85,7 +79,8 @@ abstract class _StringBase { |
static const int _maxJoinReplaceOneByteStringLength = 500; |
factory _StringBase._uninstantiable() { |
- throw new UnsupportedError("_StringBase can't be instaniated"); |
+ throw new UnsupportedError( |
+ "_StringBase can't be instaniated"); |
} |
int get hashCode native "String_getHashCode"; |
@@ -94,7 +89,7 @@ abstract class _StringBase { |
// Alternatively return false and override it on one-byte string classes. |
int id = ClassID.getID(this); |
return id == ClassID.cidOneByteString || |
- id == ClassID.cidExternalOneByteString; |
+ id == ClassID.cidExternalOneByteString; |
} |
/** |
@@ -107,8 +102,9 @@ abstract class _StringBase { |
* The [limit] is an upper limit on the character codes in the iterable. |
* It's `null` if unknown. |
*/ |
- static String createFromCharCodes( |
- Iterable<int> charCodes, int start, int end, int limit) { |
+ static String createFromCharCodes(Iterable<int> charCodes, |
+ int start, int end, |
+ int limit) { |
if (start == null) throw new ArgumentError.notNull("start"); |
if (charCodes == null) throw new ArgumentError(charCodes); |
// TODO(srdjan): Also skip copying of wide typed arrays. |
@@ -156,14 +152,14 @@ abstract class _StringBase { |
return bits; |
} |
- static String _createStringFromIterable( |
- Iterable<int> charCodes, int start, int end) { |
+ static String _createStringFromIterable(Iterable<int> charCodes, |
+ int start, int end) { |
// Treat charCodes as Iterable. |
if (charCodes is EfficientLengthIterable) { |
int length = charCodes.length; |
end = RangeError.checkValidRange(start, end, length); |
- List charCodeList = |
- new List.from(charCodes.take(end).skip(start), growable: false); |
+ List charCodeList = new List.from(charCodes.take(end).skip(start), |
+ growable: false); |
return createFromCharCodes(charCodeList, 0, charCodeList.length, null); |
} |
// Don't know length of iterable, so iterate and see if all the values |
@@ -176,7 +172,7 @@ abstract class _StringBase { |
} |
} |
List charCodeList; |
- int bits = 0; // Bitwise-or of all char codes in list. |
+ int bits = 0; // Bitwise-or of all char codes in list. |
if (end == null) { |
var list = []; |
while (it.moveNext()) { |
@@ -226,7 +222,7 @@ abstract class _StringBase { |
String operator [](int index) native "String_charAt"; |
- int codeUnitAt(int index); // Implemented in the subclasses. |
+ int codeUnitAt(int index); // Implemented in the subclasses. |
int get length native "String_getLength"; |
@@ -246,7 +242,8 @@ abstract class _StringBase { |
if (identical(this, other)) { |
return true; |
} |
- if ((other is! String) || (this.length != other.length)) { |
+ if ((other is! String) || |
+ (this.length != other.length)) { |
return false; |
} |
final len = this.length; |
@@ -392,10 +389,10 @@ abstract class _StringBase { |
// Checks for one-byte whitespaces only. |
static bool _isOneByteWhitespace(int codeUnit) { |
if (codeUnit <= 32) { |
- return ((codeUnit == 32) || // Space. |
- ((codeUnit <= 13) && (codeUnit >= 9))); // CR, LF, TAB, etc. |
+ return ((codeUnit == 32) || // Space. |
+ ((codeUnit <= 13) && (codeUnit >= 9))); // CR, LF, TAB, etc. |
} |
- return (codeUnit == 0x85) || (codeUnit == 0xA0); // NEL, NBSP. |
+ return (codeUnit == 0x85) || (codeUnit == 0xA0); // NEL, NBSP. |
} |
// Characters with Whitespace property (Unicode 6.2). |
@@ -415,18 +412,21 @@ abstract class _StringBase { |
// BOM: 0xFEFF |
static bool _isTwoByteWhitespace(int codeUnit) { |
if (codeUnit <= 32) { |
- return (codeUnit == 32) || ((codeUnit <= 13) && (codeUnit >= 9)); |
+ return (codeUnit == 32) || |
+ ((codeUnit <= 13) && (codeUnit >= 9)); |
} |
if (codeUnit < 0x85) return false; |
if ((codeUnit == 0x85) || (codeUnit == 0xA0)) return true; |
return (codeUnit <= 0x200A) |
- ? ((codeUnit == 0x1680) || (codeUnit == 0x180E) || (0x2000 <= codeUnit)) |
- : ((codeUnit == 0x2028) || |
- (codeUnit == 0x2029) || |
- (codeUnit == 0x202F) || |
- (codeUnit == 0x205F) || |
- (codeUnit == 0x3000) || |
- (codeUnit == 0xFEFF)); |
+ ? ((codeUnit == 0x1680) || |
+ (codeUnit == 0x180E) || |
+ (0x2000 <= codeUnit)) |
+ : ((codeUnit == 0x2028) || |
+ (codeUnit == 0x2029) || |
+ (codeUnit == 0x202F) || |
+ (codeUnit == 0x205F) || |
+ (codeUnit == 0x3000) || |
+ (codeUnit == 0xFEFF)); |
} |
int _firstNonWhitespace() { |
@@ -505,7 +505,7 @@ abstract class _StringBase { |
return _substringUnchecked(0, last + 1); |
} |
- String operator *(int times) { |
+ String operator*(int times) { |
if (times <= 0) return ""; |
if (times == 1) return this; |
StringBuffer buffer = new StringBuffer(this); |
@@ -546,8 +546,9 @@ abstract class _StringBase { |
return pattern.allMatches(this.substring(startIndex)).isNotEmpty; |
} |
- String replaceFirst(Pattern pattern, String replacement, |
- [int startIndex = 0]) { |
+ String replaceFirst(Pattern pattern, |
+ String replacement, |
+ [int startIndex = 0]) { |
if (pattern is! Pattern) { |
throw new ArgumentError("${pattern} is not a Pattern"); |
} |
@@ -558,9 +559,9 @@ abstract class _StringBase { |
throw new ArgumentError("${startIndex} is not an int"); |
} |
RangeError.checkValueInInterval(startIndex, 0, this.length, "startIndex"); |
- Iterator iterator = startIndex == 0 |
- ? pattern.allMatches(this).iterator |
- : pattern.allMatches(this, startIndex).iterator; |
+ Iterator iterator = |
+ startIndex == 0 ? pattern.allMatches(this).iterator |
+ : pattern.allMatches(this, startIndex).iterator; |
if (!iterator.moveNext()) return this; |
Match match = iterator.current; |
return replaceRange(match.start, match.end, replacement); |
@@ -585,8 +586,8 @@ abstract class _StringBase { |
_addReplaceSlice(slices, 0, start); |
if (replacement.length > 0) slices.add(replacement); |
_addReplaceSlice(slices, end, length); |
- return _joinReplaceAllResult( |
- this, slices, totalLength, replacementIsOneByte); |
+ return _joinReplaceAllResult(this, slices, totalLength, |
+ replacementIsOneByte); |
} |
static int _addReplaceSlice(List matches, int start, int end) { |
@@ -631,15 +632,17 @@ abstract class _StringBase { |
// TODO(lrn): Is there a cut-off point, or is runtime always faster? |
return _joinReplaceAllOneByteResult(this, matches, length); |
} |
- return _joinReplaceAllResult(this, matches, length, replacementIsOneByte); |
+ return _joinReplaceAllResult(this, matches, length, |
+ replacementIsOneByte); |
} |
/** |
* As [_joinReplaceAllResult], but knowing that the result |
* is always a [_OneByteString]. |
*/ |
- static String _joinReplaceAllOneByteResult( |
- String base, List matches, int length) { |
+ static String _joinReplaceAllOneByteResult(String base, |
+ List matches, |
+ int length) { |
_OneByteString result = _OneByteString._allocate(length); |
int writeIndex = 0; |
for (int i = 0; i < matches.length; i++) { |
@@ -686,9 +689,8 @@ abstract class _StringBase { |
* If they are, then we have to check the base string slices to know |
* whether the result must be a one-byte string. |
*/ |
- static String |
- _joinReplaceAllResult(String base, List matches, int length, |
- bool replacementStringsAreOneByte) |
+ static String _joinReplaceAllResult(String base, List matches, int length, |
+ bool replacementStringsAreOneByte) |
native "StringBase_joinReplaceAllResult"; |
String replaceAllMapped(Pattern pattern, String replace(Match match)) { |
@@ -714,12 +716,12 @@ abstract class _StringBase { |
this._isOneByte) { |
return _joinReplaceAllOneByteResult(this, matches, length); |
} |
- return _joinReplaceAllResult( |
- this, matches, length, replacementStringsAreOneByte); |
+ return _joinReplaceAllResult(this, matches, length, |
+ replacementStringsAreOneByte); |
} |
String replaceFirstMapped(Pattern pattern, String replace(Match match), |
- [int startIndex = 0]) { |
+ [int startIndex = 0]) { |
if (pattern == null) throw new ArgumentError.notNull("pattern"); |
if (replace == null) throw new ArgumentError.notNull("replace"); |
if (startIndex == null) throw new ArgumentError.notNull("startIndex"); |
@@ -735,8 +737,8 @@ abstract class _StringBase { |
static String _matchString(Match match) => match[0]; |
static String _stringIdentity(String string) => string; |
- String _splitMapJoinEmptyString( |
- String onMatch(Match match), String onNonMatch(String nonMatch)) { |
+ String _splitMapJoinEmptyString(String onMatch(Match match), |
+ String onNonMatch(String nonMatch)) { |
// Pattern is the empty string. |
StringBuffer buffer = new StringBuffer(); |
int length = this.length; |
@@ -765,7 +767,8 @@ abstract class _StringBase { |
} |
String splitMapJoin(Pattern pattern, |
- {String onMatch(Match match), String onNonMatch(String nonMatch)}) { |
+ {String onMatch(Match match), |
+ String onNonMatch(String nonMatch)}) { |
if (pattern is! Pattern) { |
throw new ArgumentError("${pattern} is not a Pattern"); |
} |
@@ -884,7 +887,7 @@ abstract class _StringBase { |
} |
int endIndex = match.end; |
if (startIndex == endIndex && endIndex == previousIndex) { |
- ++startIndex; // empty match, advance and restart |
+ ++startIndex; // empty match, advance and restart |
continue; |
} |
result.add(this.substring(previousIndex, match.start)); |
@@ -916,7 +919,9 @@ abstract class _StringBase { |
native "String_concatRange"; |
} |
+ |
class _OneByteString extends _StringBase implements String { |
+ |
factory _OneByteString._uninstantiable() { |
throw new UnsupportedError( |
"_OneByteString can only be allocated by the VM"); |
@@ -1013,14 +1018,14 @@ class _OneByteString extends _StringBase implements String { |
return super.contains(pattern, start); |
} |
- String operator *(int times) { |
+ String operator*(int times) { |
if (times <= 0) return ""; |
if (times == 1) return this; |
int length = this.length; |
- if (this.isEmpty) return this; // Don't clone empty string. |
+ if (this.isEmpty) return this; // Don't clone empty string. |
_OneByteString result = _OneByteString._allocate(length * times); |
int index = 0; |
- for (int i = 0; i < times; i++) { |
+ for (int i = 0; i < times; i ++) { |
for (int j = 0; j < length; j++) { |
result._setAt(index++, this.codeUnitAt(j)); |
} |
@@ -1188,8 +1193,10 @@ class _OneByteString extends _StringBase implements String { |
// set using _setAt. |
static _OneByteString _allocate(int length) native "OneByteString_allocate"; |
- static _OneByteString _allocateFromOneByteList(List<int> list, int start, |
- int end) native "OneByteString_allocateFromOneByteList"; |
+ |
+ static _OneByteString _allocateFromOneByteList(List<int> list, |
+ int start, int end) |
+ native "OneByteString_allocateFromOneByteList"; |
// This is internal helper method. Code point value must be a valid |
// Latin1 value (0..0xFF), index must be valid. |
@@ -1213,6 +1220,7 @@ class _OneByteString extends _StringBase implements String { |
} |
} |
+ |
class _TwoByteString extends _StringBase implements String { |
factory _TwoByteString._uninstantiable() { |
throw new UnsupportedError( |
@@ -1233,6 +1241,7 @@ class _TwoByteString extends _StringBase implements String { |
} |
} |
+ |
class _ExternalOneByteString extends _StringBase implements String { |
factory _ExternalOneByteString._uninstantiable() { |
throw new UnsupportedError( |
@@ -1252,6 +1261,7 @@ class _ExternalOneByteString extends _StringBase implements String { |
static int _getCid() native "ExternalOneByteString_getCid"; |
} |
+ |
class _ExternalTwoByteString extends _StringBase implements String { |
factory _ExternalTwoByteString._uninstantiable() { |
throw new UnsupportedError( |
@@ -1269,11 +1279,12 @@ class _ExternalTwoByteString extends _StringBase implements String { |
} |
} |
+ |
class _StringMatch implements Match { |
const _StringMatch(this.start, this.input, this.pattern); |
int get end => start + pattern.length; |
- String operator [](int g) => group(g); |
+ String operator[](int g) => group(g); |
int get groupCount => 0; |
String group(int group) { |
@@ -1296,6 +1307,7 @@ class _StringMatch implements Match { |
final String pattern; |
} |
+ |
class _StringAllMatchesIterable extends Iterable<Match> { |
final String _input; |
final String _pattern; |