[dart2wasm] Support unmodifiable typed data views.
Also wires up a couple of missing APIs for some of the simd lists. Change-Id: I9da5be59bc3b4553cb27c570f9d7c0b98b10409b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/264890 Reviewed-by: Ömer Ağacan <omersa@google.com> Commit-Queue: Joshua Litt <joshualitt@google.com>
This commit is contained in:
committed by
Commit Queue
parent
27d417dc09
commit
a73e8c2cf2
@@ -1307,8 +1307,9 @@ class Intrinsifier {
|
||||
if (member.isFactory) {
|
||||
String className = member.enclosingClass!.name;
|
||||
|
||||
Match? match = RegExp("^(Int|Uint|Float)(8|16|32|64)(Clamped)?List\$")
|
||||
.matchAsPrefix(className);
|
||||
Match? match =
|
||||
RegExp("^(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?List\$")
|
||||
.matchAsPrefix(className);
|
||||
if (match != null) {
|
||||
int shift = int.parse(match.group(2)!).bitLength - 4;
|
||||
Class cls = member.enclosingLibrary.classes
|
||||
@@ -1334,10 +1335,7 @@ class Intrinsifier {
|
||||
return true;
|
||||
}
|
||||
|
||||
match = RegExp("^_(Int|Uint|Float)(8|16|32|64)(Clamped)?ArrayView\$")
|
||||
.matchAsPrefix(className);
|
||||
if (match != null ||
|
||||
member.enclosingClass == translator.byteDataViewClass) {
|
||||
bool _createView() {
|
||||
ClassInfo info = translator.classInfo[member.enclosingClass]!;
|
||||
translator.functions.allocateClass(info.classId);
|
||||
|
||||
@@ -1354,6 +1352,22 @@ class Intrinsifier {
|
||||
b.struct_new(info.struct);
|
||||
return true;
|
||||
}
|
||||
|
||||
match = RegExp(
|
||||
"^_(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
|
||||
.matchAsPrefix(className);
|
||||
if (match != null ||
|
||||
member.enclosingClass == translator.byteDataViewClass) {
|
||||
return _createView();
|
||||
}
|
||||
|
||||
match = RegExp(
|
||||
"^_Unmodifiable(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
|
||||
.matchAsPrefix(className);
|
||||
if (match != null ||
|
||||
member.enclosingClass == translator.unmodifiableByteDataViewClass) {
|
||||
return _createView();
|
||||
}
|
||||
}
|
||||
|
||||
// _TypedListBase.length
|
||||
|
||||
@@ -105,6 +105,7 @@ class Translator {
|
||||
late final Class typedListClass;
|
||||
late final Class typedListViewClass;
|
||||
late final Class byteDataViewClass;
|
||||
late final Class unmodifiableByteDataViewClass;
|
||||
late final Class typeErrorClass;
|
||||
late final Class typeUniverseClass;
|
||||
late final Class symbolClass;
|
||||
@@ -249,6 +250,8 @@ class Translator {
|
||||
typedListClass = lookupTypedData("_TypedList");
|
||||
typedListViewClass = lookupTypedData("_TypedListView");
|
||||
byteDataViewClass = lookupTypedData("_ByteDataView");
|
||||
unmodifiableByteDataViewClass =
|
||||
lookupTypedData("_UnmodifiableByteDataView");
|
||||
symbolClass = lookupInternal("Symbol");
|
||||
wasmFunctionCall =
|
||||
wasmFunctionClass.procedures.firstWhere((p) => p.name.text == "call");
|
||||
|
||||
@@ -4627,6 +4627,7 @@ class _Float64ArrayView extends _TypedListView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _Float32x4ArrayView extends _TypedListView
|
||||
with _Float32x4ListMixin
|
||||
implements Float32x4List {
|
||||
@@ -4666,6 +4667,7 @@ class _Float32x4ArrayView extends _TypedListView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _Int32x4ArrayView extends _TypedListView
|
||||
with _Int32x4ListMixin
|
||||
implements Int32x4List {
|
||||
@@ -4705,6 +4707,7 @@ class _Int32x4ArrayView extends _TypedListView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _Float64x2ArrayView extends _TypedListView
|
||||
with _Float64x2ListMixin
|
||||
implements Float64x2List {
|
||||
@@ -5250,6 +5253,7 @@ abstract class UnmodifiableFloat64ListView implements Float64List {
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableInt8ArrayView extends _Int8ArrayView
|
||||
implements UnmodifiableInt8ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5266,6 +5270,7 @@ class _UnmodifiableInt8ArrayView extends _Int8ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
|
||||
implements UnmodifiableUint8ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5282,6 +5287,7 @@ class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
|
||||
implements UnmodifiableUint8ClampedListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5298,6 +5304,7 @@ class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableInt16ArrayView extends _Int16ArrayView
|
||||
implements UnmodifiableInt16ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5314,6 +5321,7 @@ class _UnmodifiableInt16ArrayView extends _Int16ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
|
||||
implements UnmodifiableUint16ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5330,6 +5338,7 @@ class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableInt32ArrayView extends _Int32ArrayView
|
||||
implements UnmodifiableInt32ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5346,6 +5355,7 @@ class _UnmodifiableInt32ArrayView extends _Int32ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
|
||||
implements UnmodifiableUint32ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5362,6 +5372,7 @@ class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableInt64ArrayView extends _Int64ArrayView
|
||||
implements UnmodifiableInt64ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5378,6 +5389,7 @@ class _UnmodifiableInt64ArrayView extends _Int64ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
|
||||
implements UnmodifiableUint64ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5394,6 +5406,7 @@ class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
|
||||
implements UnmodifiableFloat32ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5410,6 +5423,7 @@ class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
|
||||
implements UnmodifiableFloat64ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5426,6 +5440,7 @@ class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
|
||||
implements UnmodifiableFloat32x4ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5442,6 +5457,7 @@ class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
|
||||
implements UnmodifiableInt32x4ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5458,6 +5474,7 @@ class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
|
||||
implements UnmodifiableFloat64x2ListView {
|
||||
@pragma("vm:recognized", "other")
|
||||
@@ -5474,6 +5491,7 @@ class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
|
||||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
@pragma("wasm:entry-point")
|
||||
class _UnmodifiableByteDataView extends _ByteDataView
|
||||
implements UnmodifiableByteDataView {
|
||||
@pragma("vm:recognized", "other")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'dart:collection' show ListMixin;
|
||||
import 'dart:_internal' show patch, FixedLengthListMixin;
|
||||
import 'dart:_internal' show patch, FixedLengthListMixin, unsafeCast;
|
||||
import 'dart:math' as math;
|
||||
|
||||
// These are naive patches for SIMD typed data which we can use until Wasm
|
||||
@@ -40,6 +40,35 @@ class Float64x2List {
|
||||
_NaiveFloat64x2List.fromList;
|
||||
}
|
||||
|
||||
@patch
|
||||
abstract class UnmodifiableInt32x4ListView implements Int32x4List {
|
||||
factory UnmodifiableInt32x4ListView(Int32x4List list) =>
|
||||
new _UnmodifiableInt32x4ArrayView._(
|
||||
unsafeCast<_TypedList>(unsafeCast<_NaiveInt32x4List>(list)._storage),
|
||||
list.offsetInBytes,
|
||||
list.length);
|
||||
}
|
||||
|
||||
@patch
|
||||
abstract class UnmodifiableFloat32x4ListView implements Float32x4List {
|
||||
factory UnmodifiableFloat32x4ListView(Float32x4List list) =>
|
||||
new _UnmodifiableFloat32x4ArrayView._(
|
||||
unsafeCast<_TypedList>(
|
||||
unsafeCast<_NaiveFloat32x4List>(list)._storage),
|
||||
list.offsetInBytes,
|
||||
list.length);
|
||||
}
|
||||
|
||||
@patch
|
||||
abstract class UnmodifiableFloat64x2ListView implements Float64x2List {
|
||||
factory UnmodifiableFloat64x2ListView(Float64x2List list) =>
|
||||
new _UnmodifiableFloat64x2ArrayView._(
|
||||
unsafeCast<_TypedList>(
|
||||
unsafeCast<_NaiveFloat64x2List>(list)._storage),
|
||||
list.offsetInBytes,
|
||||
list.length);
|
||||
}
|
||||
|
||||
@patch
|
||||
class Int32x4 {
|
||||
@patch
|
||||
@@ -834,6 +863,55 @@ class _NaiveInt32x4 implements Int32x4 {
|
||||
}
|
||||
}
|
||||
|
||||
@patch
|
||||
abstract class _TypedList extends _TypedListBase {
|
||||
Float32x4 _getFloat32x4(int offsetInBytes) {
|
||||
ByteData data = buffer.asByteData();
|
||||
return Float32x4(
|
||||
data.getFloat32(offsetInBytes + 0 * 4, Endian.host),
|
||||
data.getFloat32(offsetInBytes + 1 * 4, Endian.host),
|
||||
data.getFloat32(offsetInBytes + 2 * 4, Endian.host),
|
||||
data.getFloat32(offsetInBytes + 3 * 4, Endian.host));
|
||||
}
|
||||
|
||||
void _setFloat32x4(int offsetInBytes, Float32x4 value) {
|
||||
ByteData data = buffer.asByteData();
|
||||
data.setFloat32(offsetInBytes + 0 * 4, value.x, Endian.host);
|
||||
data.setFloat32(offsetInBytes + 1 * 4, value.y, Endian.host);
|
||||
data.setFloat32(offsetInBytes + 2 * 4, value.z, Endian.host);
|
||||
data.setFloat32(offsetInBytes + 3 * 4, value.w, Endian.host);
|
||||
}
|
||||
|
||||
Int32x4 _getInt32x4(int offsetInBytes) {
|
||||
ByteData data = buffer.asByteData();
|
||||
return Int32x4(
|
||||
data.getInt32(offsetInBytes + 0 * 4, Endian.host),
|
||||
data.getInt32(offsetInBytes + 1 * 4, Endian.host),
|
||||
data.getInt32(offsetInBytes + 2 * 4, Endian.host),
|
||||
data.getInt32(offsetInBytes + 3 * 4, Endian.host));
|
||||
}
|
||||
|
||||
void _setInt32x4(int offsetInBytes, Int32x4 value) {
|
||||
ByteData data = buffer.asByteData();
|
||||
data.setInt32(offsetInBytes + 0 * 4, value.x, Endian.host);
|
||||
data.setInt32(offsetInBytes + 1 * 4, value.y, Endian.host);
|
||||
data.setInt32(offsetInBytes + 2 * 4, value.z, Endian.host);
|
||||
data.setInt32(offsetInBytes + 3 * 4, value.w, Endian.host);
|
||||
}
|
||||
|
||||
Float64x2 _getFloat64x2(int offsetInBytes) {
|
||||
ByteData data = buffer.asByteData();
|
||||
return Float64x2(data.getFloat64(offsetInBytes + 0 * 8, Endian.host),
|
||||
data.getFloat64(offsetInBytes + 1 * 8, Endian.host));
|
||||
}
|
||||
|
||||
void _setFloat64x2(int offsetInBytes, Float64x2 value) {
|
||||
ByteData data = buffer.asByteData();
|
||||
data.setFloat64(offsetInBytes + 0 * 8, value.x, Endian.host);
|
||||
data.setFloat64(offsetInBytes + 1 * 8, value.y, Endian.host);
|
||||
}
|
||||
}
|
||||
|
||||
int _checkValidRange(int start, int? end, int length) {
|
||||
if (start > length) {
|
||||
throw RangeError.range(start, 0, length, 'checkValidRange');
|
||||
|
||||
Reference in New Issue
Block a user