| Index: runtime/lib/byte_array.cc
|
| ===================================================================
|
| --- runtime/lib/byte_array.cc (revision 3698)
|
| +++ runtime/lib/byte_array.cc (working copy)
|
| @@ -30,6 +30,35 @@
|
| }
|
|
|
|
|
| +DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) {
|
| + ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0));
|
| + GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(1));
|
| + GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(2));
|
| + GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(3));
|
| + GET_NATIVE_ARGUMENT(Smi, count, arguments->At(4));
|
| + if (count.Value() < 0) {
|
| + GrowableArray<const Object*> args;
|
| + Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
|
| + }
|
| + if (!dart::Utils::RangeCheck(src_start.Value(),
|
| + count.Value(),
|
| + src.Length())) {
|
| + GrowableArray<const Object*> arguments;
|
| + arguments.Add(&src_start);
|
| + Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
|
| + }
|
| + if (!dart::Utils::RangeCheck(dst_start.Value(),
|
| + count.Value(),
|
| + dst.Length())) {
|
| + GrowableArray<const Object*> arguments;
|
| + arguments.Add(&dst_start);
|
| + Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
|
| + }
|
| + ByteArray::Copy(
|
| + dst, dst_start.Value(), src, src_start.Value(), count.Value());
|
| +}
|
| +
|
| +
|
| static void RangeCheck(const ByteArray& array, const Smi& index,
|
| intptr_t num_bytes) {
|
| if ((index.Value() < 0) || ((index.Value() + num_bytes) > array.Length())) {
|
|
|