From 9173aed1baf315d8fa7838c0749f85929e0d357f Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Thu, 20 Jun 2019 06:43:44 +0000 Subject: [PATCH] Declare return types of Uint8List. These methods all were returning Uint8List, yet they were only declared to return List. This forced callers to either defensively wrap the return values in Uint8List, or to assume the contravariant return value: * Utf8Codec.encode() * BytesBuilder.takeBytes() * BytesBuilder.toBytes() * File.readAsBytes() * File.readAsBytesSync() * RandomAccessFile.read() * RandomAccessFile.readSync() * Uint8List.sublist() Since it's related, this change also updates the following sublist() methods to declare that they return the a sublist of the same type as the source list: * Int8List * Uint8ClampedList * Int16List * Uint16List * Int32List * Uint32List * Int64List * Uint64List * Float32List * Float64List * Float32x4List * Int32x4List * Float64x2List Bug: https://github.com/dart-lang/sdk/issues/36900 Bug: https://github.com/dart-lang/sdk/issues/31547 Bug: https://github.com/dart-lang/sdk/issues/27818 Bug: https://github.com/dart-lang/sdk/issues/35521 Change-Id: Ic3bc1db0d64de36fb68b1d8d98037eed1464f978 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101742 Commit-Queue: Todd Volkert Reviewed-by: Lasse R.H. Nielsen --- CHANGELOG.md | 34 ++ DEPS | 2 +- runtime/lib/typed_data_patch.dart | 118 +++--- sdk/lib/_http/http_impl.dart | 4 +- .../private/native_typed_data.dart | 24 +- .../js_runtime/lib/native_typed_data.dart | 24 +- sdk/lib/convert/utf.dart | 6 +- sdk/lib/io/bytes_builder.dart | 13 +- sdk/lib/io/file.dart | 10 +- sdk/lib/io/file_impl.dart | 16 +- sdk/lib/typed_data/typed_data.dart | 350 ++++++++++++++++++ .../typed_data/unmodifiable_typed_data.dart | 38 ++ 12 files changed, 540 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c52e12f11f..ddc637768e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,40 @@ ### Core libraries +* As part of (Issue [36900][]), the following methods and properties across + various core libraries, which used to declare a return type of `List`, + were updated to declare a return type of `Uint8List`: + + * `Utf8Codec.encode()` (and `Utf8Encoder.convert()`) + * `BytesBuilder.takeBytes()` + * `BytesBuilder.toBytes()` + * `File.readAsBytes()` (`Future`) + * `File.readAsBytesSync()` + * `RandomAccessFile.read()` (`Future`) + * `RandomAccessFile.readSync()` + * `InternetAddress.rawAddress` + * `RawSocket.read()` + + In addition, the following typed lists were updated to have their `sublist()` + methods declare a return type that is the same as the source list: + + * `Uint8List.sublist()` → `Uint8List` + * `Int8List.sublist()` → `Int8List` + * `Uint8ClampedList.sublist()` → `Uint8ClampedList` + * `Int16List.sublist()` → `Int16List` + * `Uint16List.sublist()` → `Uint16List` + * `Int32List.sublist()` → `Int32List` + * `Uint32List.sublist()` → `Uint32List` + * `Int64List.sublist()` → `Int64List` + * `Uint64List.sublist()` → `Uint64List` + * `Float32List.sublist()` → `Float32List` + * `Float64List.sublist()` → `Float64List` + * `Float32x4List.sublist()` → `Float32x4List` + * `Int32x4List.sublist()` → `Int32x4List` + * `Float64x2List.sublist()` → `Float64x2List` + + [36900]: https://github.com/dart-lang/sdk/issues/36900 + #### `dart:core` * Update `Uri` class to support [RFC6874](https://tools.ietf.org/html/rfc6874): diff --git a/DEPS b/DEPS index 4d8c7e932fe..e7731b9da88 100644 --- a/DEPS +++ b/DEPS @@ -85,7 +85,7 @@ vars = { "fixnum_tag": "0.10.9", "glob_tag": "1.1.7", "html_tag" : "0.14.0+1", - "http_io_rev": "57da05a66f5bf7df3dd7aebe7b7efe0dfc477baa", + "http_io_rev": "773f4bc73ef572e2c37e879b065c3b406d75e8fd", "http_multi_server_tag" : "2.0.5", "http_parser_tag" : "3.1.3", "http_retry_tag": "0.1.1", diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart index 7c563c4c516..f79cf3e9018 100644 --- a/runtime/lib/typed_data_patch.dart +++ b/runtime/lib/typed_data_patch.dart @@ -111,12 +111,13 @@ abstract class _TypedListBase { int startFromInBytes, int toCid, int fromCid) native "TypedData_setRange"; } -abstract class _IntListMixin implements List { +abstract class _IntListMixin> + implements List { int get elementSizeInBytes; int get offsetInBytes; _ByteBuffer get buffer; - List _createList(int length); + SpawnedType _createList(int length); Iterable whereType() => new WhereTypeIterable(this); @@ -441,10 +442,10 @@ abstract class _IntListMixin implements List { throw IterableElementError.tooMany(); } - List sublist(int start, [int end]) { + SpawnedType sublist(int start, [int end]) { end = RangeError.checkValidRange(start, end, this.length); var length = end - start; - List result = _createList(length); + SpawnedType result = _createList(length); result.setRange(0, length, this, start); return result; } @@ -462,12 +463,13 @@ abstract class _IntListMixin implements List { } } -abstract class _DoubleListMixin implements List { +abstract class _DoubleListMixin> + implements List { int get elementSizeInBytes; int get offsetInBytes; _ByteBuffer get buffer; - List _createList(int length); + SpawnedType _createList(int length); Iterable whereType() => new WhereTypeIterable(this); @@ -795,10 +797,10 @@ abstract class _DoubleListMixin implements List { throw IterableElementError.tooMany(); } - List sublist(int start, [int end]) { + SpawnedType sublist(int start, [int end]) { end = RangeError.checkValidRange(start, end, this.length); var length = end - start; - List result = _createList(length); + SpawnedType result = _createList(length); result.setRange(0, length, this, start); return result; } @@ -821,7 +823,7 @@ abstract class _Float32x4ListMixin implements List { int get offsetInBytes; _ByteBuffer get buffer; - List _createList(int length); + Float32x4List _createList(int length); Iterable whereType() => new WhereTypeIterable(this); @@ -1153,10 +1155,10 @@ abstract class _Float32x4ListMixin implements List { throw IterableElementError.tooMany(); } - List sublist(int start, [int end]) { + Float32x4List sublist(int start, [int end]) { end = RangeError.checkValidRange(start, end, this.length); var length = end - start; - List result = _createList(length); + Float32x4List result = _createList(length); result.setRange(0, length, this, start); return result; } @@ -1179,7 +1181,7 @@ abstract class _Int32x4ListMixin implements List { int get offsetInBytes; _ByteBuffer get buffer; - List _createList(int length); + Int32x4List _createList(int length); Iterable whereType() => new WhereTypeIterable(this); @@ -1510,10 +1512,10 @@ abstract class _Int32x4ListMixin implements List { throw IterableElementError.tooMany(); } - List sublist(int start, [int end]) { + Int32x4List sublist(int start, [int end]) { end = RangeError.checkValidRange(start, end, this.length); var length = end - start; - List result = _createList(length); + Int32x4List result = _createList(length); result.setRange(0, length, this, start); return result; } @@ -1536,7 +1538,7 @@ abstract class _Float64x2ListMixin implements List { int get offsetInBytes; _ByteBuffer get buffer; - List _createList(int length); + Float64x2List _createList(int length); Iterable whereType() => new WhereTypeIterable(this); @@ -1868,10 +1870,10 @@ abstract class _Float64x2ListMixin implements List { throw IterableElementError.tooMany(); } - List sublist(int start, [int end]) { + Float64x2List sublist(int start, [int end]) { end = RangeError.checkValidRange(start, end, this.length); var length = end - start; - List result = _createList(length); + Float64x2List result = _createList(length); result.setRange(0, length, this, start); return result; } @@ -2138,7 +2140,9 @@ class Int8List { } @pragma("vm:entry-point") -class _Int8List extends _TypedList with _IntListMixin implements Int8List { +class _Int8List extends _TypedList + with _IntListMixin + implements Int8List { factory _Int8List._uninstantiable() { throw "Unreachable"; } @@ -2184,7 +2188,9 @@ class Uint8List { } @pragma("vm:entry-point") -class _Uint8List extends _TypedList with _IntListMixin implements Uint8List { +class _Uint8List extends _TypedList + with _IntListMixin + implements Uint8List { factory _Uint8List._uninstantiable() { throw "Unreachable"; } @@ -2231,7 +2237,7 @@ class Uint8ClampedList { @pragma("vm:entry-point") class _Uint8ClampedList extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint8ClampedList { factory _Uint8ClampedList._uninstantiable() { throw "Unreachable"; @@ -2278,7 +2284,9 @@ class Int16List { } @pragma("vm:entry-point") -class _Int16List extends _TypedList with _IntListMixin implements Int16List { +class _Int16List extends _TypedList + with _IntListMixin + implements Int16List { factory _Int16List._uninstantiable() { throw "Unreachable"; } @@ -2343,7 +2351,9 @@ class Uint16List { } @pragma("vm:entry-point") -class _Uint16List extends _TypedList with _IntListMixin implements Uint16List { +class _Uint16List extends _TypedList + with _IntListMixin + implements Uint16List { factory _Uint16List._uninstantiable() { throw "Unreachable"; } @@ -2408,7 +2418,9 @@ class Int32List { } @pragma("vm:entry-point") -class _Int32List extends _TypedList with _IntListMixin implements Int32List { +class _Int32List extends _TypedList + with _IntListMixin + implements Int32List { factory _Int32List._uninstantiable() { throw "Unreachable"; } @@ -2461,7 +2473,9 @@ class Uint32List { } @pragma("vm:entry-point") -class _Uint32List extends _TypedList with _IntListMixin implements Uint32List { +class _Uint32List extends _TypedList + with _IntListMixin + implements Uint32List { factory _Uint32List._uninstantiable() { throw "Unreachable"; } @@ -2514,7 +2528,9 @@ class Int64List { } @pragma("vm:entry-point") -class _Int64List extends _TypedList with _IntListMixin implements Int64List { +class _Int64List extends _TypedList + with _IntListMixin + implements Int64List { factory _Int64List._uninstantiable() { throw "Unreachable"; } @@ -2567,7 +2583,9 @@ class Uint64List { } @pragma("vm:entry-point") -class _Uint64List extends _TypedList with _IntListMixin implements Uint64List { +class _Uint64List extends _TypedList + with _IntListMixin + implements Uint64List { factory _Uint64List._uninstantiable() { throw "Unreachable"; } @@ -2621,7 +2639,7 @@ class Float32List { @pragma("vm:entry-point") class _Float32List extends _TypedList - with _DoubleListMixin + with _DoubleListMixin implements Float32List { factory _Float32List._uninstantiable() { throw "Unreachable"; @@ -2677,7 +2695,7 @@ class Float64List { @pragma("vm:entry-point") class _Float64List extends _TypedList - with _DoubleListMixin + with _DoubleListMixin implements Float64List { factory _Float64List._uninstantiable() { throw "Unreachable"; @@ -2885,7 +2903,7 @@ class _Float64x2List extends _TypedList @pragma("vm:entry-point") class _ExternalInt8Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Int8List { factory _ExternalInt8Array._uninstantiable() { throw "Unreachable"; @@ -2919,7 +2937,7 @@ class _ExternalInt8Array extends _TypedList @pragma("vm:entry-point") class _ExternalUint8Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint8List { factory _ExternalUint8Array._uninstantiable() { throw "Unreachable"; @@ -2954,7 +2972,7 @@ class _ExternalUint8Array extends _TypedList @pragma("vm:entry-point") class _ExternalUint8ClampedArray extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint8ClampedList { factory _ExternalUint8ClampedArray._uninstantiable() { throw "Unreachable"; @@ -2989,7 +3007,7 @@ class _ExternalUint8ClampedArray extends _TypedList @pragma("vm:entry-point") class _ExternalInt16Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Int16List { factory _ExternalInt16Array._uninstantiable() { throw "Unreachable"; @@ -3031,7 +3049,7 @@ class _ExternalInt16Array extends _TypedList @pragma("vm:entry-point") class _ExternalUint16Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint16List { factory _ExternalUint16Array._uninstantiable() { throw "Unreachable"; @@ -3073,7 +3091,7 @@ class _ExternalUint16Array extends _TypedList @pragma("vm:entry-point") class _ExternalInt32Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Int32List { factory _ExternalInt32Array._uninstantiable() { throw "Unreachable"; @@ -3115,7 +3133,7 @@ class _ExternalInt32Array extends _TypedList @pragma("vm:entry-point") class _ExternalUint32Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint32List { factory _ExternalUint32Array._uninstantiable() { throw "Unreachable"; @@ -3157,7 +3175,7 @@ class _ExternalUint32Array extends _TypedList @pragma("vm:entry-point") class _ExternalInt64Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Int64List { factory _ExternalInt64Array._uninstantiable() { throw "Unreachable"; @@ -3199,7 +3217,7 @@ class _ExternalInt64Array extends _TypedList @pragma("vm:entry-point") class _ExternalUint64Array extends _TypedList - with _IntListMixin + with _IntListMixin implements Uint64List { factory _ExternalUint64Array._uninstantiable() { throw "Unreachable"; @@ -3241,7 +3259,7 @@ class _ExternalUint64Array extends _TypedList @pragma("vm:entry-point") class _ExternalFloat32Array extends _TypedList - with _DoubleListMixin + with _DoubleListMixin implements Float32List { factory _ExternalFloat32Array._uninstantiable() { throw "Unreachable"; @@ -3283,7 +3301,7 @@ class _ExternalFloat32Array extends _TypedList @pragma("vm:entry-point") class _ExternalFloat64Array extends _TypedList - with _DoubleListMixin + with _DoubleListMixin implements Float64List { factory _ExternalFloat64Array._uninstantiable() { throw "Unreachable"; @@ -3698,7 +3716,7 @@ abstract class _TypedListView extends _TypedListBase implements TypedData { @pragma("vm:entry-point") class _Int8ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Int8List { // Constructor. @pragma("vm:exact-result-type", _Int8ArrayView) @@ -3735,7 +3753,7 @@ class _Int8ArrayView extends _TypedListView @pragma("vm:entry-point") class _Uint8ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Uint8List { // Constructor. @pragma("vm:exact-result-type", _Uint8ArrayView) @@ -3772,7 +3790,7 @@ class _Uint8ArrayView extends _TypedListView @pragma("vm:entry-point") class _Uint8ClampedArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Uint8ClampedList { // Constructor. @pragma("vm:exact-result-type", _Uint8ClampedArrayView) @@ -3809,7 +3827,7 @@ class _Uint8ClampedArrayView extends _TypedListView @pragma("vm:entry-point") class _Int16ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Int16List { // Constructor. @pragma("vm:exact-result-type", _Int16ArrayView) @@ -3858,7 +3876,7 @@ class _Int16ArrayView extends _TypedListView @pragma("vm:entry-point") class _Uint16ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Uint16List { // Constructor. @pragma("vm:exact-result-type", _Uint16ArrayView) @@ -3908,7 +3926,7 @@ class _Uint16ArrayView extends _TypedListView @pragma("vm:entry-point") class _Int32ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Int32List { // Constructor. @pragma("vm:exact-result-type", _Int32ArrayView) @@ -3945,7 +3963,7 @@ class _Int32ArrayView extends _TypedListView @pragma("vm:entry-point") class _Uint32ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Uint32List { // Constructor. @pragma("vm:exact-result-type", _Uint32ArrayView) @@ -3982,7 +4000,7 @@ class _Uint32ArrayView extends _TypedListView @pragma("vm:entry-point") class _Int64ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Int64List { // Constructor. @pragma("vm:exact-result-type", _Int64ArrayView) @@ -4019,7 +4037,7 @@ class _Int64ArrayView extends _TypedListView @pragma("vm:entry-point") class _Uint64ArrayView extends _TypedListView - with _IntListMixin + with _IntListMixin implements Uint64List { // Constructor. @pragma("vm:exact-result-type", _Uint64ArrayView) @@ -4056,7 +4074,7 @@ class _Uint64ArrayView extends _TypedListView @pragma("vm:entry-point") class _Float32ArrayView extends _TypedListView - with _DoubleListMixin + with _DoubleListMixin implements Float32List { // Constructor. @pragma("vm:exact-result-type", _Float32ArrayView) @@ -4093,7 +4111,7 @@ class _Float32ArrayView extends _TypedListView @pragma("vm:entry-point") class _Float64ArrayView extends _TypedListView - with _DoubleListMixin + with _DoubleListMixin implements Float64List { // Constructor. @pragma("vm:exact-result-type", _Float64ArrayView) diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart index 497516c86e9..5c39ad4036b 100644 --- a/sdk/lib/_http/http_impl.dart +++ b/sdk/lib/_http/http_impl.dart @@ -85,14 +85,14 @@ class _CopyingBytesBuilder implements BytesBuilder { _buffer = newBuffer; } - List takeBytes() { + Uint8List takeBytes() { if (_length == 0) return _emptyList; var buffer = new Uint8List.view(_buffer.buffer, 0, _length); clear(); return buffer; } - List toBytes() { + Uint8List toBytes() { if (_length == 0) return _emptyList; return new Uint8List.fromList( new Uint8List.view(_buffer.buffer, 0, _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 4bc3ff5076a..5947ad11c65 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 @@ -171,7 +171,7 @@ class NativeFloat32x4List extends Object _storage[(index * 4) + 3] = value.w; } - List sublist(int start, [int end]) { + Float32x4List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return NativeFloat32x4List._externalStorage( _storage.sublist(start * 4, end * 4)); @@ -249,7 +249,7 @@ class NativeInt32x4List extends Object _storage[(index * 4) + 3] = value.w; } - List sublist(int start, [int end]) { + Int32x4List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return NativeInt32x4List._externalStorage( _storage.sublist(start * 4, end * 4)); @@ -321,7 +321,7 @@ class NativeFloat64x2List extends Object _storage[(index * 2) + 1] = value.y; } - List sublist(int start, [int end]) { + Float64x2List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return NativeFloat64x2List._externalStorage( _storage.sublist(start * 2, end * 2)); @@ -831,7 +831,7 @@ class NativeFloat32List extends NativeTypedArrayOfDouble Type get runtimeType => Float32List; - List sublist(int start, [int end]) { + Float32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -865,7 +865,7 @@ class NativeFloat64List extends NativeTypedArrayOfDouble Type get runtimeType => Float64List; - List sublist(int start, [int end]) { + Float64List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -903,7 +903,7 @@ class NativeInt16List extends NativeTypedArrayOfInt implements Int16List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int16List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -941,7 +941,7 @@ class NativeInt32List extends NativeTypedArrayOfInt implements Int32List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -979,7 +979,7 @@ class NativeInt8List extends NativeTypedArrayOfInt implements Int8List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int8List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -1017,7 +1017,7 @@ class NativeUint16List extends NativeTypedArrayOfInt implements Uint16List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint16List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -1055,7 +1055,7 @@ class NativeUint32List extends NativeTypedArrayOfInt implements Uint32List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -1096,7 +1096,7 @@ class NativeUint8ClampedList extends NativeTypedArrayOfInt return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint8ClampedList sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end); @@ -1145,7 +1145,7 @@ class NativeUint8List extends NativeTypedArrayOfInt implements Uint8List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint8List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, end); return _create1(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 9fa90706333..0a91641fff1 100644 --- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart +++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart @@ -163,7 +163,7 @@ class NativeFloat32x4List extends Object _storage[(index * 4) + 3] = value.w; } - List sublist(int start, [int end]) { + Float32x4List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return new NativeFloat32x4List._externalStorage( _storage.sublist(start * 4, end * 4)); @@ -235,7 +235,7 @@ class NativeInt32x4List extends Object _storage[(index * 4) + 3] = value.w; } - List sublist(int start, [int end]) { + Int32x4List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return new NativeInt32x4List._externalStorage( _storage.sublist(start * 4, end * 4)); @@ -302,7 +302,7 @@ class NativeFloat64x2List extends Object _storage[(index * 2) + 1] = value.y; } - List sublist(int start, [int end]) { + Float64x2List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); return new NativeFloat64x2List._externalStorage( _storage.sublist(start * 2, end * 2)); @@ -757,7 +757,7 @@ class NativeFloat32List extends NativeTypedArrayOfDouble Type get runtimeType => Float32List; - List sublist(int start, [int end]) { + Float32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -791,7 +791,7 @@ class NativeFloat64List extends NativeTypedArrayOfDouble Type get runtimeType => Float64List; - List sublist(int start, [int end]) { + Float64List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -829,7 +829,7 @@ class NativeInt16List extends NativeTypedArrayOfInt implements Int16List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int16List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -867,7 +867,7 @@ class NativeInt32List extends NativeTypedArrayOfInt implements Int32List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -905,7 +905,7 @@ class NativeInt8List extends NativeTypedArrayOfInt implements Int8List { return JS('int', '#[#]', this, index); } - List sublist(int start, [int end]) { + Int8List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -943,7 +943,7 @@ class NativeUint16List extends NativeTypedArrayOfInt implements Uint16List { return JS('JSUInt31', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint16List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -981,7 +981,7 @@ class NativeUint32List extends NativeTypedArrayOfInt implements Uint32List { return JS('JSUInt32', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint32List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, end); return _create1(source); @@ -1022,7 +1022,7 @@ class NativeUint8ClampedList extends NativeTypedArrayOfInt return JS('JSUInt31', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint8ClampedList sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end); @@ -1071,7 +1071,7 @@ class NativeUint8List extends NativeTypedArrayOfInt implements Uint8List { return JS('JSUInt31', '#[#]', this, index); } - List sublist(int start, [int end]) { + Uint8List sublist(int start, [int end]) { end = _checkValidRange(start, end, this.length); var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, end); return _create1(source); diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart index 66c9cac3076..39eb135db84 100644 --- a/sdk/lib/convert/utf.dart +++ b/sdk/lib/convert/utf.dart @@ -75,7 +75,7 @@ class Utf8Encoder extends Converter> { /// /// If [start] and [end] are provided, only the substring /// `string.substring(start, end)` is converted. - List convert(String string, [int start = 0, int end]) { + Uint8List convert(String string, [int start = 0, int end]) { var stringLength = string.length; end = RangeError.checkValidRange(start, end, stringLength); var length = end - start; @@ -117,7 +117,7 @@ class Utf8Encoder extends Converter> { class _Utf8Encoder { int _carry = 0; int _bufferIndex = 0; - final List _buffer; + final Uint8List _buffer; static const _DEFAULT_BYTE_BUFFER_SIZE = 1024; @@ -127,7 +127,7 @@ class _Utf8Encoder { : _buffer = _createBuffer(bufferSize); /// Allow an implementation to pick the most efficient way of storing bytes. - static List _createBuffer(int size) => Uint8List(size); + static Uint8List _createBuffer(int size) => Uint8List(size); /// Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and /// writes it to [_buffer]. diff --git a/sdk/lib/io/bytes_builder.dart b/sdk/lib/io/bytes_builder.dart index 3962037db7d..9113d44cc57 100644 --- a/sdk/lib/io/bytes_builder.dart +++ b/sdk/lib/io/bytes_builder.dart @@ -48,14 +48,14 @@ abstract class BytesBuilder { * The list returned is a view of the internal buffer, limited to the * [length]. */ - List takeBytes(); + Uint8List takeBytes(); /** * Returns a copy of the current contents of the builder. * * Leaves the contents of the builder intact. */ - List toBytes(); + Uint8List toBytes(); /** * The number of bytes in the builder. @@ -82,6 +82,7 @@ class _CopyingBytesBuilder implements BytesBuilder { // Start with 1024 bytes. static const int _initSize = 1024; + // Safe for reuse because a fixed-length empty list is immutable. static final _emptyList = new Uint8List(0); int _length = 0; @@ -135,14 +136,14 @@ class _CopyingBytesBuilder implements BytesBuilder { _buffer = newBuffer; } - List takeBytes() { + Uint8List takeBytes() { if (_length == 0) return _emptyList; var buffer = new Uint8List.view(_buffer.buffer, 0, _length); clear(); return buffer; } - List toBytes() { + Uint8List toBytes() { if (_length == 0) return _emptyList; return new Uint8List.fromList( new Uint8List.view(_buffer.buffer, 0, _length)); @@ -191,7 +192,7 @@ class _BytesBuilder implements BytesBuilder { _length++; } - List takeBytes() { + Uint8List takeBytes() { if (_length == 0) return _CopyingBytesBuilder._emptyList; if (_chunks.length == 1) { var buffer = _chunks[0]; @@ -208,7 +209,7 @@ class _BytesBuilder implements BytesBuilder { return buffer; } - List toBytes() { + Uint8List toBytes() { if (_length == 0) return _CopyingBytesBuilder._emptyList; var buffer = new Uint8List(_length); int offset = 0; diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart index eb3db4c7106..861ce47c3db 100644 --- a/sdk/lib/io/file.dart +++ b/sdk/lib/io/file.dart @@ -505,17 +505,17 @@ abstract class File implements FileSystemEntity { /** * Read the entire file contents as a list of bytes. Returns a - * `Future>` that completes with the list of bytes that + * `Future` that completes with the list of bytes that * is the contents of the file. */ - Future> readAsBytes(); + Future readAsBytes(); /** * Synchronously read the entire file contents as a list of bytes. * * Throws a [FileSystemException] if the operation fails. */ - List readAsBytesSync(); + Uint8List readAsBytesSync(); /** * Read the entire file contents as a string using the given @@ -682,7 +682,7 @@ abstract class RandomAccessFile { /** * Reads [bytes] bytes from a file and returns the result as a list of bytes. */ - Future> read(int bytes); + Future read(int bytes); /** * Synchronously reads a maximum of [bytes] bytes from a file and @@ -690,7 +690,7 @@ abstract class RandomAccessFile { * * Throws a [FileSystemException] if the operation fails. */ - List readSync(int bytes); + Uint8List readSync(int bytes); /** * Reads into an existing [List] from the file. If [start] is present, diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart index 33c13521843..68d8b1b9f38 100644 --- a/sdk/lib/io/file_impl.dart +++ b/sdk/lib/io/file_impl.dart @@ -513,10 +513,10 @@ class _File extends FileSystemEntity implements File { return new IOSink(consumer, encoding: encoding); } - Future> readAsBytes() { - Future> readDataChunked(RandomAccessFile file) { + Future readAsBytes() { + Future readDataChunked(RandomAccessFile file) { var builder = new BytesBuilder(copy: false); - var completer = new Completer>(); + var completer = new Completer(); void read() { file.read(_blockSize).then((data) { if (data.length > 0) { @@ -543,10 +543,10 @@ class _File extends FileSystemEntity implements File { }); } - List readAsBytesSync() { + Uint8List readAsBytesSync() { var opened = openSync(); try { - List data; + Uint8List data; var length = opened.lengthSync(); if (length == 0) { // May be character device, try to read it in chunks. @@ -741,19 +741,19 @@ class _RandomAccessFile implements RandomAccessFile { return result; } - Future> read(int bytes) { + Future read(int bytes) { ArgumentError.checkNotNull(bytes, 'bytes'); return _dispatch(_IOService.fileRead, [null, bytes]).then((response) { if (_isErrorResponse(response)) { throw _exceptionFromResponse(response, "read failed", path); } _resourceInfo.addRead(response[1].length); - List result = response[1]; + Uint8List result = response[1]; return result; }); } - List readSync(int bytes) { + Uint8List readSync(int bytes) { _checkAvailable(); ArgumentError.checkNotNull(bytes, 'bytes'); var result = _ops.read(bytes); diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart index 62e7ee8da60..89c9496cd73 100644 --- a/sdk/lib/typed_data/typed_data.dart +++ b/sdk/lib/typed_data/typed_data.dart @@ -772,6 +772,31 @@ abstract class Int8List implements List, _TypedIntList { return buffer.asInt8List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is an `Int8List` containing the elements of this list at + * positions greater than or equal to [start] and less than [end] in the same + * order as they occur in this list. + * + * ```dart + * var numbers = Int8List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Int8List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Int8List sublist(int start, [int end]); + static const int bytesPerElement = 1; } @@ -829,6 +854,31 @@ abstract class Uint8List implements List, _TypedIntList { */ List operator +(List other); + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Uint8List` containing the elements of this list at + * positions greater than or equal to [start] and less than [end] in the same + * order as they occur in this list. + * + * ```dart + * var numbers = Uint8List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Uint8List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Uint8List sublist(int start, [int end]); + static const int bytesPerElement = 1; } @@ -878,6 +928,31 @@ abstract class Uint8ClampedList implements List, _TypedIntList { return buffer.asUint8ClampedList(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Uint8ClampedList` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Uint8ClampedList.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Uint8ClampedList + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Uint8ClampedList sublist(int start, [int end]); + static const int bytesPerElement = 1; } @@ -930,6 +1005,31 @@ abstract class Int16List implements List, _TypedIntList { return buffer.asInt16List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is an `Int16List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Int16List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Int16List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Int16List sublist(int start, [int end]); + static const int bytesPerElement = 2; } @@ -983,6 +1083,31 @@ abstract class Uint16List implements List, _TypedIntList { return buffer.asUint16List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Uint16List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Uint16List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Uint16List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Uint16List sublist(int start, [int end]); + static const int bytesPerElement = 2; } @@ -1035,6 +1160,31 @@ abstract class Int32List implements List, _TypedIntList { return buffer.asInt32List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is an `Int32List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Int32List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Int32List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Int32List sublist(int start, [int end]); + static const int bytesPerElement = 4; } @@ -1088,6 +1238,31 @@ abstract class Uint32List implements List, _TypedIntList { return buffer.asUint32List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Uint32List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Uint32List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Uint32List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Uint32List sublist(int start, [int end]); + static const int bytesPerElement = 4; } @@ -1140,6 +1315,31 @@ abstract class Int64List implements List, _TypedIntList { return buffer.asInt64List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is an `Int64List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Int64List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Int64List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Int64List sublist(int start, [int end]); + static const int bytesPerElement = 8; } @@ -1193,6 +1393,31 @@ abstract class Uint64List implements List, _TypedIntList { return buffer.asUint64List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Uint64List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Uint64List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Uint64List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Uint64List sublist(int start, [int end]); + static const int bytesPerElement = 8; } @@ -1246,6 +1471,31 @@ abstract class Float32List implements List, _TypedFloatList { return buffer.asFloat32List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Float32List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Float32List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Float32List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Float32List sublist(int start, [int end]); + static const int bytesPerElement = 4; } @@ -1292,6 +1542,31 @@ abstract class Float64List implements List, _TypedFloatList { return buffer.asFloat64List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Float64List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Float64List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Float64List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Float64List sublist(int start, [int end]); + static const int bytesPerElement = 8; } @@ -1345,6 +1620,31 @@ abstract class Float32x4List implements List, TypedData { */ List operator +(List other); + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Float32x4List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Float32x4List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Float32x4List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Float32x4List sublist(int start, [int end]); + static const int bytesPerElement = 16; } @@ -1398,6 +1698,31 @@ abstract class Int32x4List implements List, TypedData { */ List operator +(List other); + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is an `Int32x4list` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Int32x4list.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Int32x4list + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Int32x4List sublist(int start, [int end]); + static const int bytesPerElement = 16; } @@ -1451,6 +1776,31 @@ abstract class Float64x2List implements List, TypedData { return buffer.asFloat64x2List(offsetInBytes, length); } + /** + * Returns a new list containing the elements between [start] and [end]. + * + * The new list is a `Float64x2List` containing the elements of this + * list at positions greater than or equal to [start] and less than [end] in + * the same order as they occur in this list. + * + * ```dart + * var numbers = Float64x2List.fromList([0, 1, 2, 3, 4]); + * print(numbers.sublist(1, 3)); // [1, 2] + * print(numbers.sublist(1, 3).runtimeType); // Float64x2List + * ``` + * + * If [end] is omitted, it defaults to the [length] of this list. + * + * ```dart + * print(numbers.sublist(1)); // [1, 2, 3, 4] + * ``` + * + * The `start` and `end` positions must satisfy the relations + * 0 ≤ `start` ≤ `end` ≤ `this.length` + * If `end` is equal to `start`, then the returned list is empty. + */ + Float64x2List sublist(int start, [int end]); + static const int bytesPerElement = 16; } diff --git a/sdk/lib/typed_data/unmodifiable_typed_data.dart b/sdk/lib/typed_data/unmodifiable_typed_data.dart index 4cc5af7ecfc..35490411e05 100644 --- a/sdk/lib/typed_data/unmodifiable_typed_data.dart +++ b/sdk/lib/typed_data/unmodifiable_typed_data.dart @@ -160,6 +160,16 @@ abstract class _UnmodifiableListMixin, int get lengthInBytes => _data.lengthInBytes; ByteBuffer get buffer => new UnmodifiableByteBufferView(_data.buffer); + + L _createList(int length); + + L sublist(int start, [int end]) { + end = RangeError.checkValidRange(start, end, length); + int sublistLength = end - start; + L result = _createList(sublistLength); + result.setRange(0, sublistLength, _list, start); + return result; + } } /** @@ -170,6 +180,8 @@ class UnmodifiableUint8ListView extends UnmodifiableListBase implements Uint8List { final Uint8List _list; UnmodifiableUint8ListView(Uint8List list) : _list = list; + + Uint8List _createList(int length) => Uint8List(length); } /** @@ -180,6 +192,8 @@ class UnmodifiableInt8ListView extends UnmodifiableListBase implements Int8List { final Int8List _list; UnmodifiableInt8ListView(Int8List list) : _list = list; + + Int8List _createList(int length) => Int8List(length); } /** @@ -190,6 +204,8 @@ class UnmodifiableUint8ClampedListView extends UnmodifiableListBase implements Uint8ClampedList { final Uint8ClampedList _list; UnmodifiableUint8ClampedListView(Uint8ClampedList list) : _list = list; + + Uint8ClampedList _createList(int length) => Uint8ClampedList(length); } /** @@ -200,6 +216,8 @@ class UnmodifiableUint16ListView extends UnmodifiableListBase implements Uint16List { final Uint16List _list; UnmodifiableUint16ListView(Uint16List list) : _list = list; + + Uint16List _createList(int length) => Uint16List(length); } /** @@ -210,6 +228,8 @@ class UnmodifiableInt16ListView extends UnmodifiableListBase implements Int16List { final Int16List _list; UnmodifiableInt16ListView(Int16List list) : _list = list; + + Int16List _createList(int length) => Int16List(length); } /** @@ -220,6 +240,8 @@ class UnmodifiableUint32ListView extends UnmodifiableListBase implements Uint32List { final Uint32List _list; UnmodifiableUint32ListView(Uint32List list) : _list = list; + + Uint32List _createList(int length) => Uint32List(length); } /** @@ -230,6 +252,8 @@ class UnmodifiableInt32ListView extends UnmodifiableListBase implements Int32List { final Int32List _list; UnmodifiableInt32ListView(Int32List list) : _list = list; + + Int32List _createList(int length) => Int32List(length); } /** @@ -240,6 +264,8 @@ class UnmodifiableUint64ListView extends UnmodifiableListBase implements Uint64List { final Uint64List _list; UnmodifiableUint64ListView(Uint64List list) : _list = list; + + Uint64List _createList(int length) => Uint64List(length); } /** @@ -250,6 +276,8 @@ class UnmodifiableInt64ListView extends UnmodifiableListBase implements Int64List { final Int64List _list; UnmodifiableInt64ListView(Int64List list) : _list = list; + + Int64List _createList(int length) => Int64List(length); } /** @@ -260,6 +288,8 @@ class UnmodifiableInt32x4ListView extends UnmodifiableListBase implements Int32x4List { final Int32x4List _list; UnmodifiableInt32x4ListView(Int32x4List list) : _list = list; + + Int32x4List _createList(int length) => Int32x4List(length); } /** @@ -270,6 +300,8 @@ class UnmodifiableFloat32x4ListView extends UnmodifiableListBase implements Float32x4List { final Float32x4List _list; UnmodifiableFloat32x4ListView(Float32x4List list) : _list = list; + + Float32x4List _createList(int length) => Float32x4List(length); } /** @@ -280,6 +312,8 @@ class UnmodifiableFloat64x2ListView extends UnmodifiableListBase implements Float64x2List { final Float64x2List _list; UnmodifiableFloat64x2ListView(Float64x2List list) : _list = list; + + Float64x2List _createList(int length) => Float64x2List(length); } /** @@ -290,6 +324,8 @@ class UnmodifiableFloat32ListView extends UnmodifiableListBase implements Float32List { final Float32List _list; UnmodifiableFloat32ListView(Float32List list) : _list = list; + + Float32List _createList(int length) => Float32List(length); } /** @@ -300,4 +336,6 @@ class UnmodifiableFloat64ListView extends UnmodifiableListBase implements Float64List { final Float64List _list; UnmodifiableFloat64ListView(Float64List list) : _list = list; + + Float64List _createList(int length) => Float64List(length); }