diff options
Diffstat (limited to 'runtime/interpreter/interpreter_goto_table_impl.cc')
-rw-r--r-- | runtime/interpreter/interpreter_goto_table_impl.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/runtime/interpreter/interpreter_goto_table_impl.cc b/runtime/interpreter/interpreter_goto_table_impl.cc index d0bb001..74b7c42 100644 --- a/runtime/interpreter/interpreter_goto_table_impl.cc +++ b/runtime/interpreter/interpreter_goto_table_impl.cc @@ -496,7 +496,7 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* } HANDLE_INSTRUCTION_END(); - HANDLE_INSTRUCTION_START(ARRAY_LENGTH) { + HANDLE_INSTRUCTION_START(ARRAY_LENGTH) { Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); if (UNLIKELY(array == NULL)) { ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); @@ -509,12 +509,20 @@ JValue ExecuteGotoImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* HANDLE_INSTRUCTION_END(); HANDLE_INSTRUCTION_START(NEW_INSTANCE) { + Runtime* runtime = Runtime::Current(); Object* obj = AllocObjectFromCode<do_access_check, true>( inst->VRegB_21c(), shadow_frame.GetMethod(), self, - Runtime::Current()->GetHeap()->GetCurrentAllocator()); + runtime->GetHeap()->GetCurrentAllocator()); if (UNLIKELY(obj == NULL)) { HANDLE_PENDING_EXCEPTION(); } else { + // Don't allow finalizable objects to be allocated during a transaction since these can't be + // finalized without a started runtime. + if (transaction_active && obj->GetClass()->IsFinalizable()) { + AbortTransaction(self, "Allocating finalizable object in transcation: %s", + PrettyTypeOf(obj).c_str()); + HANDLE_PENDING_EXCEPTION(); + } shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj); ADVANCE(2); } |