| Index: runtime/lib/byte_array.cc
|
| ===================================================================
|
| --- runtime/lib/byte_array.cc (revision 3811)
|
| +++ runtime/lib/byte_array.cc (working copy)
|
| @@ -30,20 +30,41 @@
|
| }
|
|
|
|
|
| -static void RangeCheck(const ByteArray& array, const Smi& index,
|
| +static void RangeCheck(const ByteArray& array,
|
| + intptr_t index,
|
| intptr_t num_bytes) {
|
| - if ((index.Value() < 0) || ((index.Value() + num_bytes) > array.Length())) {
|
| + if (!Utils::RangeCheck(index, num_bytes, array.Length())) {
|
| GrowableArray<const Object*> arguments;
|
| - arguments.Add(&index);
|
| + const Smi &index_object = Smi::Handle(Smi::New(index));
|
| + arguments.Add(&index_object);
|
| Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
|
| }
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) {
|
| + ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0));
|
| + GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1));
|
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2));
|
| + GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3));
|
| + GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4));
|
| + intptr_t length_value = length.Value();
|
| + intptr_t src_start_value = src_start.Value();
|
| + intptr_t dst_start_value = dst_start.Value();
|
| + if (length_value < 0) {
|
| + GrowableArray<const Object*> args;
|
| + Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
|
| + }
|
| + RangeCheck(src, src_start_value, length_value);
|
| + RangeCheck(dst, dst_start_value, length_value);
|
| + ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value);
|
| +}
|
| +
|
| +
|
| #define GETTER(ArrayT, ObjectT, ValueT) \
|
| GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
|
| GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \
|
| - RangeCheck(array, index, sizeof(ValueT)); \
|
| + RangeCheck(array, index.Value(), sizeof(ValueT)); \
|
| ValueT result = array.UnalignedAt<ValueT>(index.Value()); \
|
| arguments->SetReturn(ObjectT::Handle(ObjectT::New(result)));
|
|
|
| @@ -51,7 +72,7 @@
|
| #define SETTER(ArrayT, ObjectT, Getter, ValueT) \
|
| GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
|
| GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \
|
| - RangeCheck(array, index, sizeof(ValueT)); \
|
| + RangeCheck(array, index.Value(), sizeof(ValueT)); \
|
| GET_NATIVE_ARGUMENT(ObjectT, value, arguments->At(2)); \
|
| array.SetUnalignedAt<ValueT>(index.Value(), value.Getter());
|
|
|
|
|