| Index: runtime/lib/typed_data.dart
|
| diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
|
| index b1845732b7df58203cae4084736826644c89f0e1..3b60823dfee554880c2ef88595bca63394d984da 100644
|
| --- a/runtime/lib/typed_data.dart
|
| +++ b/runtime/lib/typed_data.dart
|
| @@ -299,7 +299,7 @@ patch class Float64x2 {
|
| patch class ByteData {
|
| /* patch */ factory ByteData(int length) {
|
| var list = new _Uint8Array(length);
|
| - return new _ByteDataView(list.buffer, 0, length);
|
| + return new _ByteDataView(list, 0, length);
|
| }
|
|
|
| /* patch */ factory ByteData.view(ByteBuffer buffer,
|
| @@ -307,7 +307,12 @@ patch class ByteData {
|
| if (length == null) {
|
| length = buffer.lengthInBytes - offsetInBytes;
|
| }
|
| - return new _ByteDataView(buffer, offsetInBytes, length);
|
| + return new _ByteDataView(buffer._data, offsetInBytes, length);
|
| + }
|
| +
|
| + // Called directly from C code.
|
| + factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
|
| + return new _ByteDataView(typedData, offsetInBytes, length);
|
| }
|
| }
|
|
|
| @@ -551,10 +556,10 @@ abstract class _TypedListBase {
|
| if ((count < 10) && (from.buffer != this.buffer)) {
|
| Lists.copy(from, skipCount, this, start, count);
|
| return;
|
| - } else if (this.buffer._setRange(
|
| + } else if (this.buffer._data._setRange(
|
| start * elementSizeInBytes + this.offsetInBytes,
|
| count * elementSizeInBytes,
|
| - from.buffer,
|
| + from.buffer._data,
|
| skipCount * elementSizeInBytes + from.offsetInBytes,
|
| this._cid, from._cid)) {
|
| return;
|
| @@ -608,7 +613,20 @@ abstract class _TypedListBase {
|
| }
|
|
|
|
|
| -abstract class _TypedList extends _TypedListBase implements ByteBuffer {
|
| +class _ByteBuffer implements ByteBuffer {
|
| + final _TypedList _data;
|
| +
|
| + _ByteBuffer(this._data);
|
| +
|
| + // Forward calls to _data.
|
| + int get lengthInBytes => _data.lengthInBytes;
|
| + int get hashCode => _data.hashCode;
|
| + bool operator==(Object other) =>
|
| + (other is _ByteBuffer) && identical(_data, other._data);
|
| +}
|
| +
|
| +
|
| +abstract class _TypedList extends _TypedListBase {
|
| // Default method implementing parts of the TypedData interface.
|
| int get offsetInBytes {
|
| return 0;
|
| @@ -618,9 +636,7 @@ abstract class _TypedList extends _TypedListBase implements ByteBuffer {
|
| return length * elementSizeInBytes;
|
| }
|
|
|
| - ByteBuffer get buffer {
|
| - return this;
|
| - }
|
| + ByteBuffer get buffer => new _ByteBuffer(this);
|
|
|
| // Methods implementing the collection interface.
|
|
|
| @@ -2514,8 +2530,8 @@ class _TypedListIterator<E> implements Iterator<E> {
|
|
|
|
|
| class _TypedListView extends _TypedListBase implements TypedData {
|
| - _TypedListView(ByteBuffer _buffer, int _offset, int _length)
|
| - : _typedData = _buffer, // This assignment is type safe.
|
| + _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
|
| + : _typedData = _buffer._data,
|
| offsetInBytes = _offset,
|
| length = _length {
|
| }
|
| @@ -3263,11 +3279,11 @@ class _Float64x2ArrayView extends _TypedListView implements Float64x2List {
|
|
|
|
|
| class _ByteDataView implements ByteData {
|
| - _ByteDataView(ByteBuffer _buffer, int _offsetInBytes, int _lengthInBytes)
|
| - : _typedData = _buffer, // _buffer is guaranteed to be a TypedData here.
|
| + _ByteDataView(TypedData typedData, int _offsetInBytes, int _lengthInBytes)
|
| + : _typedData = typedData,
|
| _offset = _offsetInBytes,
|
| length = _lengthInBytes {
|
| - _rangeCheck(_buffer.lengthInBytes, _offset, length);
|
| + _rangeCheck(_typedData.lengthInBytes, _offset, length);
|
| }
|
|
|
|
|
|
|