Use offsetInBytes and not index in the get/set accessors of views.

Review URL: https://codereview.chromium.org//12608006

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@20003 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
asiva@google.com 2013-03-14 11:38:17 +00:00
parent 924e321c35
commit 5b0ee63836
3 changed files with 268 additions and 110 deletions

View file

@ -109,18 +109,16 @@ CLASS_LIST_TYPED_DATA(TYPED_DATA_NEW_NATIVE)
#define TYPED_DATA_GETTER(getter, object) \
DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
if (instance.IsTypedData()) { \
const TypedData& array = TypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
return object::New(array.getter(offsetInBytes)); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
return object::New(array.getter(offsetInBytes.Value())); \
} \
if (instance.IsExternalTypedData()) { \
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
return object::New(array.getter(offsetInBytes)); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
return object::New(array.getter(offsetInBytes.Value())); \
} \
const String& error = String::Handle(String::NewFormatted( \
"Expected a TypedData object but found %s", instance.ToCString())); \
@ -134,18 +132,16 @@ DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
#define TYPED_DATA_SETTER(setter, object, get_object_value) \
DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(object, value, arguments->NativeArgAt(2)); \
if (instance.IsTypedData()) { \
const TypedData& array = TypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
array.setter(offsetInBytes, value.get_object_value()); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
array.setter(offsetInBytes.Value(), value.get_object_value()); \
} else if (instance.IsExternalTypedData()) { \
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
array.setter(offsetInBytes, value.get_object_value()); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
array.setter(offsetInBytes.Value(), value.get_object_value()); \
} else { \
const String& error = String::Handle(String::NewFormatted( \
"Expected a TypedData object but found %s", instance.ToCString())); \
@ -160,18 +156,16 @@ DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
#define TYPED_DATA_UINT64_GETTER(getter, object) \
DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
uint64_t value = 0; \
if (instance.IsTypedData()) { \
const TypedData& array = TypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
value = array.getter(offsetInBytes); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
value = array.getter(offsetInBytes.Value()); \
} else if (instance.IsExternalTypedData()) { \
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
value = array.getter(offsetInBytes); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
value = array.getter(offsetInBytes.Value()); \
} else { \
const String& error = String::Handle(String::NewFormatted( \
"Expected a TypedData object but found %s", instance.ToCString())); \
@ -196,7 +190,7 @@ DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
#define TYPED_DATA_UINT64_SETTER(setter, object) \
DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
GET_NON_NULL_NATIVE_ARGUMENT(object, value, arguments->NativeArgAt(2)); \
uint64_t object_value; \
if (value.IsBigint()) { \
@ -209,14 +203,12 @@ DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
} \
if (instance.IsTypedData()) { \
const TypedData& array = TypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
array.setter(offsetInBytes, object_value); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
array.setter(offsetInBytes.Value(), object_value); \
} else if (instance.IsExternalTypedData()) { \
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
intptr_t offsetInBytes = index.Value() * array.ElementSizeInBytes(); \
ASSERT(RangeCheck(offsetInBytes, array.LengthInBytes())); \
array.setter(offsetInBytes, object_value); \
ASSERT(RangeCheck(offsetInBytes.Value(), array.LengthInBytes())); \
array.setter(offsetInBytes.Value(), object_value); \
} else { \
const String& error = String::Handle(String::NewFormatted( \
"Expected a TypedData object but found %s", instance.ToCString())); \

View file

@ -475,35 +475,37 @@ abstract class _TypedList extends _TypedListBase implements ByteBuffer {
// Internal utility methods.
int _getInt8(int index) native "TypedData_GetInt8";
void _setInt8(int index, int value) native "TypedData_SetInt8";
int _getInt8(int offsetInBytes) native "TypedData_GetInt8";
void _setInt8(int offsetInBytes, int value) native "TypedData_SetInt8";
int _getUint8(int index) native "TypedData_GetUint8";
void _setUint8(int index, int value) native "TypedData_SetUint8";
int _getUint8(int offsetInBytes) native "TypedData_GetUint8";
void _setUint8(int offsetInBytes, int value) native "TypedData_SetUint8";
int _getInt16(int index) native "TypedData_GetInt16";
void _setInt16(int index, int value) native "TypedData_SetInt16";
int _getInt16(int offsetInBytes) native "TypedData_GetInt16";
void _setInt16(int offsetInBytes, int value) native "TypedData_SetInt16";
int _getUint16(int index) native "TypedData_GetUint16";
void _setUint16(int index, int value) native "TypedData_SetUint16";
int _getUint16(int offsetInBytes) native "TypedData_GetUint16";
void _setUint16(int offsetInBytes, int value) native "TypedData_SetUint16";
int _getInt32(int index) native "TypedData_GetInt32";
void _setInt32(int index, int value) native "TypedData_SetInt32";
int _getInt32(int offsetInBytes) native "TypedData_GetInt32";
void _setInt32(int offsetInBytes, int value) native "TypedData_SetInt32";
int _getUint32(int index) native "TypedData_GetUint32";
void _setUint32(int index, int value) native "TypedData_SetUint32";
int _getUint32(int offsetInBytes) native "TypedData_GetUint32";
void _setUint32(int offsetInBytes, int value) native "TypedData_SetUint32";
int _getInt64(int index) native "TypedData_GetInt64";
void _setInt64(int index, int value) native "TypedData_SetInt64";
int _getInt64(int offsetInBytes) native "TypedData_GetInt64";
void _setInt64(int offsetInBytes, int value) native "TypedData_SetInt64";
int _getUint64(int index) native "TypedData_GetUint64";
void _setUint64(int index, int value) native "TypedData_SetUint64";
int _getUint64(int offsetInBytes) native "TypedData_GetUint64";
void _setUint64(int offsetInBytes, int value) native "TypedData_SetUint64";
double _getFloat32(int index) native "TypedData_GetFloat32";
void _setFloat32(int index, double value) native "TypedData_SetFloat32";
double _getFloat32(int offsetInBytes) native "TypedData_GetFloat32";
void _setFloat32(int offsetInBytes, double value)
native "TypedData_SetFloat32";
double _getFloat64(int index) native "TypedData_GetFloat64";
void _setFloat64(int index, double value) native "TypedData_SetFloat64";
double _getFloat64(int offsetInBytes) native "TypedData_GetFloat64";
void _setFloat64(int offsetInBytes, double value)
native "TypedData_SetFloat64";
}
@ -713,7 +715,7 @@ class _Int16Array extends _TypedList implements Int16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt16(index);
return _getIndexedInt16(index);
}
void operator[]=(int index, int value) {
@ -721,7 +723,7 @@ class _Int16Array extends _TypedList implements Int16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt16(index, _toInt16(value));
_setIndexedInt16(index, _toInt16(value));
}
Iterator<int> get iterator {
@ -742,6 +744,14 @@ class _Int16Array extends _TypedList implements Int16List {
return _new(length);
}
int _getIndexedInt16(int index) {
return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
}
void _setIndexedInt16(int index, int value) {
_setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
}
static _Int16Array _new(int length) native "TypedData_Int16Array_new";
}
@ -774,7 +784,7 @@ class _Uint16Array extends _TypedList implements Uint16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint16(index);
return _getIndexedUint16(index);
}
void operator[]=(int index, int value) {
@ -782,7 +792,7 @@ class _Uint16Array extends _TypedList implements Uint16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint16(index, _toUint16(value));
_setIndexedUint16(index, _toUint16(value));
}
Iterator<int> get iterator {
@ -803,6 +813,14 @@ class _Uint16Array extends _TypedList implements Uint16List {
return _new(length);
}
int _getIndexedUint16(int index) {
return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
}
void _setIndexedUint16(int index, int value) {
_setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
}
static _Uint16Array _new(int length) native "TypedData_Uint16Array_new";
}
@ -835,7 +853,7 @@ class _Int32Array extends _TypedList implements Int32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt32(index);
return _getIndexedInt32(index);
}
void operator[]=(int index, int value) {
@ -843,7 +861,7 @@ class _Int32Array extends _TypedList implements Int32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt32(index, _toInt32(value));
_setIndexedInt32(index, _toInt32(value));
}
Iterator<int> get iterator {
@ -864,6 +882,14 @@ class _Int32Array extends _TypedList implements Int32List {
return _new(length);
}
int _getIndexedInt32(int index) {
return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
}
void _setIndexedInt32(int index, int value) {
_setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
}
static _Int32Array _new(int length) native "TypedData_Int32Array_new";
}
@ -896,7 +922,7 @@ class _Uint32Array extends _TypedList implements Uint32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint32(index);
return _getIndexedUint32(index);
}
void operator[]=(int index, int value) {
@ -904,7 +930,7 @@ class _Uint32Array extends _TypedList implements Uint32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint32(index, _toUint32(value));
_setIndexedUint32(index, _toUint32(value));
}
Iterator<int> get iterator {
@ -925,6 +951,14 @@ class _Uint32Array extends _TypedList implements Uint32List {
return _new(length);
}
int _getIndexedUint32(int index) {
return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
}
void _setIndexedUint32(int index, int value) {
_setInt32(index * Uint32List.BYTES_PER_ELEMENT, value);
}
static _Uint32Array _new(int length) native "TypedData_Uint32Array_new";
}
@ -957,7 +991,7 @@ class _Int64Array extends _TypedList implements Int64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt64(index);
return _getIndexedInt64(index);
}
void operator[]=(int index, int value) {
@ -965,7 +999,7 @@ class _Int64Array extends _TypedList implements Int64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt64(index, _toInt64(value));
_setIndexedInt64(index, _toInt64(value));
}
Iterator<int> get iterator {
@ -986,6 +1020,14 @@ class _Int64Array extends _TypedList implements Int64List {
return _new(length);
}
int _getIndexedInt64(int index) {
return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
}
void _setIndexedInt64(int index, int value) {
_setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
}
static _Int64Array _new(int length) native "TypedData_Int64Array_new";
}
@ -1018,7 +1060,7 @@ class _Uint64Array extends _TypedList implements Uint64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint64(index);
return _getIndexedUint64(index);
}
void operator[]=(int index, int value) {
@ -1026,7 +1068,7 @@ class _Uint64Array extends _TypedList implements Uint64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint64(index, _toUint64(value));
_setIndexedUint64(index, _toUint64(value));
}
Iterator<int> get iterator {
@ -1047,6 +1089,14 @@ class _Uint64Array extends _TypedList implements Uint64List {
return _new(length);
}
int _getIndexedUint64(int index) {
return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
}
void _setIndexedUint64(int index, int value) {
_setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
}
static _Uint64Array _new(int length) native "TypedData_Uint64Array_new";
}
@ -1079,7 +1129,7 @@ class _Float32Array extends _TypedList implements Float32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getFloat32(index);
return _getIndexedFloat32(index);
}
void operator[]=(int index, double value) {
@ -1087,7 +1137,7 @@ class _Float32Array extends _TypedList implements Float32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setFloat32(index, value);
_setIndexedFloat32(index, value);
}
Iterator<double> get iterator {
@ -1108,6 +1158,14 @@ class _Float32Array extends _TypedList implements Float32List {
return _new(length);
}
double _getIndexedFloat32(int index) {
return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
}
void _setIndexedFloat32(int index, double value) {
_setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
}
static _Float32Array _new(int length) native "TypedData_Float32Array_new";
}
@ -1140,7 +1198,7 @@ class _Float64Array extends _TypedList implements Float64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getFloat64(index);
return _getIndexedFloat64(index);
}
void operator[]=(int index, double value) {
@ -1148,7 +1206,7 @@ class _Float64Array extends _TypedList implements Float64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setFloat64(index, value);
_setIndexedFloat64(index, value);
}
Iterator<double> get iterator {
@ -1169,6 +1227,14 @@ class _Float64Array extends _TypedList implements Float64List {
return _new(length);
}
double _getIndexedFloat64(int index) {
return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
}
void _setIndexedFloat64(int index, double value) {
_setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
}
static _Float64Array _new(int length) native "TypedData_Float64Array_new";
}
@ -1350,7 +1416,7 @@ class _ExternalInt16Array extends _TypedList implements Int16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt16(index);
return _getIndexedInt16(index);
}
void operator[]=(int index, int value) {
@ -1358,7 +1424,7 @@ class _ExternalInt16Array extends _TypedList implements Int16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt16(index, _toInt16(value));
_setIndexedInt16(index, _toInt16(value));
}
Iterator<int> get iterator {
@ -1379,6 +1445,14 @@ class _ExternalInt16Array extends _TypedList implements Int16List {
return new Int16List(length);
}
int _getIndexedInt16(int index) {
return _getInt16(index * Int16List.BYTES_PER_ELEMENT);
}
void _setIndexedInt16(int index, int value) {
_setInt16(index * Int16List.BYTES_PER_ELEMENT, value);
}
static _ExternalInt16Array _new(int length) native
"ExternalTypedData_Int16Array_new";
}
@ -1403,7 +1477,7 @@ class _ExternalUint16Array extends _TypedList implements Uint16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint16(index);
return _getIndexedUint16(index);
}
void operator[]=(int index, int value) {
@ -1411,7 +1485,7 @@ class _ExternalUint16Array extends _TypedList implements Uint16List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint16(index, _toUint16(value));
_setIndexedUint16(index, _toUint16(value));
}
Iterator<int> get iterator {
@ -1432,6 +1506,14 @@ class _ExternalUint16Array extends _TypedList implements Uint16List {
return new Uint16List(length);
}
int _getIndexedUint16(int index) {
return _getUint16(index * Uint16List.BYTES_PER_ELEMENT);
}
void _setIndexedUint16(int index, int value) {
_setUint16(index * Uint16List.BYTES_PER_ELEMENT, value);
}
static _ExternalUint16Array _new(int length) native
"ExternalTypedData_Uint16Array_new";
}
@ -1456,7 +1538,7 @@ class _ExternalInt32Array extends _TypedList implements Int32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt32(index);
return _getIndexedInt32(index);
}
void operator[]=(int index, int value) {
@ -1464,7 +1546,7 @@ class _ExternalInt32Array extends _TypedList implements Int32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt32(index, _toInt32(value));
_setIndexedInt32(index, _toInt32(value));
}
Iterator<int> get iterator {
@ -1485,6 +1567,14 @@ class _ExternalInt32Array extends _TypedList implements Int32List {
return new Int32List(length);
}
int _getIndexedInt32(int index) {
return _getInt32(index * Int32List.BYTES_PER_ELEMENT);
}
void _setIndexedInt32(int index, int value) {
_setInt32(index * Int32List.BYTES_PER_ELEMENT, value);
}
static _ExternalInt32Array _new(int length) native
"ExternalTypedData_Int32Array_new";
}
@ -1509,7 +1599,7 @@ class _ExternalUint32Array extends _TypedList implements Uint32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint32(index);
return _getIndexedUint32(index);
}
void operator[]=(int index, int value) {
@ -1517,7 +1607,7 @@ class _ExternalUint32Array extends _TypedList implements Uint32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint32(index, _toUint32(value));
_setIndexedUint32(index, _toUint32(value));
}
Iterator<int> get iterator {
@ -1538,6 +1628,14 @@ class _ExternalUint32Array extends _TypedList implements Uint32List {
return new Uint32List(length);
}
int _getIndexedUint32(int index) {
return _getUint32(index * Uint32List.BYTES_PER_ELEMENT);
}
void _setIndexedUint32(int index, int value) {
_setInt32(index * Uint32List.BYTES_PER_ELEMENT, value);
}
static _ExternalUint32Array _new(int length) native
"ExternalTypedData_Uint32Array_new";
}
@ -1562,7 +1660,7 @@ class _ExternalInt64Array extends _TypedList implements Int64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getInt64(index);
return _getIndexedInt64(index);
}
void operator[]=(int index, int value) {
@ -1570,7 +1668,7 @@ class _ExternalInt64Array extends _TypedList implements Int64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setInt64(index, _toInt64(value));
_setIndexedInt64(index, _toInt64(value));
}
Iterator<int> get iterator {
@ -1591,6 +1689,14 @@ class _ExternalInt64Array extends _TypedList implements Int64List {
return new Int64List(length);
}
int _getIndexedInt64(int index) {
return _getInt64(index * Int64List.BYTES_PER_ELEMENT);
}
void _setIndexedInt64(int index, int value) {
_setInt64(index * Int64List.BYTES_PER_ELEMENT, value);
}
static _ExternalInt64Array _new(int length) native
"ExternalTypedData_Int64Array_new";
}
@ -1615,7 +1721,7 @@ class _ExternalUint64Array extends _TypedList implements Uint64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getUint64(index);
return _getIndexedUint64(index);
}
void operator[]=(int index, int value) {
@ -1623,7 +1729,7 @@ class _ExternalUint64Array extends _TypedList implements Uint64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setUint64(index, _toUint64(value));
_setIndexedUint64(index, _toUint64(value));
}
Iterator<int> get iterator {
@ -1633,10 +1739,6 @@ class _ExternalUint64Array extends _TypedList implements Uint64List {
// Method(s) implementing the TypedData interface.
Uint64List _createList(int length) {
return new Uint64List(length);
}
int get elementSizeInBytes {
return Uint64List.BYTES_PER_ELEMENT;
}
@ -1644,6 +1746,18 @@ class _ExternalUint64Array extends _TypedList implements Uint64List {
// Internal utility methods.
Uint64List _createList(int length) {
return new Uint64List(length);
}
int _getIndexedUint64(int index) {
return _getUint64(index * Uint64List.BYTES_PER_ELEMENT);
}
void _setIndexedUint64(int index, int value) {
_setUint64(index * Uint64List.BYTES_PER_ELEMENT, value);
}
static _ExternalUint64Array _new(int length) native
"ExternalTypedData_Uint64Array_new";
}
@ -1668,7 +1782,7 @@ class _ExternalFloat32Array extends _TypedList implements Float32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getFloat32(index);
return _getIndexedFloat32(index);
}
void operator[]=(int index, double value) {
@ -1676,7 +1790,7 @@ class _ExternalFloat32Array extends _TypedList implements Float32List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setFloat32(index, value);
_setIndexedFloat32(index, value);
}
Iterator<double> get iterator {
@ -1697,6 +1811,14 @@ class _ExternalFloat32Array extends _TypedList implements Float32List {
return new Float32List(length);
}
double _getIndexedFloat32(int index) {
return _getFloat32(index * Float32List.BYTES_PER_ELEMENT);
}
void _setIndexedFloat32(int index, double value) {
_setFloat32(index * Float32List.BYTES_PER_ELEMENT, value);
}
static _ExternalFloat32Array _new(int length) native
"ExternalTypedData_Float32Array_new";
}
@ -1721,7 +1843,7 @@ class _ExternalFloat64Array extends _TypedList implements Float64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
return _getFloat64(index);
return _getIndexedFloat64(index);
}
void operator[]=(int index, double value) {
@ -1729,7 +1851,7 @@ class _ExternalFloat64Array extends _TypedList implements Float64List {
String message = "$index must be in the range [0..$length)";
throw new RangeError(message);
}
_setFloat64(index, value);
_setIndexedFloat64(index, value);
}
Iterator<double> get iterator {
@ -1750,6 +1872,14 @@ class _ExternalFloat64Array extends _TypedList implements Float64List {
return new Float64List(length);
}
double _getIndexedFloat64(int index) {
return _getFloat64(index * Float64List.BYTES_PER_ELEMENT);
}
void _setIndexedFloat64(int index, double value) {
_setFloat64(index * Float64List.BYTES_PER_ELEMENT, value);
}
static _ExternalFloat64Array _new(int length) native
"ExternalTypedData_Float64Array_new";
}

View file

@ -217,68 +217,66 @@ void testIndexOf() {
testIndexOfHelper(new Uint8ClampedList.transferable(10));
}
void testGetAtIndex() {
var list = new Uint8List(8);
for (int i = 0; i < list.length; i++) {
list[i] = 42;
}
void testGetAtIndex(TypedData list, num initial_value) {
var bdata = new ByteData.view(list);
for (int i = 0; i < list.length; i++) {
for (int i = 0; i < bdata.lengthInBytes; i++) {
Expect.equals(42, bdata.getUint8(i));
Expect.equals(42, bdata.getInt8(i));
}
for (int i = 0; i < list.length ~/ 2; i++) {
for (int i = 0; i < bdata.lengthInBytes-1; i+=2) {
Expect.equals(10794, bdata.getUint16(i));
Expect.equals(10794, bdata.getInt16(i));
}
for (int i = 0; i < list.length ~/ 4; i++) {
for (int i = 0; i < bdata.lengthInBytes-3; i+=4) {
Expect.equals(707406378, bdata.getUint32(i));
Expect.equals(707406378, bdata.getInt32(i));
Expect.equals(1.511366173271439e-13, bdata.getFloat32(i));
}
for (int i = 0; i < list.length ~/ 8; i++) {
for (int i = 0; i < bdata.lengthInBytes-7; i+=8) {
Expect.equals(3038287259199220266, bdata.getUint64(i));
Expect.equals(3038287259199220266, bdata.getInt64(i));
Expect.equals(1.4260258159703532e-105, bdata.getFloat64(i));
}
}
void testSetAtIndex() {
var list = new Uint8List(8);
void validate() {
void testSetAtIndex(TypedData list,
num initial_value, [bool use_double = false]) {
void validate([reinit = true]) {
for (int i = 0; i < list.length; i++) {
Expect.equals(42, list[i]);
Expect.equals(initial_value, list[i]);
if (reinit) list[i] = use_double? 0.0 : 0;
}
}
var bdata = new ByteData.view(list);
for (int i = 0; i < list.length; i++) bdata.setUint8(i, 42);
for (int i = 0; i < bdata.lengthInBytes; i++) bdata.setUint8(i, 42);
validate();
for (int i = 0; i < list.length; i++) bdata.setInt8(i, 42);
for (int i = 0; i < bdata.lengthInBytes; i++) bdata.setInt8(i, 42);
validate();
for (int i = 0; i < list.length ~/ 2; i++) bdata.setUint16(i, 10794);
for (int i = 0; i < bdata.lengthInBytes-1; i+=2) bdata.setUint16(i, 10794);
validate();
for (int i = 0; i < list.length ~/ 2; i++) bdata.setInt16(i, 10794);
for (int i = 0; i < bdata.lengthInBytes-1; i+=2) bdata.setInt16(i, 10794);
validate();
for (int i = 0; i < list.length ~/ 4; i++) bdata.setUint32(i, 707406378);
for (int i = 0; i < bdata.lengthInBytes-3; i+=4)
bdata.setUint32(i, 707406378);
validate();
for (int i = 0; i < list.length ~/ 4; i++) bdata.setInt32(i, 707406378);
for (int i = 0; i < bdata.lengthInBytes-3; i+=4) bdata.setInt32(i, 707406378);
validate();
for (int i = 0; i < list.length ~/ 4; i++) {
for (int i = 0; i < bdata.lengthInBytes-3; i+=4) {
bdata.setFloat32(i, 1.511366173271439e-13);
}
validate();
for (int i = 0; i < list.length ~/ 8; i++) {
for (int i = 0; i < bdata.lengthInBytes-7; i+=8) {
bdata.setUint64(i, 3038287259199220266);
}
validate();
for (int i = 0; i < list.length ~/ 8; i++) {
for (int i = 0; i < bdata.lengthInBytes-7; i+=8) {
bdata.setInt64(i, 3038287259199220266);
}
validate();
for (int i = 0; i < list.length ~/ 8; i++) {
for (int i = 0; i < bdata.lengthInBytes-7; i+=8) {
bdata.setFloat64(i, 1.4260258159703532e-105);
}
validate();
validate(false);
}
main() {
@ -293,8 +291,46 @@ main() {
testSetRange();
testIndexOutOfRange();
testIndexOf();
testGetAtIndex();
testSetAtIndex();
var int8list = new Int8List(128);
testSetAtIndex(int8list, 42);
testGetAtIndex(int8list, 42);
var uint8list = new Uint8List(128);
testSetAtIndex(uint8list, 42);
testGetAtIndex(uint8list, 42);
var int16list = new Int16List(64);
testSetAtIndex(int16list, 10794);
testGetAtIndex(int16list, 10794);
var uint16list = new Uint16List(64);
testSetAtIndex(uint16list, 10794);
testGetAtIndex(uint16list, 10794);
var int32list = new Int32List(32);
testSetAtIndex(int32list, 707406378);
testGetAtIndex(int32list, 707406378);
var uint32list = new Uint32List(32);
testSetAtIndex(uint32list, 707406378);
testGetAtIndex(uint32list, 707406378);
var int64list = new Int64List(16);
testSetAtIndex(int64list, 3038287259199220266);
testGetAtIndex(int64list, 3038287259199220266);
var uint64list = new Uint64List(16);
testSetAtIndex(uint64list, 3038287259199220266);
testGetAtIndex(uint64list, 3038287259199220266);
var float32list = new Float32List(32);
testSetAtIndex(float32list, 1.511366173271439e-13, true);
testGetAtIndex(float32list, 1.511366173271439e-13);
var float64list = new Float64List(16);
testSetAtIndex(float64list, 1.4260258159703532e-105, true);
testGetAtIndex(float64list, 1.4260258159703532e-105);
}
testTypedDataRange(true);
testUnsignedTypedDataRange(true);