diff options
author | 2018-01-31 03:52:27 +0000 | |
---|---|---|
committer | 2018-01-31 03:52:27 +0000 | |
commit | c7e546ff3963a1d51b1f100d308db735bd19f736 (patch) | |
tree | 10b1ddbd3c5f29f5e68b6d4f99dfba7c58f6461a /openjdkjvmti/transform.cc | |
parent | 029cb250d140f5c3499aafc94454c6a63cfc50ac (diff) | |
parent | 64e4c145e9301615a339a0981b1bc34fbe78c2f9 (diff) |
Merge "Refactor JVMTI ClassFileLoadHook handling"
Diffstat (limited to 'openjdkjvmti/transform.cc')
-rw-r--r-- | openjdkjvmti/transform.cc | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/openjdkjvmti/transform.cc b/openjdkjvmti/transform.cc index 3a5fcccf35..8445ecab16 100644 --- a/openjdkjvmti/transform.cc +++ b/openjdkjvmti/transform.cc @@ -63,27 +63,46 @@ namespace openjdkjvmti { +// Initialize templates. +template +void Transformer::TransformSingleClassDirect<ArtJvmtiEvent::kClassFileLoadHookNonRetransformable>( + EventHandler* event_handler, art::Thread* self, /*in-out*/ArtClassDefinition* def); +template +void Transformer::TransformSingleClassDirect<ArtJvmtiEvent::kClassFileLoadHookRetransformable>( + EventHandler* event_handler, art::Thread* self, /*in-out*/ArtClassDefinition* def); + +template<ArtJvmtiEvent kEvent> +void Transformer::TransformSingleClassDirect(EventHandler* event_handler, + art::Thread* self, + /*in-out*/ArtClassDefinition* def) { + static_assert(kEvent == ArtJvmtiEvent::kClassFileLoadHookNonRetransformable || + kEvent == ArtJvmtiEvent::kClassFileLoadHookRetransformable, + "bad event type"); + jint new_len = -1; + unsigned char* new_data = nullptr; + art::ArrayRef<const unsigned char> dex_data = def->GetDexData(); + event_handler->DispatchEvent<kEvent>( + self, + static_cast<JNIEnv*>(self->GetJniEnv()), + def->GetClass(), + def->GetLoader(), + def->GetName().c_str(), + def->GetProtectionDomain(), + static_cast<jint>(dex_data.size()), + dex_data.data(), + /*out*/&new_len, + /*out*/&new_data); + def->SetNewDexData(new_len, new_data); +} + jvmtiError Transformer::RetransformClassesDirect( - ArtJvmTiEnv* env, EventHandler* event_handler, art::Thread* self, /*in-out*/std::vector<ArtClassDefinition>* definitions) { for (ArtClassDefinition& def : *definitions) { - jint new_len = -1; - unsigned char* new_data = nullptr; - art::ArrayRef<const unsigned char> dex_data = def.GetDexData(); - event_handler->DispatchEvent<ArtJvmtiEvent::kClassFileLoadHookRetransformable>( - self, - GetJniEnv(env), - def.GetClass(), - def.GetLoader(), - def.GetName().c_str(), - def.GetProtectionDomain(), - static_cast<jint>(dex_data.size()), - dex_data.data(), - /*out*/&new_len, - /*out*/&new_data); - def.SetNewDexData(env, new_len, new_data); + TransformSingleClassDirect<ArtJvmtiEvent::kClassFileLoadHookRetransformable>(event_handler, + self, + &def); } return OK; } @@ -120,13 +139,13 @@ jvmtiError Transformer::RetransformClasses(ArtJvmTiEnv* env, return ERR(UNMODIFIABLE_CLASS); } ArtClassDefinition def; - res = def.Init(env, classes[i]); + res = def.Init(self, classes[i]); if (res != OK) { return res; } definitions.push_back(std::move(def)); } - res = RetransformClassesDirect(env, event_handler, self, &definitions); + res = RetransformClassesDirect(event_handler, self, &definitions); if (res != OK) { return res; } |