@@ -8,16 +8,8 @@ import "dart:_internal"
8
8
show
9
9
CodeUnits,
10
10
ClassID,
11
- copyRangeFromUint8ListToOneByteString,
12
- doubleToIntBits,
13
11
EfficientLengthIterable,
14
- intBitsToDouble,
15
- IterableElementError,
16
- jsonEncode,
17
- Lists,
18
- mix64,
19
12
makeListFixedLength,
20
- patch,
21
13
unsafeCast;
22
14
23
15
import 'dart:_js_helper' show JS;
@@ -57,10 +49,6 @@ String _toUpperCase(String string) => JS<String>(
57
49
String _toLowerCase (String string) => JS <String >(
58
50
"s => stringToDartString(stringFromDartString(s).toLowerCase())" , string);
59
51
60
- extension _StringExtension on String {
61
- bool get _isOneByte => this is OneByteString ;
62
- }
63
-
64
52
/**
65
53
* [StringBase] contains common methods used by concrete String
66
54
* implementations, e.g., OneByteString.
@@ -587,16 +575,18 @@ abstract final class StringBase implements String {
587
575
String replaceRange (int start, int ? end, String replacement) {
588
576
final length = this .length;
589
577
final localEnd = RangeError .checkValidRange (start, end, length);
590
- bool replacementIsOneByte = replacement._isOneByte ;
578
+ bool replacementIsOneByte = replacement is OneByteString ;
591
579
if (start == 0 && localEnd == length) return replacement;
592
580
int replacementLength = replacement.length;
593
581
int totalLength = start + (length - localEnd) + replacementLength;
594
- if (replacementIsOneByte && this ._isOneByte) {
595
- var result = OneByteString .withLength (totalLength);
582
+ if (replacementIsOneByte && this is OneByteString ) {
583
+ final this_ = unsafeCast <OneByteString >(this );
584
+ final result = OneByteString .withLength (totalLength);
596
585
int index = 0 ;
597
- index = result._setRange (index, this , 0 , start);
598
- index = result._setRange (start, replacement, 0 , replacementLength);
599
- result._setRange (index, this , localEnd, length);
586
+ index = result._setRange (index, this_, 0 , start);
587
+ index = result._setRange (
588
+ start, unsafeCast <OneByteString >(replacement), 0 , replacementLength);
589
+ result._setRange (index, this_, localEnd, length);
600
590
return result;
601
591
}
602
592
List slices = [];
@@ -643,10 +633,10 @@ abstract final class StringBase implements String {
643
633
// No match, or a zero-length match at start with zero-length replacement.
644
634
if (startIndex == 0 && length == 0 ) return this ;
645
635
length += _addReplaceSlice (matches, startIndex, this .length);
646
- bool replacementIsOneByte = replacement._isOneByte ;
636
+ bool replacementIsOneByte = replacement is OneByteString ;
647
637
if (replacementIsOneByte &&
648
638
length < _maxJoinReplaceOneByteStringLength &&
649
- this ._isOneByte ) {
639
+ this is OneByteString ) {
650
640
// TODO(lrn): Is there a cut-off point, or is runtime always faster?
651
641
return _joinReplaceAllOneByteResult (this , matches, length);
652
642
}
@@ -794,14 +784,14 @@ abstract final class StringBase implements String {
794
784
matches.add (replacement);
795
785
length += replacement.length;
796
786
replacementStringsAreOneByte =
797
- replacementStringsAreOneByte && replacement._isOneByte ;
787
+ replacementStringsAreOneByte && replacement is OneByteString ;
798
788
startIndex = match.end;
799
789
}
800
790
if (matches.isEmpty) return this ;
801
791
length += _addReplaceSlice (matches, startIndex, this .length);
802
792
if (replacementStringsAreOneByte &&
803
793
length < _maxJoinReplaceOneByteStringLength &&
804
- this ._isOneByte ) {
794
+ this is OneByteString ) {
805
795
return _joinReplaceAllOneByteResult (this , matches, length);
806
796
}
807
797
return _joinReplaceAllResult (
@@ -1047,10 +1037,6 @@ final class OneByteString extends StringBase {
1047
1037
return StringBase ._isOneByteWhitespace (codeUnit);
1048
1038
}
1049
1039
1050
- bool operator == (Object other) {
1051
- return super == other;
1052
- }
1053
-
1054
1040
@override
1055
1041
String _substringUncheckedInternal (int startIndex, int endIndex) {
1056
1042
final length = endIndex - startIndex;
@@ -1145,20 +1131,18 @@ final class OneByteString extends StringBase {
1145
1131
String operator * (int times) {
1146
1132
if (times <= 0 ) return "" ;
1147
1133
if (times == 1 ) return this ;
1148
- int length = this .length;
1149
- if (this .isEmpty ) return this ; // Don't clone empty string.
1150
- OneByteString result = OneByteString .withLength (length * times);
1151
- int index = 0 ;
1134
+ final int length = this .length;
1135
+ if (length == 0 ) return this ; // Don't clone empty string.
1136
+ final OneByteString result = OneByteString .withLength (length * times);
1137
+ final WasmIntArray < WasmI8 > array = result._array ;
1152
1138
for (int i = 0 ; i < times; i++ ) {
1153
- for (int j = 0 ; j < length; j++ ) {
1154
- result._setAt (index++ , this .codeUnitAt (j));
1155
- }
1139
+ array.copy (i * length, _array, 0 , length);
1156
1140
}
1157
1141
return result;
1158
1142
}
1159
1143
1160
1144
String padLeft (int width, [String padding = ' ' ]) {
1161
- if (! padding._isOneByte ) {
1145
+ if (padding is ! OneByteString ) {
1162
1146
return super .padLeft (width, padding);
1163
1147
}
1164
1148
int length = this .length;
@@ -1187,7 +1171,7 @@ final class OneByteString extends StringBase {
1187
1171
}
1188
1172
1189
1173
String padRight (int width, [String padding = ' ' ]) {
1190
- if (! padding._isOneByte ) {
1174
+ if (padding is ! OneByteString ) {
1191
1175
return super .padRight (width, padding);
1192
1176
}
1193
1177
int length = this .length;
@@ -1316,21 +1300,16 @@ final class OneByteString extends StringBase {
1316
1300
_array.write (index, codePoint);
1317
1301
}
1318
1302
1319
- // Should be optimizable to a memory move.
1320
- // Accepts both OneByteString and _ExternalOneByteString as argument.
1321
- // Returns index after last character written.
1322
- int _setRange (int index, String oneByteString, int start, int end) {
1323
- assert (oneByteString._isOneByte);
1303
+ /// Returns index after last character written.
1304
+ int _setRange (int index, OneByteString oneByteString, int start, int end) {
1324
1305
assert (0 <= start);
1325
1306
assert (start <= end);
1326
1307
assert (end <= oneByteString.length);
1327
1308
assert (0 <= index);
1328
1309
assert (index + (end - start) <= length);
1329
- for (int i = start; i < end; i++ ) {
1330
- _setAt (index, oneByteString.codeUnitAt (i));
1331
- index += 1 ;
1332
- }
1333
- return index;
1310
+ final rangeLength = end - start;
1311
+ _array.copy (index, oneByteString._array, start, rangeLength);
1312
+ return index + rangeLength;
1334
1313
}
1335
1314
}
1336
1315
@@ -1384,10 +1363,6 @@ final class TwoByteString extends StringBase {
1384
1363
@override
1385
1364
int get length => _array.length;
1386
1365
1387
- bool operator == (Object other) {
1388
- return super == other;
1389
- }
1390
-
1391
1366
@override
1392
1367
String _substringUncheckedInternal (int startIndex, int endIndex) {
1393
1368
final length = endIndex - startIndex;
0 commit comments