diff options
author | Vladimir Marko <vmarko@google.com> | 2018-11-09 17:12:23 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2018-11-12 15:26:21 +0000 |
commit | 104883b04617a850adf11f05e57c2fd29e09c83c (patch) | |
tree | 51d436588505a3ead506d633bdf97c9b4c934ae0 /runtime/native/java_lang_System.cc | |
parent | 00e96d054e2b656d4d0f99fc141d1701af4dba23 (diff) |
Clean up primitive array helpers in Object.
Refactor these helpers and avoid read barriers. Remove
Class::Is{Int,Long}ArrayClass() and use the Object helpers
instead.
Remove the AsByteSizedArray() and AsShortSizedArray()
helpers that essentially break the type system and rewrite
their users, adding appropriate notes. {Float,Double}Array
uses in Unsafe would have previously failed a DCHECK().
Test: Additional test in 004-UnsafeTest.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I88b7e3df7de883f64cfc5eb437a40646f2884685
Diffstat (limited to 'runtime/native/java_lang_System.cc')
-rw-r--r-- | runtime/native/java_lang_System.cc | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/runtime/native/java_lang_System.cc b/runtime/native/java_lang_System.cc index 2c4184c285..e4bc8ce5a2 100644 --- a/runtime/native/java_lang_System.cc +++ b/runtime/native/java_lang_System.cc @@ -101,32 +101,36 @@ static void System_arraycopy(JNIEnv* env, jclass, jobject javaSrc, jint srcPos, case Primitive::kPrimBoolean: case Primitive::kPrimByte: DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 1U); - dstArray->AsByteSizedArray()->Memmove(dstPos, srcArray->AsByteSizedArray(), srcPos, count); + // Note: Treating BooleanArray as ByteArray. + ObjPtr<mirror::ByteArray>::DownCast(dstArray)->Memmove( + dstPos, ObjPtr<mirror::ByteArray>::DownCast(srcArray), srcPos, count); return; case Primitive::kPrimChar: case Primitive::kPrimShort: DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 2U); - dstArray->AsShortSizedArray()->Memmove(dstPos, srcArray->AsShortSizedArray(), srcPos, count); + // Note: Treating CharArray as ShortArray. + ObjPtr<mirror::ShortArray>::DownCast(dstArray)->Memmove( + dstPos, ObjPtr<mirror::ShortArray>::DownCast(srcArray), srcPos, count); return; case Primitive::kPrimInt: - DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 4U); - dstArray->AsIntArray()->Memmove(dstPos, srcArray->AsIntArray(), srcPos, count); - return; case Primitive::kPrimFloat: DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 4U); - dstArray->AsFloatArray()->Memmove(dstPos, srcArray->AsFloatArray(), srcPos, count); + // Note: Treating FloatArray as IntArray. + ObjPtr<mirror::IntArray>::DownCast(dstArray)->Memmove( + dstPos, ObjPtr<mirror::IntArray>::DownCast(srcArray), srcPos, count); return; case Primitive::kPrimLong: - DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 8U); - dstArray->AsLongArray()->Memmove(dstPos, srcArray->AsLongArray(), srcPos, count); - return; case Primitive::kPrimDouble: DCHECK_EQ(Primitive::ComponentSize(dstComponentPrimitiveType), 8U); - dstArray->AsDoubleArray()->Memmove(dstPos, srcArray->AsDoubleArray(), srcPos, count); + // Note: Treating DoubleArray as LongArray. + ObjPtr<mirror::LongArray>::DownCast(dstArray)->Memmove( + dstPos, ObjPtr<mirror::LongArray>::DownCast(srcArray), srcPos, count); return; case Primitive::kPrimNot: { - mirror::ObjectArray<mirror::Object>* dstObjArray = dstArray->AsObjectArray<mirror::Object>(); - mirror::ObjectArray<mirror::Object>* srcObjArray = srcArray->AsObjectArray<mirror::Object>(); + mirror::ObjectArray<mirror::Object>* dstObjArray = + dstArray->AsObjectArray<mirror::Object>(); + mirror::ObjectArray<mirror::Object>* srcObjArray = + srcArray->AsObjectArray<mirror::Object>(); dstObjArray->AssignableMemmove(dstPos, srcObjArray, srcPos, count); return; } |