summaryrefslogtreecommitdiff
path: root/openjdkjvmti/transform.cc
diff options
context:
space:
mode:
Diffstat (limited to 'openjdkjvmti/transform.cc')
-rw-r--r--openjdkjvmti/transform.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/openjdkjvmti/transform.cc b/openjdkjvmti/transform.cc
index 7b19a24ba4..dc9f69a96a 100644
--- a/openjdkjvmti/transform.cc
+++ b/openjdkjvmti/transform.cc
@@ -128,6 +128,11 @@ class TransformationFaultHandler FINAL : public art::FaultHandler {
}
}
+ if (LIKELY(self != nullptr)) {
+ CHECK_EQ(self->GetState(), art::ThreadState::kNative)
+ << "Transformation fault handler occurred outside of native mode";
+ }
+
VLOG(signals) << "Lazy initialization of dex file for transformation of " << res->GetName()
<< " during SEGV";
res->InitializeMemory();
@@ -250,6 +255,10 @@ void Transformer::TransformSingleClassDirect(EventHandler* event_handler,
static_assert(kEvent == ArtJvmtiEvent::kClassFileLoadHookNonRetransformable ||
kEvent == ArtJvmtiEvent::kClassFileLoadHookRetransformable,
"bad event type");
+ // We don't want to do transitions between calling the event and setting the new data so change to
+ // native state early. This also avoids any problems that the FaultHandler might have in
+ // determining if an access to the dex_data is from generated code or not.
+ art::ScopedThreadStateChange stsc(self, art::ThreadState::kNative);
ScopedDefinitionHandler handler(def);
jint new_len = -1;
unsigned char* new_data = nullptr;