ART: Add cutout for Unsafe.putObjectVolatile
Add an unstarted-runtime cutout for putObjectVolatile.
Allows to compile-time initialize:
* android.content.res.Configuration
* android.icu.text.PluralRules$SimpleTokenizer
* android.icu.text.UnicodeSet
* android.icu.util.VersionInfo
* android.util.LocaleList
May allow follow-up changes to compile-time initialize
more ICU classes.
Bug: 27265238
(cherry picked from commit 1813d116cb1367f0ae449221c7ff6c6b421d269f)
Change-Id: I775a57c9f15aa8f42a4dffbd1dd40c641c30f645
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index 0e18945..4615ec9 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -1054,6 +1054,24 @@
result->SetL(value);
}
+void UnstartedRuntime::UnstartedUnsafePutObjectVolatile(
+ Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset)
+ SHARED_REQUIRES(Locks::mutator_lock_) {
+ // Argument 0 is the Unsafe instance, skip.
+ mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1);
+ if (obj == nullptr) {
+ AbortTransactionOrFail(self, "Cannot access null object, retry at runtime.");
+ return;
+ }
+ int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2);
+ mirror::Object* value = shadow_frame->GetVRegReference(arg_offset + 4);
+ if (Runtime::Current()->IsActiveTransaction()) {
+ obj->SetFieldObjectVolatile<true>(MemberOffset(offset), value);
+ } else {
+ obj->SetFieldObjectVolatile<false>(MemberOffset(offset), value);
+ }
+}
+
void UnstartedRuntime::UnstartedUnsafePutOrderedObject(
Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset)
SHARED_REQUIRES(Locks::mutator_lock_) {