Follow-up 128393
Avoids false warning when initializing the exception's class by
marking the transaction aborted after throwing the InternalError
exception.
Also uses VLOG(compiler) to print the warning since it's only useful
when investigating ahead-of-time class initialization.
Bug: 19202032
Change-Id: I3c53639cbb888086ad345d668d1e5b73c5aaf861
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 8c5827c..824d65f 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1560,15 +1560,17 @@
const std::string& abort_message) {
DCHECK(IsCompiler());
DCHECK(IsActiveTransaction());
+ // Throwing an exception may cause its class initialization. If we mark the transaction
+ // aborted before that, we may warn with a false alarm. Throwing the exception before
+ // marking the transaction aborted avoids that.
+ preinitialization_transaction_->ThrowInternalError(self, false);
preinitialization_transaction_->Abort(abort_message);
- ThrowInternalErrorForAbortedTransaction(self);
}
void Runtime::ThrowInternalErrorForAbortedTransaction(Thread* self) {
DCHECK(IsCompiler());
DCHECK(IsActiveTransaction());
- DCHECK(IsTransactionAborted());
- preinitialization_transaction_->ThrowInternalError(self);
+ preinitialization_transaction_->ThrowInternalError(self, true);
}
void Runtime::RecordWriteFieldBoolean(mirror::Object* obj, MemberOffset field_offset,