summaryrefslogtreecommitdiff
path: root/openjdkjvmti/events-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'openjdkjvmti/events-inl.h')
-rw-r--r--openjdkjvmti/events-inl.h99
1 files changed, 63 insertions, 36 deletions
diff --git a/openjdkjvmti/events-inl.h b/openjdkjvmti/events-inl.h
index 22822f8b40..23f7151c99 100644
--- a/openjdkjvmti/events-inl.h
+++ b/openjdkjvmti/events-inl.h
@@ -90,41 +90,42 @@ class ScopedEventDispatchEnvironment final : public art::ValueObject {
// Infrastructure to achieve type safety for event dispatch.
-#define FORALL_EVENT_TYPES(fn) \
- fn(VMInit, ArtJvmtiEvent::kVmInit) \
- fn(VMDeath, ArtJvmtiEvent::kVmDeath) \
- fn(ThreadStart, ArtJvmtiEvent::kThreadStart) \
- fn(ThreadEnd, ArtJvmtiEvent::kThreadEnd) \
- fn(ClassFileLoadHook, ArtJvmtiEvent::kClassFileLoadHookRetransformable) \
- fn(ClassFileLoadHook, ArtJvmtiEvent::kClassFileLoadHookNonRetransformable) \
- fn(ClassLoad, ArtJvmtiEvent::kClassLoad) \
- fn(ClassPrepare, ArtJvmtiEvent::kClassPrepare) \
- fn(VMStart, ArtJvmtiEvent::kVmStart) \
- fn(Exception, ArtJvmtiEvent::kException) \
- fn(ExceptionCatch, ArtJvmtiEvent::kExceptionCatch) \
- fn(SingleStep, ArtJvmtiEvent::kSingleStep) \
- fn(FramePop, ArtJvmtiEvent::kFramePop) \
- fn(Breakpoint, ArtJvmtiEvent::kBreakpoint) \
- fn(FieldAccess, ArtJvmtiEvent::kFieldAccess) \
- fn(FieldModification, ArtJvmtiEvent::kFieldModification) \
- fn(MethodEntry, ArtJvmtiEvent::kMethodEntry) \
- fn(MethodExit, ArtJvmtiEvent::kMethodExit) \
- fn(NativeMethodBind, ArtJvmtiEvent::kNativeMethodBind) \
- fn(CompiledMethodLoad, ArtJvmtiEvent::kCompiledMethodLoad) \
- fn(CompiledMethodUnload, ArtJvmtiEvent::kCompiledMethodUnload) \
- fn(DynamicCodeGenerated, ArtJvmtiEvent::kDynamicCodeGenerated) \
- fn(DataDumpRequest, ArtJvmtiEvent::kDataDumpRequest) \
- fn(MonitorWait, ArtJvmtiEvent::kMonitorWait) \
- fn(MonitorWaited, ArtJvmtiEvent::kMonitorWaited) \
- fn(MonitorContendedEnter, ArtJvmtiEvent::kMonitorContendedEnter) \
- fn(MonitorContendedEntered, ArtJvmtiEvent::kMonitorContendedEntered) \
- fn(ResourceExhausted, ArtJvmtiEvent::kResourceExhausted) \
- fn(GarbageCollectionStart, ArtJvmtiEvent::kGarbageCollectionStart) \
- fn(GarbageCollectionFinish, ArtJvmtiEvent::kGarbageCollectionFinish) \
- fn(ObjectFree, ArtJvmtiEvent::kObjectFree) \
- fn(VMObjectAlloc, ArtJvmtiEvent::kVmObjectAlloc) \
- fn(DdmPublishChunk, ArtJvmtiEvent::kDdmPublishChunk) \
- fn(ObsoleteObjectCreated, ArtJvmtiEvent::kObsoleteObjectCreated)
+#define FORALL_EVENT_TYPES(fn) \
+ fn(VMInit, ArtJvmtiEvent::kVmInit) \
+ fn(VMDeath, ArtJvmtiEvent::kVmDeath) \
+ fn(ThreadStart, ArtJvmtiEvent::kThreadStart) \
+ fn(ThreadEnd, ArtJvmtiEvent::kThreadEnd) \
+ fn(ClassFileLoadHook, ArtJvmtiEvent::kClassFileLoadHookRetransformable) \
+ fn(ClassFileLoadHook, ArtJvmtiEvent::kClassFileLoadHookNonRetransformable) \
+ fn(ClassLoad, ArtJvmtiEvent::kClassLoad) \
+ fn(ClassPrepare, ArtJvmtiEvent::kClassPrepare) \
+ fn(VMStart, ArtJvmtiEvent::kVmStart) \
+ fn(Exception, ArtJvmtiEvent::kException) \
+ fn(ExceptionCatch, ArtJvmtiEvent::kExceptionCatch) \
+ fn(SingleStep, ArtJvmtiEvent::kSingleStep) \
+ fn(FramePop, ArtJvmtiEvent::kFramePop) \
+ fn(Breakpoint, ArtJvmtiEvent::kBreakpoint) \
+ fn(FieldAccess, ArtJvmtiEvent::kFieldAccess) \
+ fn(FieldModification, ArtJvmtiEvent::kFieldModification) \
+ fn(MethodEntry, ArtJvmtiEvent::kMethodEntry) \
+ fn(MethodExit, ArtJvmtiEvent::kMethodExit) \
+ fn(NativeMethodBind, ArtJvmtiEvent::kNativeMethodBind) \
+ fn(CompiledMethodLoad, ArtJvmtiEvent::kCompiledMethodLoad) \
+ fn(CompiledMethodUnload, ArtJvmtiEvent::kCompiledMethodUnload) \
+ fn(DynamicCodeGenerated, ArtJvmtiEvent::kDynamicCodeGenerated) \
+ fn(DataDumpRequest, ArtJvmtiEvent::kDataDumpRequest) \
+ fn(MonitorWait, ArtJvmtiEvent::kMonitorWait) \
+ fn(MonitorWaited, ArtJvmtiEvent::kMonitorWaited) \
+ fn(MonitorContendedEnter, ArtJvmtiEvent::kMonitorContendedEnter) \
+ fn(MonitorContendedEntered, ArtJvmtiEvent::kMonitorContendedEntered) \
+ fn(ResourceExhausted, ArtJvmtiEvent::kResourceExhausted) \
+ fn(GarbageCollectionStart, ArtJvmtiEvent::kGarbageCollectionStart) \
+ fn(GarbageCollectionFinish, ArtJvmtiEvent::kGarbageCollectionFinish) \
+ fn(ObjectFree, ArtJvmtiEvent::kObjectFree) \
+ fn(VMObjectAlloc, ArtJvmtiEvent::kVmObjectAlloc) \
+ fn(DdmPublishChunk, ArtJvmtiEvent::kDdmPublishChunk) \
+ fn(ObsoleteObjectCreated, ArtJvmtiEvent::kObsoleteObjectCreated) \
+ fn(StructuralDexFileLoadHook, ArtJvmtiEvent::kStructuralDexFileLoadHook)
template <ArtJvmtiEvent kEvent>
struct EventFnType {
@@ -217,7 +218,8 @@ inline void EventHandler::DispatchClassFileLoadHookEvent(art::Thread* thread,
unsigned char** new_class_data) const {
art::ScopedThreadStateChange stsc(thread, art::ThreadState::kNative);
static_assert(kEvent == ArtJvmtiEvent::kClassFileLoadHookRetransformable ||
- kEvent == ArtJvmtiEvent::kClassFileLoadHookNonRetransformable, "Unsupported event");
+ kEvent == ArtJvmtiEvent::kClassFileLoadHookNonRetransformable ||
+ kEvent == ArtJvmtiEvent::kStructuralDexFileLoadHook, "Unsupported event");
DCHECK(*new_class_data == nullptr);
jint current_len = class_data_len;
unsigned char* current_class_data = const_cast<unsigned char*>(class_data);
@@ -588,6 +590,31 @@ inline void EventHandler::DispatchEvent<ArtJvmtiEvent::kClassFileLoadHookNonRetr
new_class_data);
}
+template <>
+inline void EventHandler::DispatchEvent<ArtJvmtiEvent::kStructuralDexFileLoadHook>(
+ art::Thread* thread,
+ JNIEnv* jnienv,
+ jclass class_being_redefined,
+ jobject loader,
+ const char* name,
+ jobject protection_domain,
+ jint class_data_len,
+ const unsigned char* class_data,
+ jint* new_class_data_len,
+ unsigned char** new_class_data) const {
+ return DispatchClassFileLoadHookEvent<ArtJvmtiEvent::kStructuralDexFileLoadHook>(
+ thread,
+ jnienv,
+ class_being_redefined,
+ loader,
+ name,
+ protection_domain,
+ class_data_len,
+ class_data,
+ new_class_data_len,
+ new_class_data);
+}
+
template <ArtJvmtiEvent kEvent>
inline bool EventHandler::ShouldDispatchOnThread(ArtJvmTiEnv* env, art::Thread* thread) const {
bool dispatch = env->event_masks.global_event_mask.Test(kEvent);