diff options
Diffstat (limited to 'openjdkjvmti/transform.cc')
| -rw-r--r-- | openjdkjvmti/transform.cc | 9 |
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; |