summaryrefslogtreecommitdiffstats
path: root/runtime/interpreter/interpreter.cc
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2014-02-17 15:16:03 +0100
committerSebastien Hertz <shertz@google.com>2014-02-18 15:29:33 +0100
commitf48644b6cfd35fd029fc85dc7c837ad19b4a5ba3 (patch)
treec5e3f47f129702e24b74c58bfe73a55d2cffa9b0 /runtime/interpreter/interpreter.cc
parent2c3458dbda97b70158ee7ef22d13ce473a2a2147 (diff)
downloadart-f48644b6cfd35fd029fc85dc7c837ad19b4a5ba3.zip
art-f48644b6cfd35fd029fc85dc7c837ad19b4a5ba3.tar.gz
art-f48644b6cfd35fd029fc85dc7c837ad19b4a5ba3.tar.bz2
Update native methods whitelist.
Adds System.identityHashCode to native methods whitelist and updates Unsafe.compareAndSwapInt to use mirror::Object::CasField32. Bug: 12999675 Change-Id: I177015777927b2d2180cbfd0f3a646948e7557b3
Diffstat (limited to 'runtime/interpreter/interpreter.cc')
-rw-r--r--runtime/interpreter/interpreter.cc20
1 files changed, 8 insertions, 12 deletions
diff --git a/runtime/interpreter/interpreter.cc b/runtime/interpreter/interpreter.cc
index a674571..cb9e2e8 100644
--- a/runtime/interpreter/interpreter.cc
+++ b/runtime/interpreter/interpreter.cc
@@ -69,27 +69,23 @@ static void UnstartedRuntimeJni(Thread* self, ArtMethod* method,
} else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") {
ScopedObjectAccessUnchecked soa(self);
result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa)));
+ } else if (name == "int java.lang.System.identityHashCode(java.lang.Object)") {
+ mirror::Object* obj = reinterpret_cast<Object*>(args[0]);
+ result->SetI((obj != nullptr) ? obj->IdentityHashCode() : 0);
} else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") {
- result->SetJ(JNI_TRUE);
+ result->SetZ(JNI_TRUE);
} else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") {
Object* obj = reinterpret_cast<Object*>(args[0]);
jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1];
jint expectedValue = args[3];
jint newValue = args[4];
- byte* raw_addr = reinterpret_cast<byte*>(obj) + offset;
- volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr);
- // Check offset is 32bits to fit in MemberOffset.
- CHECK_GE(offset, static_cast<jlong>(std::numeric_limits<int32_t>::min()));
- CHECK_LE(offset, static_cast<jlong>(std::numeric_limits<int32_t>::max()));
- Runtime::Current()->RecordWriteField32(obj, MemberOffset(offset), *address, true);
- // Note: android_atomic_release_cas() returns 0 on success, not failure.
- int r = android_atomic_release_cas(expectedValue, newValue, address);
- result->SetZ(r == 0);
+ bool success = obj->CasField32<true>(MemberOffset(offset), expectedValue, newValue);
+ result->SetZ(success ? JNI_TRUE : JNI_FALSE);
} else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") {
Object* obj = reinterpret_cast<Object*>(args[0]);
+ jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1];
Object* newValue = reinterpret_cast<Object*>(args[3]);
- obj->SetFieldObject<true>(MemberOffset((static_cast<uint64_t>(args[2]) << 32) | args[1]),
- newValue, false);
+ obj->SetFieldObject<true>(MemberOffset(offset), newValue, false);
} else if (name == "int sun.misc.Unsafe.getArrayBaseOffsetForComponentType(java.lang.Class)") {
mirror::Class* component = reinterpret_cast<Object*>(args[0])->AsClass();
Primitive::Type primitive_type = component->GetPrimitiveType();