From 0a436b700541370f301662cb6ffde7de33824177 Mon Sep 17 00:00:00 2001 From: Stephen Adams Date: Mon, 23 Oct 2023 18:14:33 +0000 Subject: [PATCH] Reapply "[typed_data] Deprecate UnmodifiableUint8ListView and friends" This reverts commit 4918d3ef8c2c4ccd55e5b4110da6d89581926d2b. `@Deprecated` annotations have been commented out. CoreLibraryReviewExempt: reviewed as https://dart-review.googlesource.com/c/sdk/+/321922 TEST=ci Bug: #53785 Change-Id: I3239251c2aba5f188aa947f0ff0208271d6be5cc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331741 Commit-Queue: Stephen Adams Reviewed-by: Lasse Nielsen Reviewed-by: Derek Xu --- CHANGELOG.md | 26 ++ .../patch/typed_data_patch.dart | 30 +++ .../private/native_typed_data.dart | 27 ++ .../js_runtime/lib/native_typed_data.dart | 28 ++ .../js_runtime/lib/typed_data_patch.dart | 30 +++ .../_internal/vm/lib/typed_data_patch.dart | 241 +++++++++++++++--- .../_internal/wasm/lib/js_typed_array.dart | 46 ++++ sdk/lib/_internal/wasm/lib/simd.dart | 6 + sdk/lib/_internal/wasm/lib/typed_data.dart | 71 ++++++ .../wasm_js_compatibility/lib/typed_data.dart | 45 ++++ sdk/lib/typed_data/typed_data.dart | 62 ++++- .../typed_data/unmodifiable_typed_data.dart | 19 +- .../unmodifiable_typed_data_simd_test.dart | 147 +++++++++++ .../unmodifiable_typed_data_test.dart | 121 ++++++++- 14 files changed, 844 insertions(+), 55 deletions(-) create mode 100644 tests/lib/typed_data/unmodifiable_typed_data_simd_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 786a7821f6a..716b5c30716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ ## 3.3.0 +### Libraries + +#### `dart:typed_data` + +- **BREAKING CHANGE** (https://github.com/dart-lang/sdk/issues/53218) The + unmodifiable view classes for typed data are deprecated. Instead of using the + constructors for these classes to create an unmodifiable view, e.g. + + ```dart + Uint8List data = ... + final readOnlyView = UnmodifableUint8ListView(data); + ``` + + use the new `asUnmodifiableView()` method: + + ```dart + Uint8List data = ... + final readOnlyView = data.asUnmodifiableView(); + ``` + + The reason for this change is to allow more flexibility in the implementation + of typed data so the native and web platforms can use different strategies + for ensuring typed data has good performance. + + The deprecated types will be removed in the next Dart version. + ### Tools #### Dart command line diff --git a/sdk/lib/_internal/js_dev_runtime/patch/typed_data_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/typed_data_patch.dart index 3ce3da0d142..57d63b84fbc 100644 --- a/sdk/lib/_internal/js_dev_runtime/patch/typed_data_patch.dart +++ b/sdk/lib/_internal/js_dev_runtime/patch/typed_data_patch.dart @@ -264,6 +264,8 @@ final class _UnmodifiableByteDataView _UnmodifiableByteDataView(ByteData data) : _data = data; + ByteData asUnmodifiableView() => this; + int getInt8(int byteOffset) => _data.getInt8(byteOffset); void setInt8(int byteOffset, int value) => _unsupported(); @@ -372,6 +374,8 @@ final class _UnmodifiableUint8ListView extends UnmodifiableListBase final Uint8List _list; _UnmodifiableUint8ListView(Uint8List list) : _list = list; + Uint8List asUnmodifiableView() => this; + Uint8List _createList(int length) => Uint8List(length); } @@ -385,6 +389,8 @@ final class _UnmodifiableInt8ListView extends UnmodifiableListBase final Int8List _list; _UnmodifiableInt8ListView(Int8List list) : _list = list; + Int8List asUnmodifiableView() => this; + Int8List _createList(int length) => Int8List(length); } @@ -398,6 +404,8 @@ final class _UnmodifiableUint8ClampedListView extends UnmodifiableListBase final Uint8ClampedList _list; _UnmodifiableUint8ClampedListView(Uint8ClampedList list) : _list = list; + Uint8ClampedList asUnmodifiableView() => this; + Uint8ClampedList _createList(int length) => Uint8ClampedList(length); } @@ -411,6 +419,8 @@ final class _UnmodifiableUint16ListView extends UnmodifiableListBase final Uint16List _list; _UnmodifiableUint16ListView(Uint16List list) : _list = list; + Uint16List asUnmodifiableView() => this; + Uint16List _createList(int length) => Uint16List(length); } @@ -424,6 +434,8 @@ final class _UnmodifiableInt16ListView extends UnmodifiableListBase final Int16List _list; _UnmodifiableInt16ListView(Int16List list) : _list = list; + Int16List asUnmodifiableView() => this; + Int16List _createList(int length) => Int16List(length); } @@ -437,6 +449,8 @@ final class _UnmodifiableUint32ListView extends UnmodifiableListBase final Uint32List _list; _UnmodifiableUint32ListView(Uint32List list) : _list = list; + Uint32List asUnmodifiableView() => this; + Uint32List _createList(int length) => Uint32List(length); } @@ -450,6 +464,8 @@ final class _UnmodifiableInt32ListView extends UnmodifiableListBase final Int32List _list; _UnmodifiableInt32ListView(Int32List list) : _list = list; + Int32List asUnmodifiableView() => this; + Int32List _createList(int length) => Int32List(length); } @@ -463,6 +479,8 @@ final class _UnmodifiableUint64ListView extends UnmodifiableListBase final Uint64List _list; _UnmodifiableUint64ListView(Uint64List list) : _list = list; + Uint64List asUnmodifiableView() => this; + Uint64List _createList(int length) => Uint64List(length); } @@ -476,6 +494,8 @@ final class _UnmodifiableInt64ListView extends UnmodifiableListBase final Int64List _list; _UnmodifiableInt64ListView(Int64List list) : _list = list; + Int64List asUnmodifiableView() => this; + Int64List _createList(int length) => Int64List(length); } @@ -489,6 +509,8 @@ final class _UnmodifiableInt32x4ListView extends UnmodifiableListBase final Int32x4List _list; _UnmodifiableInt32x4ListView(Int32x4List list) : _list = list; + Int32x4List asUnmodifiableView() => this; + Int32x4List _createList(int length) => Int32x4List(length); } @@ -503,6 +525,8 @@ final class _UnmodifiableFloat32x4ListView final Float32x4List _list; _UnmodifiableFloat32x4ListView(Float32x4List list) : _list = list; + Float32x4List asUnmodifiableView() => this; + Float32x4List _createList(int length) => Float32x4List(length); } @@ -517,6 +541,8 @@ final class _UnmodifiableFloat64x2ListView final Float64x2List _list; _UnmodifiableFloat64x2ListView(Float64x2List list) : _list = list; + Float64x2List asUnmodifiableView() => this; + Float64x2List _createList(int length) => Float64x2List(length); } @@ -530,6 +556,8 @@ final class _UnmodifiableFloat32ListView extends UnmodifiableListBase final Float32List _list; _UnmodifiableFloat32ListView(Float32List list) : _list = list; + Float32List asUnmodifiableView() => this; + Float32List _createList(int length) => Float32List(length); } @@ -543,6 +571,8 @@ final class _UnmodifiableFloat64ListView extends UnmodifiableListBase final Float64List _list; _UnmodifiableFloat64ListView(Float64List list) : _list = list; + Float64List asUnmodifiableView() => this; + Float64List _createList(int length) => Float64List(length); } diff --git a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart index f950311847a..12c43888380 100644 --- a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart +++ b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart @@ -162,6 +162,8 @@ final class NativeFloat32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + Float32x4List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeFloat32x4List._externalStorage( @@ -234,6 +236,8 @@ final class NativeInt32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + Int32x4List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeInt32x4List._externalStorage( @@ -300,6 +304,8 @@ final class NativeFloat64x2List extends Object _storage[(index * 2) + 1] = value.y; } + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + Float64x2List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeFloat64x2List._externalStorage( @@ -407,6 +413,8 @@ final class NativeByteData extends NativeTypedData implements ByteData { int get elementSizeInBytes => 1; + ByteData asUnmodifiableView() => UnmodifiableByteDataView(this); + /// Returns the floating point number represented by the four bytes at /// the specified [byteOffset] in this object, in IEEE 754 /// single-precision binary floating-point format (binary32). @@ -757,6 +765,8 @@ final class NativeFloat32List extends NativeTypedArrayOfDouble Type get runtimeType => Float32List; + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + Float32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -789,6 +799,8 @@ final class NativeFloat64List extends NativeTypedArrayOfDouble Type get runtimeType => Float64List; + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + Float64List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, stop); @@ -824,6 +836,8 @@ final class NativeInt16List extends NativeTypedArrayOfInt implements Int16List { return JS('!', '#[#]', this, index); } + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + Int16List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, stop); @@ -859,6 +873,8 @@ final class NativeInt32List extends NativeTypedArrayOfInt implements Int32List { return JS('!', '#[#]', this, index); } + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + Int32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -895,6 +911,8 @@ final class NativeInt8List extends NativeTypedArrayOfInt implements Int8List { return JS('!', '#[#]', this, index); } + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + Int8List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('!', '#.subarray(#, #)', this, start, stop); @@ -934,6 +952,8 @@ final class NativeUint16List extends NativeTypedArrayOfInt return JS('!', '#[#]', this, index); } + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + Uint16List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -971,6 +991,8 @@ final class NativeUint32List extends NativeTypedArrayOfInt return JS('!', '#[#]', this, index); } + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + Uint32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -1010,6 +1032,9 @@ final class NativeUint8ClampedList extends NativeTypedArrayOfInt return JS('!', '#[#]', this, index); } + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + Uint8ClampedList sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -1060,6 +1085,8 @@ final class NativeUint8List extends NativeTypedArrayOfInt implements Uint8List { return JS('!', '#[#]', this, index); } + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + Uint8List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart index 224a45c2aca..88e647749ec 100644 --- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart +++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart @@ -8,6 +8,7 @@ library dart.typed_data.implementation; import 'dart:collection' show ListMixin; import 'dart:_internal' show FixedLengthListMixin hide Symbol; +import "dart:_internal" show UnmodifiableListBase; import 'dart:_interceptors' show JavaScriptObject, JSIndexable, JSUInt32, JSUInt31; import 'dart:_js_helper' @@ -167,6 +168,8 @@ final class NativeFloat32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + Float32x4List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeFloat32x4List._externalStorage( @@ -239,6 +242,8 @@ final class NativeInt32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + Int32x4List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeInt32x4List._externalStorage( @@ -305,6 +310,8 @@ final class NativeFloat64x2List extends Object _storage[(index * 2) + 1] = value.y; } + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + Float64x2List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); return NativeFloat64x2List._externalStorage( @@ -413,6 +420,8 @@ final class NativeByteData extends NativeTypedData int get elementSizeInBytes => 1; + ByteData asUnmodifiableView() => UnmodifiableByteDataView(this); + /// Returns the floating point number represented by the four bytes at /// the specified [byteOffset] in this object, in IEEE 754 /// single-precision binary floating-point format (binary32). @@ -759,6 +768,8 @@ final class NativeFloat32List extends NativeTypedArrayOfDouble Type get runtimeType => Float32List; + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + Float32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, stop); @@ -795,6 +806,8 @@ final class NativeFloat64List extends NativeTypedArrayOfDouble Type get runtimeType => Float64List; + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + Float64List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, stop); @@ -836,6 +849,8 @@ final class NativeInt16List extends NativeTypedArrayOfInt return JS('int', '#[#]', this, index); } + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + Int16List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, stop); @@ -877,6 +892,8 @@ final class NativeInt32List extends NativeTypedArrayOfInt return JS('int', '#[#]', this, index); } + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + Int32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, stop); @@ -918,6 +935,8 @@ final class NativeInt8List extends NativeTypedArrayOfInt return JS('int', '#[#]', this, index); } + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + Int8List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, stop); @@ -962,6 +981,8 @@ final class NativeUint16List extends NativeTypedArrayOfInt return JS('JSUInt31', '#[#]', this, index); } + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + Uint16List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, stop); @@ -1003,6 +1024,8 @@ final class NativeUint32List extends NativeTypedArrayOfInt return JS('JSUInt32', '#[#]', this, index); } + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + Uint32List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, stop); @@ -1047,6 +1070,9 @@ final class NativeUint8ClampedList extends NativeTypedArrayOfInt return JS('JSUInt31', '#[#]', this, index); } + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + Uint8ClampedList sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = @@ -1102,6 +1128,8 @@ final class NativeUint8List extends NativeTypedArrayOfInt return JS('JSUInt31', '#[#]', this, index); } + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + Uint8List sublist(int start, [int? end]) { var stop = _checkValidRange(start, end, this.length); var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, stop); diff --git a/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart b/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart index 3ce3da0d142..57d63b84fbc 100644 --- a/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart +++ b/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart @@ -264,6 +264,8 @@ final class _UnmodifiableByteDataView _UnmodifiableByteDataView(ByteData data) : _data = data; + ByteData asUnmodifiableView() => this; + int getInt8(int byteOffset) => _data.getInt8(byteOffset); void setInt8(int byteOffset, int value) => _unsupported(); @@ -372,6 +374,8 @@ final class _UnmodifiableUint8ListView extends UnmodifiableListBase final Uint8List _list; _UnmodifiableUint8ListView(Uint8List list) : _list = list; + Uint8List asUnmodifiableView() => this; + Uint8List _createList(int length) => Uint8List(length); } @@ -385,6 +389,8 @@ final class _UnmodifiableInt8ListView extends UnmodifiableListBase final Int8List _list; _UnmodifiableInt8ListView(Int8List list) : _list = list; + Int8List asUnmodifiableView() => this; + Int8List _createList(int length) => Int8List(length); } @@ -398,6 +404,8 @@ final class _UnmodifiableUint8ClampedListView extends UnmodifiableListBase final Uint8ClampedList _list; _UnmodifiableUint8ClampedListView(Uint8ClampedList list) : _list = list; + Uint8ClampedList asUnmodifiableView() => this; + Uint8ClampedList _createList(int length) => Uint8ClampedList(length); } @@ -411,6 +419,8 @@ final class _UnmodifiableUint16ListView extends UnmodifiableListBase final Uint16List _list; _UnmodifiableUint16ListView(Uint16List list) : _list = list; + Uint16List asUnmodifiableView() => this; + Uint16List _createList(int length) => Uint16List(length); } @@ -424,6 +434,8 @@ final class _UnmodifiableInt16ListView extends UnmodifiableListBase final Int16List _list; _UnmodifiableInt16ListView(Int16List list) : _list = list; + Int16List asUnmodifiableView() => this; + Int16List _createList(int length) => Int16List(length); } @@ -437,6 +449,8 @@ final class _UnmodifiableUint32ListView extends UnmodifiableListBase final Uint32List _list; _UnmodifiableUint32ListView(Uint32List list) : _list = list; + Uint32List asUnmodifiableView() => this; + Uint32List _createList(int length) => Uint32List(length); } @@ -450,6 +464,8 @@ final class _UnmodifiableInt32ListView extends UnmodifiableListBase final Int32List _list; _UnmodifiableInt32ListView(Int32List list) : _list = list; + Int32List asUnmodifiableView() => this; + Int32List _createList(int length) => Int32List(length); } @@ -463,6 +479,8 @@ final class _UnmodifiableUint64ListView extends UnmodifiableListBase final Uint64List _list; _UnmodifiableUint64ListView(Uint64List list) : _list = list; + Uint64List asUnmodifiableView() => this; + Uint64List _createList(int length) => Uint64List(length); } @@ -476,6 +494,8 @@ final class _UnmodifiableInt64ListView extends UnmodifiableListBase final Int64List _list; _UnmodifiableInt64ListView(Int64List list) : _list = list; + Int64List asUnmodifiableView() => this; + Int64List _createList(int length) => Int64List(length); } @@ -489,6 +509,8 @@ final class _UnmodifiableInt32x4ListView extends UnmodifiableListBase final Int32x4List _list; _UnmodifiableInt32x4ListView(Int32x4List list) : _list = list; + Int32x4List asUnmodifiableView() => this; + Int32x4List _createList(int length) => Int32x4List(length); } @@ -503,6 +525,8 @@ final class _UnmodifiableFloat32x4ListView final Float32x4List _list; _UnmodifiableFloat32x4ListView(Float32x4List list) : _list = list; + Float32x4List asUnmodifiableView() => this; + Float32x4List _createList(int length) => Float32x4List(length); } @@ -517,6 +541,8 @@ final class _UnmodifiableFloat64x2ListView final Float64x2List _list; _UnmodifiableFloat64x2ListView(Float64x2List list) : _list = list; + Float64x2List asUnmodifiableView() => this; + Float64x2List _createList(int length) => Float64x2List(length); } @@ -530,6 +556,8 @@ final class _UnmodifiableFloat32ListView extends UnmodifiableListBase final Float32List _list; _UnmodifiableFloat32ListView(Float32List list) : _list = list; + Float32List asUnmodifiableView() => this; + Float32List _createList(int length) => Float32List(length); } @@ -543,6 +571,8 @@ final class _UnmodifiableFloat64ListView extends UnmodifiableListBase final Float64List _list; _UnmodifiableFloat64ListView(Float64List list) : _list = list; + Float64List asUnmodifiableView() => this; + Float64List _createList(int length) => Float64List(length); } diff --git a/sdk/lib/_internal/vm/lib/typed_data_patch.dart b/sdk/lib/_internal/vm/lib/typed_data_patch.dart index f217cc9f7ce..dbe8dd6ff22 100644 --- a/sdk/lib/_internal/vm/lib/typed_data_patch.dart +++ b/sdk/lib/_internal/vm/lib/typed_data_patch.dart @@ -132,7 +132,7 @@ abstract final class _TypedListBase { return _slowSetRange(start, end, from, skipCount); } - // Method(s) implementing Object interface. + // Method(s) implementing the Object interface. String toString() => ListBase.listToString(this as List); // Internal utility methods. @@ -2190,7 +2190,7 @@ final class _Int8List extends _TypedList throw "Unreachable"; } - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { @@ -2210,11 +2210,14 @@ final class _Int8List extends _TypedList _setInt8(index, _toInt8(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int8List.bytesPerElement; } + // Method(s) implementing the Int8List interface. + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + // Internal utility methods. Int8List _createList(int length) { return new Int8List(length); @@ -2249,7 +2252,7 @@ final class _Uint8List extends _TypedList throw "Unreachable"; } - // Methods implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { @@ -2269,11 +2272,14 @@ final class _Uint8List extends _TypedList _setUint8(index, _toUint8(value)); } - // Methods implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8List interface. + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + // Internal utility methods. Uint8List _createList(int length) { return new Uint8List(length); @@ -2311,7 +2317,7 @@ final class _Uint8ClampedList extends _TypedList throw "Unreachable"; } - // Methods implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { @@ -2331,11 +2337,15 @@ final class _Uint8ClampedList extends _TypedList _setUint8(index, _toClampedUint8(value)); } - // Methods implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8ClampedList interface. + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + // Internal utility methods. Uint8ClampedList _createList(int length) { return new Uint8ClampedList(length); @@ -2375,7 +2385,7 @@ final class _Int16List extends _TypedList throw "Unreachable"; } - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:recognized", "graph-intrinsic") @pragma("vm:exact-result-type", "dart:core#_Smi") int operator [](int index) { @@ -2407,11 +2417,14 @@ final class _Int16List extends _TypedList } } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int16List.bytesPerElement; } + // Method(s) implementing the Int16List interface. + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + // Internal utility methods. Int16List _createList(int length) { return new Int16List(length); @@ -2491,6 +2504,9 @@ final class _Uint16List extends _TypedList return Uint16List.bytesPerElement; } + // Method(s) implementing the Uint16List interface. + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + // Internal utility methods. Uint16List _createList(int length) { return new Uint16List(length); @@ -2552,11 +2568,14 @@ final class _Int32List extends _TypedList _setIndexedInt32(index, _toInt32(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int32List.bytesPerElement; } + // Method(s) implementing the Int32List interface. + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + // Internal utility methods. Int32List _createList(int length) { return new Int32List(length); @@ -2623,6 +2642,9 @@ final class _Uint32List extends _TypedList return Uint32List.bytesPerElement; } + // Method(s) implementing the Uint32List interface. + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + // Internal utility methods. Uint32List _createList(int length) { return new Uint32List(length); @@ -2689,6 +2711,9 @@ final class _Int64List extends _TypedList return Int64List.bytesPerElement; } + // Method(s) implementing the Int64List interface. + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + // Internal utility methods. Int64List _createList(int length) { return new Int64List(length); @@ -2755,6 +2780,9 @@ final class _Uint64List extends _TypedList return Uint64List.bytesPerElement; } + // Method(s) implementing the Uint64List interface. + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + // Internal utility methods. Uint64List _createList(int length) { return new Uint64List(length); @@ -2822,6 +2850,9 @@ final class _Float32List extends _TypedList return Float32List.bytesPerElement; } + // Method(s) implementing the Float32List interface. + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + // Internal utility methods. Float32List _createList(int length) { return new Float32List(length); @@ -2889,6 +2920,9 @@ final class _Float64List extends _TypedList return Float64List.bytesPerElement; } + // Method(s) implementing the Float64List interface. + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + // Internal utility methods. Float64List _createList(int length) { return new Float64List(length); @@ -2955,6 +2989,9 @@ final class _Float32x4List extends _TypedList return Float32x4List.bytesPerElement; } + // Method(s) implementing the Float32x4List interface. + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + // Internal utility methods. Float32x4List _createList(int length) { return new Float32x4List(length); @@ -3021,6 +3058,9 @@ final class _Int32x4List extends _TypedList return Int32x4List.bytesPerElement; } + // Method(s) implementing the Int32x4List interface. + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + // Internal utility methods. Int32x4List _createList(int length) { return new Int32x4List(length); @@ -3087,6 +3127,9 @@ final class _Float64x2List extends _TypedList return Float64x2List.bytesPerElement; } + // Method(s) implementing the Float64x2List interface. + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + // Internal utility methods. Float64x2List _createList(int length) { return new Float64x2List(length); @@ -3136,6 +3179,9 @@ final class _ExternalInt8Array extends _TypedList return Int8List.bytesPerElement; } + // Method(s) implementing the Int8List interface. + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + // Internal utility methods. Int8List _createList(int length) { return new Int8List(length); @@ -3180,6 +3226,9 @@ final class _ExternalUint8Array extends _TypedList return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8ClampedList interface. + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + // Internal utility methods. Uint8List _createList(int length) { return new Uint8List(length); @@ -3227,6 +3276,10 @@ final class _ExternalUint8ClampedArray extends _TypedList return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8ClampedList interface. + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + // Internal utility methods. Uint8ClampedList _createList(int length) { return new Uint8ClampedList(length); @@ -3273,6 +3326,9 @@ final class _ExternalInt16Array extends _TypedList return Int16List.bytesPerElement; } + // Method(s) implementing the Int16List interface. + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + // Internal utility methods. Int16List _createList(int length) { return new Int16List(length); @@ -3322,6 +3378,9 @@ final class _ExternalUint16Array extends _TypedList return Uint16List.bytesPerElement; } + // Method(s) implementing the Uint16List interface. + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + // Internal utility methods. Uint16List _createList(int length) { return new Uint16List(length); @@ -3371,6 +3430,9 @@ final class _ExternalInt32Array extends _TypedList return Int32List.bytesPerElement; } + // Method(s) implementing the Int32List interface. + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + // Internal utility methods. Int32List _createList(int length) { return new Int32List(length); @@ -3420,6 +3482,9 @@ final class _ExternalUint32Array extends _TypedList return Uint32List.bytesPerElement; } + // Method(s) implementing the Uint32List interface. + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + // Internal utility methods. Uint32List _createList(int length) { return new Uint32List(length); @@ -3469,6 +3534,9 @@ final class _ExternalInt64Array extends _TypedList return Int64List.bytesPerElement; } + // Method(s) implementing the Int64List interface. + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + // Internal utility methods. Int64List _createList(int length) { return new Int64List(length); @@ -3518,6 +3586,9 @@ final class _ExternalUint64Array extends _TypedList return Uint64List.bytesPerElement; } + // Method(s) implementing the Uint64List interface. + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + // Internal utility methods. Uint64List _createList(int length) { return new Uint64List(length); @@ -3567,6 +3638,9 @@ final class _ExternalFloat32Array extends _TypedList return Float32List.bytesPerElement; } + // Method(s) implementing the Float32List interface. + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + // Internal utility methods. Float32List _createList(int length) { return new Float32List(length); @@ -3616,6 +3690,9 @@ final class _ExternalFloat64Array extends _TypedList return Float64List.bytesPerElement; } + // Method(s) implementing the Float64List interface. + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + // Internal utility methods. Float64List _createList(int length) { return new Float64List(length); @@ -3665,6 +3742,9 @@ final class _ExternalFloat32x4Array extends _TypedList return Float32x4List.bytesPerElement; } + // Method(s) implementing the Float32x4 interface. + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + // Internal utility methods. Float32x4List _createList(int length) { return new Float32x4List(length); @@ -3714,6 +3794,9 @@ final class _ExternalInt32x4Array extends _TypedList return Int32x4List.bytesPerElement; } + // Method(s) implementing the Int32x4List interface. + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + // Internal utility methods. Int32x4List _createList(int length) { return new Int32x4List(length); @@ -3763,6 +3846,9 @@ final class _ExternalFloat64x2Array extends _TypedList return Float64x2List.bytesPerElement; } + // Method(s) implementing the Float64x2List interface. + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + // Internal utility methods. Float64x2List _createList(int length) { return new Float64x2List(length); @@ -4344,7 +4430,7 @@ final class _Int8ArrayView extends _TypedListView external factory _Int8ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4365,11 +4451,14 @@ final class _Int8ArrayView extends _TypedListView offsetInBytes + (index * Int8List.bytesPerElement), _toInt8(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int8List.bytesPerElement; } + // Method(s) implementing the Int8List interface. + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + // Internal utility methods. Int8List _createList(int length) { return new Int8List(length); @@ -4393,7 +4482,7 @@ final class _Uint8ArrayView extends _TypedListView external factory _Uint8ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4414,11 +4503,14 @@ final class _Uint8ArrayView extends _TypedListView offsetInBytes + (index * Uint8List.bytesPerElement), _toUint8(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8List interface. + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + // Internal utility methods. Uint8List _createList(int length) { return new Uint8List(length); @@ -4445,7 +4537,7 @@ final class _Uint8ClampedArrayView extends _TypedListView external factory _Uint8ClampedArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4466,11 +4558,15 @@ final class _Uint8ClampedArrayView extends _TypedListView _toClampedUint8(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint8List.bytesPerElement; } + // Method(s) implementing the Uint8ClampedList interface. + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + // Internal utility methods. Uint8ClampedList _createList(int length) { return new Uint8ClampedList(length); @@ -4499,7 +4595,7 @@ final class _Int16ArrayView extends _TypedListView external factory _Int16ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4532,12 +4628,15 @@ final class _Int16ArrayView extends _TypedListView } } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int16List.bytesPerElement; } + // Method(s) implementing the Int16List interface. + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + // Internal utility methods. Int16List _createList(int length) { return new Int16List(length); @@ -4561,7 +4660,7 @@ final class _Uint16ArrayView extends _TypedListView external factory _Uint16ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4594,14 +4693,16 @@ final class _Uint16ArrayView extends _TypedListView } } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint16List.bytesPerElement; } - // Internal utility methods. + // Method(s) implementing the Uint16List interface. + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + // Internal utility methods. Uint16List _createList(int length) { return new Uint16List(length); } @@ -4624,7 +4725,7 @@ final class _Int32ArrayView extends _TypedListView external factory _Int32ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4645,11 +4746,14 @@ final class _Int32ArrayView extends _TypedListView offsetInBytes + (index * Int32List.bytesPerElement), _toInt32(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int32List.bytesPerElement; } + // Method(s) implementing the Int32List interface. + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + // Internal utility methods. Int32List _createList(int length) { return new Int32List(length); @@ -4673,7 +4777,7 @@ final class _Uint32ArrayView extends _TypedListView external factory _Uint32ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4694,11 +4798,14 @@ final class _Uint32ArrayView extends _TypedListView offsetInBytes + (index * Uint32List.bytesPerElement), _toUint32(value)); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint32List.bytesPerElement; } + // Method(s) implementing the Uint32List interface. + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + // Internal utility methods. Uint32List _createList(int length) { return new Uint32List(length); @@ -4722,7 +4829,7 @@ final class _Int64ArrayView extends _TypedListView external factory _Int64ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4743,11 +4850,14 @@ final class _Int64ArrayView extends _TypedListView offsetInBytes + (index * Int64List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int64List.bytesPerElement; } + // Method(s) implementing the Int16List interface. + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + // Internal utility methods. Int64List _createList(int length) { return new Int64List(length); @@ -4771,7 +4881,7 @@ final class _Uint64ArrayView extends _TypedListView external factory _Uint64ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") int operator [](int index) { if (index < 0 || index >= length) { @@ -4792,11 +4902,14 @@ final class _Uint64ArrayView extends _TypedListView offsetInBytes + (index * Uint64List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Uint64List.bytesPerElement; } + // Method(s) implementing the Uint64List interface. + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + // Internal utility methods. Uint64List _createList(int length) { return new Uint64List(length); @@ -4820,7 +4933,7 @@ final class _Float32ArrayView extends _TypedListView external factory _Float32ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") double operator [](int index) { if (index < 0 || index >= length) { @@ -4841,11 +4954,14 @@ final class _Float32ArrayView extends _TypedListView offsetInBytes + (index * Float32List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Float32List.bytesPerElement; } + // Method(s) implementing the Float32List interface. + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + // Internal utility methods. Float32List _createList(int length) { return new Float32List(length); @@ -4869,7 +4985,7 @@ final class _Float64ArrayView extends _TypedListView external factory _Float64ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. @pragma("vm:prefer-inline") double operator [](int index) { if (index < 0 || index >= length) { @@ -4890,11 +5006,14 @@ final class _Float64ArrayView extends _TypedListView offsetInBytes + (index * Float64List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Float64List.bytesPerElement; } + // Method(s) implementing the Float64List interface. + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + // Internal utility methods. Float64List _createList(int length) { return new Float64List(length); @@ -4918,7 +5037,7 @@ final class _Float32x4ArrayView extends _TypedListView external factory _Float32x4ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. Float32x4 operator [](int index) { if (index < 0 || index >= length) { throw new IndexError.withLength(index, length, @@ -4937,11 +5056,14 @@ final class _Float32x4ArrayView extends _TypedListView offsetInBytes + (index * Float32x4List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Float32x4List.bytesPerElement; } + // Method(s) implementing the Float32x4List interface. + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + // Internal utility methods. Float32x4List _createList(int length) { return new Float32x4List(length); @@ -4965,7 +5087,7 @@ final class _Int32x4ArrayView extends _TypedListView external factory _Int32x4ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. Int32x4 operator [](int index) { if (index < 0 || index >= length) { throw new IndexError.withLength(index, length, @@ -4984,11 +5106,14 @@ final class _Int32x4ArrayView extends _TypedListView offsetInBytes + (index * Int32x4List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Int32x4List.bytesPerElement; } + // Method(s) implementing the Int32x4List interface. + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + // Internal utility methods. Int32x4List _createList(int length) { return new Int32x4List(length); @@ -5012,7 +5137,7 @@ final class _Float64x2ArrayView extends _TypedListView external factory _Float64x2ArrayView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing List interface. + // Method(s) implementing the List interface. Float64x2 operator [](int index) { if (index < 0 || index >= length) { throw new IndexError.withLength(index, length, @@ -5031,11 +5156,14 @@ final class _Float64x2ArrayView extends _TypedListView offsetInBytes + (index * Float64x2List.bytesPerElement), value); } - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. int get elementSizeInBytes { return Float64x2List.bytesPerElement; } + // Method(s) implementing the Float64x2List interface. + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + // Internal utility methods. Float64x2List _createList(int length) { return new Float64x2List(length); @@ -5056,7 +5184,7 @@ final class _ByteDataView implements ByteData { external factory _ByteDataView._( _TypedList buffer, int offsetInBytes, int length); - // Method(s) implementing TypedData interface. + // Method(s) implementing the TypedData interface. _ByteBuffer get buffer { return _typedData.buffer; } @@ -5069,7 +5197,8 @@ final class _ByteDataView implements ByteData { return 1; } - // Method(s) implementing ByteData interface. + // Method(s) implementing the ByteData interface. + ByteData asUnmodifiableView() => UnmodifiableByteDataView(this); @pragma("vm:prefer-inline") int getInt8(int byteOffset) { @@ -5622,6 +5751,8 @@ final class _UnmodifiableInt8ArrayView extends _Int8ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Int8List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5639,6 +5770,8 @@ final class _UnmodifiableUint8ArrayView extends _Uint8ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Uint8List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5656,6 +5789,8 @@ final class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Uint8ClampedList asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5673,6 +5808,8 @@ final class _UnmodifiableInt16ArrayView extends _Int16ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Int16List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5690,6 +5827,8 @@ final class _UnmodifiableUint16ArrayView extends _Uint16ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Uint16List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5707,6 +5846,8 @@ final class _UnmodifiableInt32ArrayView extends _Int32ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Int32List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5724,6 +5865,8 @@ final class _UnmodifiableUint32ArrayView extends _Uint32ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Uint32List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5741,6 +5884,8 @@ final class _UnmodifiableInt64ArrayView extends _Int64ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Int64List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5758,6 +5903,8 @@ final class _UnmodifiableUint64ArrayView extends _Uint64ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Uint64List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5775,6 +5922,8 @@ final class _UnmodifiableFloat32ArrayView extends _Float32ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Float32List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5792,6 +5941,8 @@ final class _UnmodifiableFloat64ArrayView extends _Float64ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Float64List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5809,6 +5960,8 @@ final class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Float32x4List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5826,6 +5979,8 @@ final class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Int32x4List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5843,6 +5998,8 @@ final class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + Float64x2List asUnmodifiableView() => this; } @pragma("vm:entry-point") @@ -5901,6 +6058,8 @@ final class _UnmodifiableByteDataView extends _ByteDataView } _ByteBuffer get buffer => new _UnmodifiableByteBufferView(_typedData.buffer); + + ByteData asUnmodifiableView() => this; } final class _UnmodifiableByteBufferView extends _ByteBuffer diff --git a/sdk/lib/_internal/wasm/lib/js_typed_array.dart b/sdk/lib/_internal/wasm/lib/js_typed_array.dart index bc0d1557923..204d7724e0f 100644 --- a/sdk/lib/_internal/wasm/lib/js_typed_array.dart +++ b/sdk/lib/_internal/wasm/lib/js_typed_array.dart @@ -132,6 +132,9 @@ final class JSDataViewImpl extends JSArrayBufferViewImpl implements ByteData { @override int get elementSizeInBytes => 1; + @override + ByteData asUnmodifiableView() => UnmodifiableByteDataView(this); + double getFloat32(int byteOffset, [Endian endian = Endian.big]) => js.JS('(b, o, e) => b.getFloat32(o, e)', toExternRef, byteOffset.toDouble(), Endian.little == endian); @@ -299,6 +302,9 @@ final class JSUint8ArrayImpl extends JSIntArrayImpl implements Uint8List { return JSUint8ArrayImpl(jsBuffer); } + @override + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + @override Uint8List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -327,6 +333,9 @@ final class JSInt8ArrayImpl extends JSIntArrayImpl implements Int8List { return JSInt8ArrayImpl(jsBuffer); } + @override + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + @override Int8List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -359,6 +368,10 @@ final class JSUint8ClampedArrayImpl extends JSIntArrayImpl return JSUint8ClampedArrayImpl(jsBuffer); } + @override + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + @override Uint8ClampedList sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -386,6 +399,9 @@ final class JSUint16ArrayImpl extends JSIntArrayImpl implements Uint16List { return JSUint16ArrayImpl(jsBuffer); } + @override + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + @override Uint16List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -413,6 +429,9 @@ final class JSInt16ArrayImpl extends JSIntArrayImpl implements Int16List { return JSInt16ArrayImpl(jsBuffer); } + @override + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + @override Int16List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -440,6 +459,9 @@ final class JSUint32ArrayImpl extends JSIntArrayImpl implements Uint32List { return JSUint32ArrayImpl(jsBuffer); } + @override + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + @override Uint32List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -467,6 +489,9 @@ final class JSInt32ArrayImpl extends JSIntArrayImpl implements Int32List { return JSInt32ArrayImpl(jsBuffer); } + @override + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + @override Int32List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -523,6 +548,9 @@ final class JSInt32x4ArrayImpl _storage[(index * 4) + 3] = value.w; } + @override + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + @override Int32x4List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -565,6 +593,9 @@ final class JSBigUint64ArrayImpl extends JSBigIntArrayImpl return JSBigUint64ArrayImpl(jsBuffer); } + @override + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + @override Uint64List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -592,6 +623,9 @@ final class JSBigInt64ArrayImpl extends JSBigIntArrayImpl implements Int64List { return JSBigInt64ArrayImpl(jsBuffer); } + @override + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + @override Int64List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -676,6 +710,9 @@ final class JSFloat32ArrayImpl extends JSFloatArrayImpl implements Float32List { return JSFloat32ArrayImpl(jsBuffer); } + @override + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + @override Float32List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -704,6 +741,9 @@ final class JSFloat64ArrayImpl extends JSFloatArrayImpl implements Float64List { return JSFloat64ArrayImpl(jsBuffer); } + @override + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + @override Float64List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -760,6 +800,9 @@ final class JSFloat32x4ArrayImpl _storage[(index * 4) + 3] = value.w; } + @override + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + @override Float32x4List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); @@ -808,6 +851,9 @@ final class JSFloat64x2ArrayImpl _storage[(index * 2) + 1] = value.y; } + @override + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + @override Float64x2List sublist(int start, [int? end]) { final stop = RangeError.checkValidRange(start, end, length); diff --git a/sdk/lib/_internal/wasm/lib/simd.dart b/sdk/lib/_internal/wasm/lib/simd.dart index fb3253cb991..6b36a607da2 100644 --- a/sdk/lib/_internal/wasm/lib/simd.dart +++ b/sdk/lib/_internal/wasm/lib/simd.dart @@ -66,6 +66,8 @@ final class NaiveInt32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Int32x4List asUnmodifiableView() => UnmodifiableInt32x4ListView(this); + Int32x4List sublist(int start, [int? end]) { int stop = RangeError.checkValidRange(start, end, length); return NaiveInt32x4List.externalStorage( @@ -146,6 +148,8 @@ final class NaiveFloat32x4List extends Object _storage[(index * 4) + 3] = value.w; } + Float32x4List asUnmodifiableView() => UnmodifiableFloat32x4ListView(this); + Float32x4List sublist(int start, [int? end]) { int stop = RangeError.checkValidRange(start, end, length); return NaiveFloat32x4List.externalStorage( @@ -220,6 +224,8 @@ final class NaiveFloat64x2List extends Object _storage[(index * 2) + 1] = value.y; } + Float64x2List asUnmodifiableView() => UnmodifiableFloat64x2ListView(this); + Float64x2List sublist(int start, [int? end]) { int stop = RangeError.checkValidRange(start, end, length); return NaiveFloat64x2List.externalStorage( diff --git a/sdk/lib/_internal/wasm/lib/typed_data.dart b/sdk/lib/_internal/wasm/lib/typed_data.dart index edc0e447f90..27761396e8d 100644 --- a/sdk/lib/_internal/wasm/lib/typed_data.dart +++ b/sdk/lib/_internal/wasm/lib/typed_data.dart @@ -102,6 +102,9 @@ abstract class ByteDataBase implements ByteData { UnmodifiableByteDataView immutable(); + @override + ByteData asUnmodifiableView() => immutable(); + void _offsetRangeCheck(int byteOffset, int size) { if (byteOffset < 0 || byteOffset + size > lengthInBytes) { throw IndexError.withLength(byteOffset, lengthInBytes - offsetInBytes, @@ -2404,6 +2407,9 @@ class I8List extends _WasmI8ArrayBase ? I8List._(buffer, offsetInBytes, length) : UnmodifiableI8List._(buffer, offsetInBytes, length); + @override + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + @override I8List _createList(int length) => I8List(length); @@ -2447,6 +2453,9 @@ class U8List extends _WasmI8ArrayBase ? U8List._(buffer, offsetInBytes, length) : UnmodifiableU8List._(buffer, offsetInBytes, length); + @override + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + @override U8List _createList(int length) => U8List(length); @@ -2488,6 +2497,10 @@ class U8ClampedList extends _WasmI8ArrayBase ? U8ClampedList._(buffer, offsetInBytes, length) : UnmodifiableU8ClampedList._(buffer, offsetInBytes, length); + @override + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + @override U8ClampedList _createList(int length) => U8ClampedList(length); @@ -2529,6 +2542,9 @@ class I16List extends _WasmI16ArrayBase ? I16List._(buffer, offsetInBytes, length) : UnmodifiableI16List._(buffer, offsetInBytes, length); + @override + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + @override I16List _createList(int length) => I16List(length); @@ -2570,6 +2586,9 @@ class U16List extends _WasmI16ArrayBase ? U16List._(buffer, offsetInBytes, length) : UnmodifiableU16List._(buffer, offsetInBytes, length); + @override + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + @override U16List _createList(int length) => U16List(length); @@ -2611,6 +2630,9 @@ class I32List extends _WasmI32ArrayBase ? I32List._(buffer, offsetInBytes, length) : UnmodifiableI32List._(buffer, offsetInBytes, length); + @override + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + @override I32List _createList(int length) => I32List(length); @@ -2652,6 +2674,9 @@ class U32List extends _WasmI32ArrayBase ? U32List._(buffer, offsetInBytes, length) : UnmodifiableU32List._(buffer, offsetInBytes, length); + @override + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + @override U32List _createList(int length) => U32List(length); @@ -2693,6 +2718,9 @@ class I64List extends _WasmI64ArrayBase ? I64List._(buffer, offsetInBytes, length) : UnmodifiableI64List._(buffer, offsetInBytes, length); + @override + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + @override I64List _createList(int length) => I64List(length); @@ -2734,6 +2762,9 @@ class U64List extends _WasmI64ArrayBase ? U64List._(buffer, offsetInBytes, length) : UnmodifiableU64List._(buffer, offsetInBytes, length); + @override + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + @override U64List _createList(int length) => U64List(length); @@ -2775,6 +2806,9 @@ class F32List extends _WasmF32ArrayBase ? F32List._(buffer, offsetInBytes, length) : UnmodifiableF32List._(buffer, offsetInBytes, length); + @override + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + @override F32List _createList(int length) => F32List(length); @@ -2816,6 +2850,9 @@ class F64List extends _WasmF64ArrayBase ? F64List._(buffer, offsetInBytes, length) : UnmodifiableF64List._(buffer, offsetInBytes, length); + @override + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + @override F64List _createList(int length) => F64List(length); @@ -3035,6 +3072,9 @@ class _SlowI8List extends _SlowListBase ? _SlowI8List._(buffer, offsetInBytes, length) : UnmodifiableSlowI8List._(buffer, offsetInBytes, length); + @override + Int8List asUnmodifiableView() => UnmodifiableInt8ListView(this); + @override I8List _createList(int length) => I8List(length); @@ -3069,6 +3109,9 @@ class _SlowU8List extends _SlowListBase ? _SlowU8List._(buffer, offsetInBytes, length) : UnmodifiableSlowU8List._(buffer, offsetInBytes, length); + @override + Uint8List asUnmodifiableView() => UnmodifiableUint8ListView(this); + @override U8List _createList(int length) => U8List(length); @@ -3103,6 +3146,10 @@ class _SlowU8ClampedList extends _SlowListBase ? _SlowU8ClampedList._(buffer, offsetInBytes, length) : UnmodifiableSlowU8ClampedList._(buffer, offsetInBytes, length); + @override + Uint8ClampedList asUnmodifiableView() => + UnmodifiableUint8ClampedListView(this); + @override U8ClampedList _createList(int length) => U8ClampedList(length); @@ -3138,6 +3185,9 @@ class _SlowI16List extends _SlowListBase ? _SlowI16List._(buffer, offsetInBytes, length) : UnmodifiableSlowI16List._(buffer, offsetInBytes, length); + @override + Int16List asUnmodifiableView() => UnmodifiableInt16ListView(this); + @override I16List _createList(int length) => I16List(length); @@ -3174,6 +3224,9 @@ class _SlowU16List extends _SlowListBase ? _SlowU16List._(buffer, offsetInBytes, length) : UnmodifiableSlowU16List._(buffer, offsetInBytes, length); + @override + Uint16List asUnmodifiableView() => UnmodifiableUint16ListView(this); + @override U16List _createList(int length) => U16List(length); @@ -3210,6 +3263,9 @@ class _SlowI32List extends _SlowListBase ? _SlowI32List._(buffer, offsetInBytes, length) : UnmodifiableSlowI32List._(buffer, offsetInBytes, length); + @override + Int32List asUnmodifiableView() => UnmodifiableInt32ListView(this); + @override I32List _createList(int length) => I32List(length); @@ -3246,6 +3302,9 @@ class _SlowU32List extends _SlowListBase ? _SlowU32List._(buffer, offsetInBytes, length) : UnmodifiableSlowU32List._(buffer, offsetInBytes, length); + @override + Uint32List asUnmodifiableView() => UnmodifiableUint32ListView(this); + @override U32List _createList(int length) => U32List(length); @@ -3282,6 +3341,9 @@ class _SlowI64List extends _SlowListBase ? _SlowI64List._(buffer, offsetInBytes, length) : UnmodifiableSlowI64List._(buffer, offsetInBytes, length); + @override + Int64List asUnmodifiableView() => UnmodifiableInt64ListView(this); + @override I64List _createList(int length) => I64List(length); @@ -3318,6 +3380,9 @@ class _SlowU64List extends _SlowListBase ? _SlowU64List._(buffer, offsetInBytes, length) : UnmodifiableSlowU64List._(buffer, offsetInBytes, length); + @override + Uint64List asUnmodifiableView() => UnmodifiableUint64ListView(this); + @override U64List _createList(int length) => U64List(length); @@ -3354,6 +3419,9 @@ class _SlowF32List extends _SlowListBase ? _SlowF32List._(buffer, offsetInBytes, length) : UnmodifiableSlowF32List._(buffer, offsetInBytes, length); + @override + Float32List asUnmodifiableView() => UnmodifiableFloat32ListView(this); + @override F32List _createList(int length) => F32List(length); @@ -3390,6 +3458,9 @@ class SlowF64List extends _SlowListBase ? SlowF64List._(buffer, offsetInBytes, length) : UnmodifiableSlowF64List._(buffer, offsetInBytes, length); + @override + Float64List asUnmodifiableView() => UnmodifiableFloat64ListView(this); + @override F64List _createList(int length) => F64List(length); diff --git a/sdk/lib/_internal/wasm_js_compatibility/lib/typed_data.dart b/sdk/lib/_internal/wasm_js_compatibility/lib/typed_data.dart index 95a5a7d6dad..b880da31b36 100644 --- a/sdk/lib/_internal/wasm_js_compatibility/lib/typed_data.dart +++ b/sdk/lib/_internal/wasm_js_compatibility/lib/typed_data.dart @@ -80,6 +80,9 @@ final class _UnmodifiableByteDataViewImpl _UnmodifiableByteDataViewImpl(ByteData data) : _data = data; + @override + ByteData asUnmodifiableView() => this; + int getInt8(int byteOffset) => _data.getInt8(byteOffset); void setInt8(int byteOffset, int value) => _unsupported(); @@ -185,6 +188,9 @@ final class _UnmodifiableUint8ListViewImpl extends UnmodifiableListBase final Uint8List _list; _UnmodifiableUint8ListViewImpl(Uint8List list) : _list = list; + @override + Uint8List asUnmodifiableView() => this; + @override Uint8List createList(int length) => Uint8List(length); } @@ -199,6 +205,9 @@ final class _UnmodifiableInt8ListViewImpl extends UnmodifiableListBase final Int8List _list; _UnmodifiableInt8ListViewImpl(Int8List list) : _list = list; + @override + Int8List asUnmodifiableView() => this; + @override Int8List createList(int length) => Int8List(length); } @@ -214,6 +223,9 @@ final class _UnmodifiableUint8ClampedListViewImpl final Uint8ClampedList _list; _UnmodifiableUint8ClampedListViewImpl(Uint8ClampedList list) : _list = list; + @override + Uint8ClampedList asUnmodifiableView() => this; + @override Uint8ClampedList createList(int length) => Uint8ClampedList(length); } @@ -228,6 +240,9 @@ final class _UnmodifiableUint16ListViewImpl extends UnmodifiableListBase final Uint16List _list; _UnmodifiableUint16ListViewImpl(Uint16List list) : _list = list; + @override + Uint16List asUnmodifiableView() => this; + @override Uint16List createList(int length) => Uint16List(length); } @@ -242,6 +257,9 @@ final class _UnmodifiableInt16ListViewImpl extends UnmodifiableListBase final Int16List _list; _UnmodifiableInt16ListViewImpl(Int16List list) : _list = list; + @override + Int16List asUnmodifiableView() => this; + @override Int16List createList(int length) => Int16List(length); } @@ -256,6 +274,9 @@ final class _UnmodifiableUint32ListViewImpl extends UnmodifiableListBase final Uint32List _list; _UnmodifiableUint32ListViewImpl(Uint32List list) : _list = list; + @override + Uint32List asUnmodifiableView() => this; + @override Uint32List createList(int length) => Uint32List(length); } @@ -270,6 +291,9 @@ final class _UnmodifiableInt32ListViewImpl extends UnmodifiableListBase final Int32List _list; _UnmodifiableInt32ListViewImpl(Int32List list) : _list = list; + @override + Int32List asUnmodifiableView() => this; + @override Int32List createList(int length) => Int32List(length); } @@ -284,6 +308,9 @@ final class _UnmodifiableUint64ListViewImpl extends UnmodifiableListBase final Uint64List _list; _UnmodifiableUint64ListViewImpl(Uint64List list) : _list = list; + @override + Uint64List asUnmodifiableView() => this; + @override Uint64List createList(int length) => Uint64List(length); } @@ -298,6 +325,9 @@ final class _UnmodifiableInt64ListViewImpl extends UnmodifiableListBase final Int64List _list; _UnmodifiableInt64ListViewImpl(Int64List list) : _list = list; + @override + Int64List asUnmodifiableView() => this; + @override Int64List createList(int length) => Int64List(length); } @@ -313,6 +343,9 @@ final class _UnmodifiableInt32x4ListViewImpl final Int32x4List _list; _UnmodifiableInt32x4ListViewImpl(Int32x4List list) : _list = list; + @override + Int32x4List asUnmodifiableView() => this; + @override Int32x4List createList(int length) => Int32x4List(length); } @@ -328,6 +361,9 @@ final class _UnmodifiableFloat32x4ListViewImpl final Float32x4List _list; _UnmodifiableFloat32x4ListViewImpl(Float32x4List list) : _list = list; + @override + Float32x4List asUnmodifiableView() => this; + @override Float32x4List createList(int length) => Float32x4List(length); } @@ -343,6 +379,9 @@ final class _UnmodifiableFloat64x2ListViewImpl final Float64x2List _list; _UnmodifiableFloat64x2ListViewImpl(Float64x2List list) : _list = list; + @override + Float64x2List asUnmodifiableView() => this; + @override Float64x2List createList(int length) => Float64x2List(length); } @@ -358,6 +397,9 @@ final class _UnmodifiableFloat32ListViewImpl final Float32List _list; _UnmodifiableFloat32ListViewImpl(Float32List list) : _list = list; + @override + Float32List asUnmodifiableView() => this; + @override Float32List createList(int length) => Float32List(length); } @@ -373,6 +415,9 @@ final class _UnmodifiableFloat64ListViewImpl final Float64List _list; _UnmodifiableFloat64ListViewImpl(Float64List list) : _list = list; + @override + Float64List asUnmodifiableView() => this; + @override Float64List createList(int length) => Float64List(length); } diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart index 472f05fa176..809f86399ce 100644 --- a/sdk/lib/typed_data/typed_data.dart +++ b/sdk/lib/typed_data/typed_data.dart @@ -498,6 +498,10 @@ abstract final class ByteData implements TypedData { data.offsetInBytes + start * elementSize, (end - start) * elementSize); } + /// A read-only view of this [ByteData]. + @Since("3.3") + ByteData asUnmodifiableView(); + /// Returns the (possibly negative) integer represented by the byte at the /// specified [byteOffset] in this object, in two's complement binary /// representation. @@ -795,6 +799,10 @@ abstract final class Int8List implements List, _TypedIntList { data.offsetInBytes + start * elementSize, (end - start) * elementSize); } + /// A read-only view of this [Int8List]; + @Since("3.3") + Int8List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is an `Int8List` containing the elements of this list at @@ -908,6 +916,10 @@ abstract final class Uint8List implements List, _TypedIntList { data.offsetInBytes + start * elementSize, (end - start) * elementSize); } + /// A read-only view of this [Uint8List]. + @Since("3.3") + Uint8List asUnmodifiableView(); + /// Returns a concatenation of this list and [other]. /// /// If [other] is also a typed-data list, then the return list will be a @@ -1020,7 +1032,7 @@ abstract final class Uint8ClampedList implements List, _TypedIntList { /// is the same as the [List.length] of a typed data list. /// /// If omitted, [start] defaults to zero and [end] to *elementCount*. - @Since("2.8") + @Since("3.3") factory Uint8ClampedList.sublistView(TypedData data, [int start = 0, int? end]) { int elementSize = data.elementSizeInBytes; @@ -1030,6 +1042,10 @@ abstract final class Uint8ClampedList implements List, _TypedIntList { data.offsetInBytes + start * elementSize, (end - start) * elementSize); } + /// A read-only view of this [Uint8ClampedList]. + @Since("3.3") + Uint8ClampedList asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Uint8ClampedList` containing the elements of this @@ -1155,6 +1171,10 @@ abstract final class Int16List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Int16List]. + @Since("3.3") + Int16List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is an `Int16List` containing the elements of this @@ -1281,6 +1301,10 @@ abstract final class Uint16List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Uint16List]. + @Since("3.3") + Uint16List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Uint16List` containing the elements of this @@ -1406,6 +1430,10 @@ abstract final class Int32List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Int16List]. + @Since("3.3") + Int32List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is an `Int32List` containing the elements of this @@ -1532,6 +1560,10 @@ abstract final class Uint32List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Uint32List]. + @Since("3.3") + Uint32List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Uint32List` containing the elements of this @@ -1657,6 +1689,10 @@ abstract final class Int64List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Int64List]. + @Since("3.3") + Int64List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is an `Int64List` containing the elements of this @@ -1783,6 +1819,10 @@ abstract final class Uint64List implements List, _TypedIntList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Uint64List]. + @Since("3.3") + Uint64List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Uint64List` containing the elements of this @@ -1909,6 +1949,10 @@ abstract final class Float32List implements List, _TypedFloatList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Float32List]. + @Since("3.3") + Float32List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Float32List` containing the elements of this @@ -2028,6 +2072,10 @@ abstract final class Float64List implements List, _TypedFloatList { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Float64List]. + @Since("3.3") + Float64List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Float64List` containing the elements of this @@ -2146,6 +2194,10 @@ abstract final class Float32x4List implements List, TypedData { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Float32x4List]. + @Since("3.3") + Float32x4List asUnmodifiableView(); + /// Returns the concatenation of this list and [other]. /// /// If [other] is also a [Float32x4List], the result is a new [Float32x4List], @@ -2267,6 +2319,10 @@ abstract final class Int32x4List implements List, TypedData { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Int32x4List]. + @Since("3.3") + Int32x4List asUnmodifiableView(); + /// Returns the concatenation of this list and [other]. /// /// If [other] is also a [Int32x4List], the result is a new [Int32x4List], @@ -2397,6 +2453,10 @@ abstract final class Float64x2List implements List, TypedData { byteLength ~/ bytesPerElement); } + /// A read-only view of this [Float64x2List]. + @Since("3.3") + Float64x2List asUnmodifiableView(); + /// Returns a new list containing the elements between [start] and [end]. /// /// The new list is a `Float64x2List` containing the elements of this diff --git a/sdk/lib/typed_data/unmodifiable_typed_data.dart b/sdk/lib/typed_data/unmodifiable_typed_data.dart index 9deba75c0b3..7cfd7653a94 100644 --- a/sdk/lib/typed_data/unmodifiable_typed_data.dart +++ b/sdk/lib/typed_data/unmodifiable_typed_data.dart @@ -8,6 +8,7 @@ part of dart.typed_data; /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableByteBufferView. +// TODO(53785): @Deprecated('No replacement') abstract final class UnmodifiableByteBufferView implements ByteBuffer { external factory UnmodifiableByteBufferView(ByteBuffer data); } @@ -16,6 +17,7 @@ abstract final class UnmodifiableByteBufferView implements ByteBuffer { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableByteDataView. +// TODO(53785): @Deprecated('Use ByteData.asUnmodifiableView() instead') abstract final class UnmodifiableByteDataView implements ByteData { external factory UnmodifiableByteDataView(ByteData data); } @@ -24,6 +26,7 @@ abstract final class UnmodifiableByteDataView implements ByteData { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableUint8ListView. +// TODO(53785): @Deprecated('Use Uint8List.asUnmodifiableView() instead') abstract final class UnmodifiableUint8ListView implements Uint8List { external factory UnmodifiableUint8ListView(Uint8List list); } @@ -32,6 +35,7 @@ abstract final class UnmodifiableUint8ListView implements Uint8List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableInt8ListView. +// TODO(53785): @Deprecated('Use Int8List.asUnmodifiableView() instead') abstract final class UnmodifiableInt8ListView implements Int8List { external factory UnmodifiableInt8ListView(Int8List list); } @@ -40,7 +44,9 @@ abstract final class UnmodifiableInt8ListView implements Int8List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableUint8ClampedListView. -abstract final class UnmodifiableUint8ClampedListView implements Uint8ClampedList { +// TODO(53785): @Deprecated('Use Uint8ClampedList.asUnmodifiableView() instead') +abstract final class UnmodifiableUint8ClampedListView + implements Uint8ClampedList { external factory UnmodifiableUint8ClampedListView(Uint8ClampedList list); } @@ -48,6 +54,7 @@ abstract final class UnmodifiableUint8ClampedListView implements Uint8ClampedLis /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableUint16ListView. +// TODO(53785): @Deprecated('Use Uint16List.asUnmodifiableView() instead') abstract final class UnmodifiableUint16ListView implements Uint16List { external factory UnmodifiableUint16ListView(Uint16List list); } @@ -56,6 +63,7 @@ abstract final class UnmodifiableUint16ListView implements Uint16List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableInt16ListView. +// TODO(53785): @Deprecated('Use Int16List.asUnmodifiableView() instead') abstract final class UnmodifiableInt16ListView implements Int16List { external factory UnmodifiableInt16ListView(Int16List list); } @@ -64,6 +72,7 @@ abstract final class UnmodifiableInt16ListView implements Int16List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableUint32ListView. +// TODO(53785): @Deprecated('Use Uint32List.asUnmodifiableView() instead') abstract final class UnmodifiableUint32ListView implements Uint32List { external factory UnmodifiableUint32ListView(Uint32List list); } @@ -72,6 +81,7 @@ abstract final class UnmodifiableUint32ListView implements Uint32List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableInt32ListView. +// TODO(53785): @Deprecated('Use Int32List.asUnmodifiableView() instead') abstract final class UnmodifiableInt32ListView implements Int32List { external factory UnmodifiableInt32ListView(Int32List list); } @@ -80,6 +90,7 @@ abstract final class UnmodifiableInt32ListView implements Int32List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableUint64ListView. +// TODO(53785): @Deprecated('Use Uint64List.asUnmodifiableView() instead') abstract final class UnmodifiableUint64ListView implements Uint64List { external factory UnmodifiableUint64ListView(Uint64List list); } @@ -88,6 +99,7 @@ abstract final class UnmodifiableUint64ListView implements Uint64List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableInt64ListView. +// TODO(53785): @Deprecated('Use Int64List.asUnmodifiableView() instead') abstract final class UnmodifiableInt64ListView implements Int64List { external factory UnmodifiableInt64ListView(Int64List list); } @@ -96,6 +108,7 @@ abstract final class UnmodifiableInt64ListView implements Int64List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableInt32x4ListView. +// TODO(53785): @Deprecated('Use Int32x4List.asUnmodifiableView() instead') abstract final class UnmodifiableInt32x4ListView implements Int32x4List { external factory UnmodifiableInt32x4ListView(Int32x4List list); } @@ -104,6 +117,7 @@ abstract final class UnmodifiableInt32x4ListView implements Int32x4List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableFloat32x4ListView. +// TODO(53785): @Deprecated('Use Float32x4List.asUnmodifiableView() instead') abstract final class UnmodifiableFloat32x4ListView implements Float32x4List { external factory UnmodifiableFloat32x4ListView(Float32x4List list); } @@ -112,6 +126,7 @@ abstract final class UnmodifiableFloat32x4ListView implements Float32x4List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableFloat64x2ListView. +// TODO(53785): @Deprecated('Use Float64x2List.asUnmodifiableView() instead') abstract final class UnmodifiableFloat64x2ListView implements Float64x2List { external factory UnmodifiableFloat64x2ListView(Float64x2List list); } @@ -120,6 +135,7 @@ abstract final class UnmodifiableFloat64x2ListView implements Float64x2List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableFloat32ListView. +// TODO(53785): @Deprecated('Use Float32List.asUnmodifiableView() instead') abstract final class UnmodifiableFloat32ListView implements Float32List { external factory UnmodifiableFloat32ListView(Float32List list); } @@ -128,6 +144,7 @@ abstract final class UnmodifiableFloat32ListView implements Float32List { /// /// It is a compile-time error for a class to attempt to extend or implement /// UnmodifiableFloat64ListView. +// TODO(53785): @Deprecated('Use Float64List.asUnmodifiableView() instead') abstract final class UnmodifiableFloat64ListView implements Float64List { external factory UnmodifiableFloat64ListView(Float64List list); } diff --git a/tests/lib/typed_data/unmodifiable_typed_data_simd_test.dart b/tests/lib/typed_data/unmodifiable_typed_data_simd_test.dart new file mode 100644 index 00000000000..813123952c1 --- /dev/null +++ b/tests/lib/typed_data/unmodifiable_typed_data_simd_test.dart @@ -0,0 +1,147 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// VMOptions=--inline_alloc +// VMOptions=--no_inline_alloc + +import 'dart:typed_data'; +import 'package:expect/expect.dart'; + +void checkReadable( + List expected, List actual, bool Function(T, T) equals) { + Expect.equals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + Expect.isTrue( + equals(expected[i], actual[i]), + 'At [$i], expected: ${expected[i]} actual: ${actual[i]}, ' + 'which are not equal'); + } +} + +void checkUnmodifiable(List list, T value) { + Expect.throwsUnsupportedError(() => list.add(value)); + Expect.throwsUnsupportedError(() => list.addAll([value])); + Expect.throwsUnsupportedError(() => list.clear()); + Expect.throwsUnsupportedError(() => list.insert(0, value)); + Expect.throwsUnsupportedError(() => list.insertAll(0, [value])); + Expect.throwsUnsupportedError(() => list.remove(value)); + Expect.throwsUnsupportedError(() => list.removeAt(0)); + Expect.throwsUnsupportedError(() => list.removeLast()); + Expect.throwsUnsupportedError(() => list.removeRange(0, 1)); + Expect.throwsUnsupportedError(() => list.removeWhere((x) => true)); + Expect.throwsUnsupportedError(() => list.replaceRange(0, 1, [])); + Expect.throwsUnsupportedError(() => list.retainWhere((x) => false)); + Expect.throwsUnsupportedError(() => list[0] = value); + Expect.throwsUnsupportedError(() => list.setRange(0, 1, [value])); + Expect.throwsUnsupportedError(() => list.setAll(0, [value])); +} + +void checkIndirectUnmodifiable(TypedData data) { + var newView1 = data.buffer.asUint8List(); + Expect.throwsUnsupportedError(() => newView1[0] = 1); + var newView2 = Uint8List.view(data.buffer); + Expect.throwsUnsupportedError(() => newView2[0] = 1); +} + +void int32x4Test() { + Int32x4 value1 = Int32x4(1, 2, 3, 4); + Int32x4 value2 = Int32x4(4, 3, 2, 1); + Int32x4 value3 = Int32x4(9, 1, 8, 2); + + bool equals(Int32x4 a, Int32x4 b) { + return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; + } + + Expect.isTrue(equals(value1, value1)); + Expect.isFalse(equals(value1, value2)); + + Int32x4List original = Int32x4List.fromList([value1, value2]); + + Int32x4List view = original.asUnmodifiableView(); + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); + + view = view.asUnmodifiableView(); // Unmodifiable view of unmodifiable view. + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); +} + +void float32x4Test() { + Float32x4 value1 = Float32x4(0.1, 0.2, 0.3, 0.4); + Float32x4 value2 = Float32x4(4.1, 3.0, 2.9, 1.8); + Float32x4 value3 = Float32x4(1.0, 2.0, 3.0, 4.0); + + bool equals(Float32x4 a, Float32x4 b) { + return identical(a.x, b.x) && + identical(a.y, b.y) && + identical(a.z, b.z) && + identical(a.w, b.w); + } + + Expect.isTrue(equals(value1, value1)); + Expect.isFalse(equals(value1, value2)); + + Float32x4List original = Float32x4List.fromList([value1, value2]); + + Float32x4List view = original.asUnmodifiableView(); + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); + + view = view.asUnmodifiableView(); // Unmodifiable view of unmodifiable view. + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); +} + +void float64x2Test() { + Float64x2 value1 = Float64x2(0.1, 0.2); + Float64x2 value2 = Float64x2(4.1, 3.0); + Float64x2 value3 = Float64x2(1.0, 2.0); + + bool equals(Float64x2 a, Float64x2 b) { + return identical(a.x, b.x) && identical(a.y, b.y); + } + + Expect.isTrue(equals(value1, value1)); + Expect.isFalse(equals(value1, value2)); + + Float64x2List original = Float64x2List.fromList([value1, value2]); + + Float64x2List view = original.asUnmodifiableView(); + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); + + view = view.asUnmodifiableView(); // Unmodifiable view of unmodifiable view. + checkReadable(original, view, equals); + checkUnmodifiable(view, value3); + checkIndirectUnmodifiable(view); + + original[0] += original[1]; + checkReadable(original, view, equals); +} + +void main() { + int32x4Test(); + float32x4Test(); + float64x2Test(); +} diff --git a/tests/lib/typed_data/unmodifiable_typed_data_test.dart b/tests/lib/typed_data/unmodifiable_typed_data_test.dart index ed20bc4796f..c42c85d7465 100644 --- a/tests/lib/typed_data/unmodifiable_typed_data_test.dart +++ b/tests/lib/typed_data/unmodifiable_typed_data_test.dart @@ -48,66 +48,129 @@ checkIndirectUnmodifiable(TypedData data) { int8ListTest() { Int8List i8l = new Int8List.fromList(intList); + // Deprecated: UnmodifiableInt8ListView list = new UnmodifiableInt8ListView(i8l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Int8List list2 = i8l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } uint8ListTest() { Uint8List u8l = new Uint8List.fromList(intList); + // Deprecated: UnmodifiableUint8ListView list = new UnmodifiableUint8ListView(u8l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Uint8List list2 = u8l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); +} + +uint8ClampedListTest() { + Uint8ClampedList u8l = new Uint8ClampedList.fromList(intList); + // Deprecated: + UnmodifiableUint8ClampedListView list = + new UnmodifiableUint8ClampedListView(u8l); + checkReadable(list); + checkUnmodifiable(list); + checkIndirectUnmodifiable(list); + // Replacement: + Uint8ClampedList list2 = u8l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } int16ListTest() { Int16List i16l = new Int16List.fromList(intList); + // Deprecated: UnmodifiableInt16ListView list = new UnmodifiableInt16ListView(i16l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Int16List list2 = i16l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } uint16ListTest() { Uint16List u16l = new Uint16List.fromList(intList); + // Deprecated: UnmodifiableUint16ListView list = new UnmodifiableUint16ListView(u16l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Uint16List list2 = u16l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } int32ListTest() { Int32List i32l = new Int32List.fromList(intList); + // Deprecated: UnmodifiableInt32ListView list = new UnmodifiableInt32ListView(i32l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Int32List list2 = i32l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } uint32ListTest() { Uint32List u32l = new Uint32List.fromList(intList); + // Deprecated: UnmodifiableUint32ListView list = new UnmodifiableUint32ListView(u32l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Uint32List list2 = u32l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } int64ListTest() { Int64List i64l = new Int64List.fromList(intList); + // Deprecated: UnmodifiableInt64ListView list = new UnmodifiableInt64ListView(i64l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Int64List list2 = i64l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } uint64ListTest() { Uint64List u64l = new Uint64List.fromList(intList); + // Deprecated: UnmodifiableUint64ListView list = new UnmodifiableUint64ListView(u64l); checkReadable(list); checkUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Uint64List list2 = u64l.asUnmodifiableView(); + checkReadable(list2); + checkUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } List doubleList = [1.0, 2.0, 3.0, 4.0, 5.0]; @@ -141,42 +204,76 @@ checkDoubleUnmodifiable(List list) { float32ListTest() { Float32List f32l = new Float32List.fromList(doubleList); + // Deprecated: UnmodifiableFloat32ListView list = new UnmodifiableFloat32ListView(f32l); checkDoubleReadable(list); checkDoubleUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Float32List list2 = f32l.asUnmodifiableView(); + checkDoubleReadable(list2); + checkDoubleUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } float64ListTest() { Float64List f64l = new Float64List.fromList(doubleList); + // Deprecated: UnmodifiableFloat64ListView list = new UnmodifiableFloat64ListView(f64l); checkDoubleReadable(list); checkDoubleUnmodifiable(list); checkIndirectUnmodifiable(list); + // Replacement: + Float64List list2 = f64l.asUnmodifiableView(); + checkDoubleReadable(list2); + checkDoubleUnmodifiable(list2); + checkIndirectUnmodifiable(list2); } byteDataTest() { ByteBuffer buffer = new Uint8List.fromList(intList).buffer; ByteData bd = new ByteData.view(buffer); - UnmodifiableByteDataView ubdv = new UnmodifiableByteDataView(bd); + // Deprecated: + { + UnmodifiableByteDataView ubdv = new UnmodifiableByteDataView(bd); - Expect.throwsUnsupportedError(() => ubdv.setInt8(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setUint8(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setInt16(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setUint16(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setInt32(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setUint32(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setInt64(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setUint64(0, 0)); - Expect.throwsUnsupportedError(() => ubdv.setFloat32(0, 0.0)); - Expect.throwsUnsupportedError(() => ubdv.setFloat64(0, 0.0)); + Expect.throwsUnsupportedError(() => ubdv.setInt8(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint8(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt16(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint16(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt32(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint32(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt64(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint64(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setFloat32(0, 0.0)); + Expect.throwsUnsupportedError(() => ubdv.setFloat64(0, 0.0)); - checkIndirectUnmodifiable(ubdv); + checkIndirectUnmodifiable(ubdv); + } + + // Replacement: + { + ByteData ubdv = bd.asUnmodifiableView(); + + Expect.throwsUnsupportedError(() => ubdv.setInt8(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint8(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt16(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint16(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt32(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint32(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setInt64(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setUint64(0, 0)); + Expect.throwsUnsupportedError(() => ubdv.setFloat32(0, 0.0)); + Expect.throwsUnsupportedError(() => ubdv.setFloat64(0, 0.0)); + + checkIndirectUnmodifiable(ubdv); + } } main() { int8ListTest(); uint8ListTest(); + uint8ClampedListTest(); int16ListTest(); uint16ListTest(); int32ListTest();