Chromium Code Reviews| 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; |
| + } |
| } |