Interpreter.
The opcodes filled-new-array and packed-switch aren't implemented but
are trivial given that they are variants of implemented opcodes.
Refactor Field::Get routines to take the declaring class in the case of
static field accesses. This avoids a check on every use of a field.
Refactor arg array builder to be shared by JNI invokes and invocations
into the interpreter.
Fix benign bug in const decoding in the verifier.
Change-Id: I8dee6c1f4b7f033e6c003422c56e9471cfaccda8
diff --git a/src/oat/runtime/support_field.cc b/src/oat/runtime/support_field.cc
index 53b53b2..9336247 100644
--- a/src/oat/runtime/support_field.cc
+++ b/src/oat/runtime/support_field.cc
@@ -26,12 +26,12 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
if (LIKELY(field != NULL)) {
- return field->Get32(NULL);
+ return field->Get32(field->GetDeclaringClass());
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int32_t));
if (LIKELY(field != NULL)) {
- return field->Get32(NULL);
+ return field->Get32(field->GetDeclaringClass());
}
return 0; // Will throw exception by checking with Thread::Current
}
@@ -41,12 +41,12 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
if (LIKELY(field != NULL)) {
- return field->Get64(NULL);
+ return field->Get64(field->GetDeclaringClass());
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int64_t));
if (LIKELY(field != NULL)) {
- return field->Get64(NULL);
+ return field->Get64(field->GetDeclaringClass());
}
return 0; // Will throw exception by checking with Thread::Current
}
@@ -56,12 +56,12 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Field* field = FindFieldFast(field_idx, referrer, StaticObjectRead, sizeof(Object*));
if (LIKELY(field != NULL)) {
- return field->GetObj(NULL);
+ return field->GetObj(field->GetDeclaringClass());
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticObjectRead, sizeof(Object*));
if (LIKELY(field != NULL)) {
- return field->GetObj(NULL);
+ return field->GetObj(field->GetDeclaringClass());
}
return NULL; // Will throw exception by checking with Thread::Current
}
@@ -132,13 +132,13 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
if (LIKELY(field != NULL)) {
- field->Set32(NULL, new_value);
+ field->Set32(field->GetDeclaringClass(), new_value);
return 0; // success
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int32_t));
if (LIKELY(field != NULL)) {
- field->Set32(NULL, new_value);
+ field->Set32(field->GetDeclaringClass(), new_value);
return 0; // success
}
return -1; // failure
@@ -149,13 +149,13 @@
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
if (LIKELY(field != NULL)) {
- field->Set64(NULL, new_value);
+ field->Set64(field->GetDeclaringClass(), new_value);
return 0; // success
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int64_t));
if (LIKELY(field != NULL)) {
- field->Set64(NULL, new_value);
+ field->Set64(field->GetDeclaringClass(), new_value);
return 0; // success
}
return -1; // failure
@@ -168,14 +168,14 @@
Field* field = FindFieldFast(field_idx, referrer, StaticObjectWrite, sizeof(Object*));
if (LIKELY(field != NULL)) {
if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
- field->SetObj(NULL, new_value);
+ field->SetObj(field->GetDeclaringClass(), new_value);
return 0; // success
}
}
FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
field = FindFieldFromCode(field_idx, referrer, self, StaticObjectWrite, sizeof(Object*));
if (LIKELY(field != NULL)) {
- field->SetObj(NULL, new_value);
+ field->SetObj(field->GetDeclaringClass(), new_value);
return 0; // success
}
return -1; // failure