Use offset in sun.misc.Unsafe#copyMemoryTo/FromArray
Change-Id: I4b6a89d1949b687d91712c236b31636fe0cde122
diff --git a/runtime/native/sun_misc_Unsafe.cc b/runtime/native/sun_misc_Unsafe.cc
index b0352ec..b4b037b 100644
--- a/runtime/native/sun_misc_Unsafe.cc
+++ b/runtime/native/sun_misc_Unsafe.cc
@@ -293,22 +293,28 @@
}
template<typename T>
-static void copyToArray(jlong srcAddr, mirror::PrimitiveArray<T>* array, size_t size)
+static void copyToArray(jlong srcAddr, mirror::PrimitiveArray<T>* array,
+ size_t array_offset,
+ size_t size)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
const T* src = reinterpret_cast<T*>(srcAddr);
size_t sz = size / sizeof(T);
+ size_t of = array_offset / sizeof(T);
for (size_t i = 0; i < sz; ++i) {
- array->Set(i, *(src + i));
+ array->Set(i + of, *(src + i));
}
}
template<typename T>
-static void copyFromArray(jlong dstAddr, mirror::PrimitiveArray<T>* array, size_t size)
+static void copyFromArray(jlong dstAddr, mirror::PrimitiveArray<T>* array,
+ size_t array_offset,
+ size_t size)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_){
T* dst = reinterpret_cast<T*>(dstAddr);
size_t sz = size / sizeof(T);
+ size_t of = array_offset / sizeof(T);
for (size_t i = 0; i < sz; ++i) {
- *(dst + i) = array->Get(i);
+ *(dst + i) = array->Get(i + of);
}
}
@@ -327,16 +333,17 @@
ThrowIllegalAccessException(nullptr, "wrong number of bytes");
}
size_t sz = (size_t)size;
+ size_t dst_offset = (size_t)dstOffset;
mirror::Object* dst = soa.Decode<mirror::Object*>(dstObj);
mirror::Class* component_type = dst->GetClass()->GetComponentType();
if (component_type->IsPrimitiveByte() || component_type->IsPrimitiveBoolean()) {
- copyToArray(srcAddr, dst->AsByteSizedArray(), sz);
+ copyToArray(srcAddr, dst->AsByteSizedArray(), dst_offset, sz);
} else if (component_type->IsPrimitiveShort() || component_type->IsPrimitiveChar()) {
- copyToArray(srcAddr, dst->AsShortSizedArray(), sz);
+ copyToArray(srcAddr, dst->AsShortSizedArray(), dst_offset, sz);
} else if (component_type->IsPrimitiveInt() || component_type->IsPrimitiveFloat()) {
- copyToArray(srcAddr, dst->AsIntArray(), sz);
+ copyToArray(srcAddr, dst->AsIntArray(), dst_offset, sz);
} else if (component_type->IsPrimitiveLong() || component_type->IsPrimitiveDouble()) {
- copyToArray(srcAddr, dst->AsLongArray(), sz);
+ copyToArray(srcAddr, dst->AsLongArray(), dst_offset, sz);
} else {
ThrowIllegalAccessException(nullptr, "not a primitive array");
}
@@ -357,16 +364,17 @@
ThrowIllegalAccessException(nullptr, "wrong number of bytes");
}
size_t sz = (size_t)size;
+ size_t src_offset = (size_t)srcOffset;
mirror::Object* src = soa.Decode<mirror::Object*>(srcObj);
mirror::Class* component_type = src->GetClass()->GetComponentType();
if (component_type->IsPrimitiveByte() || component_type->IsPrimitiveBoolean()) {
- copyFromArray(dstAddr, src->AsByteSizedArray(), sz);
+ copyFromArray(dstAddr, src->AsByteSizedArray(), src_offset, sz);
} else if (component_type->IsPrimitiveShort() || component_type->IsPrimitiveChar()) {
- copyFromArray(dstAddr, src->AsShortSizedArray(), sz);
+ copyFromArray(dstAddr, src->AsShortSizedArray(), src_offset, sz);
} else if (component_type->IsPrimitiveInt() || component_type->IsPrimitiveFloat()) {
- copyFromArray(dstAddr, src->AsIntArray(), sz);
+ copyFromArray(dstAddr, src->AsIntArray(), src_offset, sz);
} else if (component_type->IsPrimitiveLong() || component_type->IsPrimitiveDouble()) {
- copyFromArray(dstAddr, src->AsLongArray(), sz);
+ copyFromArray(dstAddr, src->AsLongArray(), src_offset, sz);
} else {
ThrowIllegalAccessException(nullptr, "not a primitive array");
}