Index: runtime/lib/string_patch.dart |
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart |
index 3a1fd711b6cd06e4a46f44ad383d6258a8d47a76..a65a6bc26257ffe2311814041b4893e739f348cc 100644 |
--- a/runtime/lib/string_patch.dart |
+++ b/runtime/lib/string_patch.dart |
@@ -739,6 +739,27 @@ class _OneByteString extends _StringBase implements String { |
return super.split(pattern); |
} |
+ // The codeUnitsAt family of functions is inlined to an unchecked |
+ // LoadCodeUnitsInstr, therefore `this` must be a valid string, and `index` |
+ // must be in bounds. |
+ int _oneCodeUnitAt(int index) => _codeUnitsAt(index, 1); |
+ int _twoCodeUnitsAt(int index) => _codeUnitsAt(index, 2); |
+ int _fourCodeUnitsAt(int index) => _codeUnitsAt(index, 4); |
+ |
+ // Loads up to 4 code units into a single integer. |
+ int _codeUnitsAt(int index, int count) { |
+ assert(index >= 0); |
+ assert(index + count - 1 < this.length); |
+ assert(0 < count && count <= 4); |
+ |
+ int codeUnits = 0; |
+ for (int i = 0; i < count; i++) { |
+ codeUnits |= this.codeUnitAt(index + i) << (i * 8); |
Ivan Posva
2014/10/31 07:32:37
This looks pretty endian specific to me. No?
zerny-google
2014/10/31 11:54:26
Well spotted. The irregexp code works despite this
|
+ } |
+ |
+ return codeUnits; |
+ } |
+ |
// All element of 'strings' must be OneByteStrings. |
static _concatAll(List<String> strings, int totalLength) { |
// TODO(srdjan): Improve code below and raise or eliminate the limit. |
@@ -1003,6 +1024,23 @@ class _TwoByteString extends _StringBase implements String { |
bool operator ==(Object other) { |
return super == other; |
} |
+ |
+ int _oneCodeUnitAt(int index) => _codeUnitsAt(index, 1); |
+ int _twoCodeUnitsAt(int index) => _codeUnitsAt(index, 2); |
+ |
+ // Loads up to 2 code units into a single integer. |
+ int _codeUnitsAt(int index, int count) { |
+ assert(index >= 0); |
+ assert(index + count - 1 < this.length); |
+ assert(0 < count && count <= 2); |
+ |
+ int codeUnits = 0; |
+ for (int i = 0; i < count; i++) { |
+ codeUnits |= this.codeUnitAt(index + i) << (i * 16); |
Ivan Posva
2014/10/31 07:32:37
ditto.
|
+ } |
+ |
+ return codeUnits; |
+ } |
} |