Skip to content

Commit fa7c42a

Browse files
osa1Commit Queue
authored and
Commit Queue
committed
[dart2wasm] Small optimizations and simplifications in string and convert patches
Change-Id: I3838f052cff13734cd5612785a5724454231be8b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331183 Reviewed-by: Jackson Gardner <[email protected]> Commit-Queue: Ömer Ağacan <[email protected]>
1 parent 9e75379 commit fa7c42a

File tree

2 files changed

+24
-56
lines changed

2 files changed

+24
-56
lines changed

sdk/lib/_internal/wasm/lib/convert_patch.dart

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,6 @@ abstract class _ChunkedJsonParser<T> {
10881088
if (position == end) return position;
10891089
start = position;
10901090
}
1091-
return -1; // UNREACHABLE.
10921091
}
10931092

10941093
/**
@@ -1643,7 +1642,6 @@ class _Utf8Decoder {
16431642
_bomIndex = -1;
16441643
}
16451644

1646-
@pragma("vm:prefer-inline")
16471645
int scan(Uint8List bytes, int start, int end) {
16481646
// Assumes 0 <= start <= end <= bytes.length
16491647
int size = 0;
@@ -1658,9 +1656,6 @@ class _Utf8Decoder {
16581656
return size;
16591657
}
16601658

1661-
@pragma("vm:recognized", "other")
1662-
@pragma("vm:prefer-inline")
1663-
@pragma("vm:idempotent")
16641659
int _scan(Uint8List bytes, int start, int end, String scanTable) {
16651660
int size = 0;
16661661
int flags = 0;
@@ -1846,7 +1841,6 @@ class _Utf8Decoder {
18461841
return result;
18471842
}
18481843

1849-
@pragma("vm:prefer-inline")
18501844
int skipBomSingle(Uint8List bytes, int start, int end) {
18511845
if (end - start >= 3 &&
18521846
bytes[start] == 0xEF &&
@@ -1857,7 +1851,6 @@ class _Utf8Decoder {
18571851
return start;
18581852
}
18591853

1860-
@pragma("vm:prefer-inline")
18611854
int skipBomChunked(Uint8List bytes, int start, int end) {
18621855
assert(start <= end);
18631856
int bomIndex = _bomIndex;

sdk/lib/_internal/wasm/lib/string.dart

Lines changed: 24 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,8 @@ import "dart:_internal"
88
show
99
CodeUnits,
1010
ClassID,
11-
copyRangeFromUint8ListToOneByteString,
12-
doubleToIntBits,
1311
EfficientLengthIterable,
14-
intBitsToDouble,
15-
IterableElementError,
16-
jsonEncode,
17-
Lists,
18-
mix64,
1912
makeListFixedLength,
20-
patch,
2113
unsafeCast;
2214

2315
import 'dart:_js_helper' show JS;
@@ -57,10 +49,6 @@ String _toUpperCase(String string) => JS<String>(
5749
String _toLowerCase(String string) => JS<String>(
5850
"s => stringToDartString(stringFromDartString(s).toLowerCase())", string);
5951

60-
extension _StringExtension on String {
61-
bool get _isOneByte => this is OneByteString;
62-
}
63-
6452
/**
6553
* [StringBase] contains common methods used by concrete String
6654
* implementations, e.g., OneByteString.
@@ -587,16 +575,18 @@ abstract final class StringBase implements String {
587575
String replaceRange(int start, int? end, String replacement) {
588576
final length = this.length;
589577
final localEnd = RangeError.checkValidRange(start, end, length);
590-
bool replacementIsOneByte = replacement._isOneByte;
578+
bool replacementIsOneByte = replacement is OneByteString;
591579
if (start == 0 && localEnd == length) return replacement;
592580
int replacementLength = replacement.length;
593581
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);
596585
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);
600590
return result;
601591
}
602592
List slices = [];
@@ -643,10 +633,10 @@ abstract final class StringBase implements String {
643633
// No match, or a zero-length match at start with zero-length replacement.
644634
if (startIndex == 0 && length == 0) return this;
645635
length += _addReplaceSlice(matches, startIndex, this.length);
646-
bool replacementIsOneByte = replacement._isOneByte;
636+
bool replacementIsOneByte = replacement is OneByteString;
647637
if (replacementIsOneByte &&
648638
length < _maxJoinReplaceOneByteStringLength &&
649-
this._isOneByte) {
639+
this is OneByteString) {
650640
// TODO(lrn): Is there a cut-off point, or is runtime always faster?
651641
return _joinReplaceAllOneByteResult(this, matches, length);
652642
}
@@ -794,14 +784,14 @@ abstract final class StringBase implements String {
794784
matches.add(replacement);
795785
length += replacement.length;
796786
replacementStringsAreOneByte =
797-
replacementStringsAreOneByte && replacement._isOneByte;
787+
replacementStringsAreOneByte && replacement is OneByteString;
798788
startIndex = match.end;
799789
}
800790
if (matches.isEmpty) return this;
801791
length += _addReplaceSlice(matches, startIndex, this.length);
802792
if (replacementStringsAreOneByte &&
803793
length < _maxJoinReplaceOneByteStringLength &&
804-
this._isOneByte) {
794+
this is OneByteString) {
805795
return _joinReplaceAllOneByteResult(this, matches, length);
806796
}
807797
return _joinReplaceAllResult(
@@ -1047,10 +1037,6 @@ final class OneByteString extends StringBase {
10471037
return StringBase._isOneByteWhitespace(codeUnit);
10481038
}
10491039

1050-
bool operator ==(Object other) {
1051-
return super == other;
1052-
}
1053-
10541040
@override
10551041
String _substringUncheckedInternal(int startIndex, int endIndex) {
10561042
final length = endIndex - startIndex;
@@ -1145,20 +1131,18 @@ final class OneByteString extends StringBase {
11451131
String operator *(int times) {
11461132
if (times <= 0) return "";
11471133
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;
11521138
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);
11561140
}
11571141
return result;
11581142
}
11591143

11601144
String padLeft(int width, [String padding = ' ']) {
1161-
if (!padding._isOneByte) {
1145+
if (padding is! OneByteString) {
11621146
return super.padLeft(width, padding);
11631147
}
11641148
int length = this.length;
@@ -1187,7 +1171,7 @@ final class OneByteString extends StringBase {
11871171
}
11881172

11891173
String padRight(int width, [String padding = ' ']) {
1190-
if (!padding._isOneByte) {
1174+
if (padding is! OneByteString) {
11911175
return super.padRight(width, padding);
11921176
}
11931177
int length = this.length;
@@ -1316,21 +1300,16 @@ final class OneByteString extends StringBase {
13161300
_array.write(index, codePoint);
13171301
}
13181302

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) {
13241305
assert(0 <= start);
13251306
assert(start <= end);
13261307
assert(end <= oneByteString.length);
13271308
assert(0 <= index);
13281309
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;
13341313
}
13351314
}
13361315

@@ -1384,10 +1363,6 @@ final class TwoByteString extends StringBase {
13841363
@override
13851364
int get length => _array.length;
13861365

1387-
bool operator ==(Object other) {
1388-
return super == other;
1389-
}
1390-
13911366
@override
13921367
String _substringUncheckedInternal(int startIndex, int endIndex) {
13931368
final length = endIndex - startIndex;

0 commit comments

Comments
 (0)