| Index: runtime/lib/string_patch.dart
|
| diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
|
| index 717e49db71984f56878bbfcf0cde617c7efb3be5..61ea5dcbd8553a76c2c763d16c7d238df7b9c91a 100644
|
| --- a/runtime/lib/string_patch.dart
|
| +++ b/runtime/lib/string_patch.dart
|
| @@ -779,6 +779,8 @@ class _OneByteString extends _StringBase implements String {
|
| }
|
|
|
| // Lower-case conversion table for Latin-1.
|
| + // Upper-case ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
|
| + // Conversion to lower case performed by adding 0x20.
|
| static const _LC_TABLE = const [
|
| 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
| 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
| @@ -814,28 +816,19 @@ class _OneByteString extends _StringBase implements String {
|
| 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
| ];
|
|
|
| - String _toLowerCaseUpperCaseDetectedAt(int firstUpperCaseIndex) {
|
| - // String contains upper case characters. Create a new string.
|
| - final length = this.length;
|
| - final result = _allocate(length);
|
| - // First up to firstUpperIndex.
|
| - int i = 0;
|
| - for (; i < firstUpperCaseIndex; i++) {
|
| - result._setAt(i, this.codeUnitAt(i));
|
| - }
|
| - for (; i < length; i++) {
|
| - result._setAt(i, _LC_TABLE[this.codeUnitAt(i)]);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| String toLowerCase() {
|
| for (int i = 0; i < this.length; i++) {
|
| final c = this.codeUnitAt(i);
|
| - // Ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
|
| - if (c != _LC_TABLE[c]) {
|
| - return _toLowerCaseUpperCaseDetectedAt(i);
|
| + if (c == _LC_TABLE[c]) continue;
|
| + // Upper-case character found.
|
| + final result = _allocate(this.length);
|
| + for (int j = 0; j < i; j++) {
|
| + result._setAt(j, this.codeUnitAt(j));
|
| }
|
| + for (int j = i; j < this.length; j++) {
|
| + result._setAt(j, _LC_TABLE[this.codeUnitAt(j)]);
|
| + }
|
| + return result;
|
| }
|
| return this;
|
| }
|
|
|