jvmti_rs/wrapper/objects/
jcapabilities.rs

1use crate::sys;
2use std::marker::PhantomData;
3
4#[derive(Clone, Copy, Debug)]
5pub struct JCapabilities<'a> {
6    caps: sys::jvmtiCapabilities,
7    lifetime: PhantomData<&'a ()>,
8}
9
10impl<'a> JCapabilities<'a> {
11    pub fn new() -> JCapabilities<'a> {
12        let caps = sys::jvmtiCapabilities {
13            _bitfield_1: sys::jvmtiCapabilities::newEmptyBitfield()
14        };
15        JCapabilities {
16            caps,
17            lifetime: PhantomData,
18        }
19    }
20
21    pub fn merge(other: sys::jvmtiCapabilities) -> JCapabilities<'a> {
22        let mut item = JCapabilities::new();
23
24        if other.can_tag_objects() == 1 { item.can_tag_objects() }
25        if other.can_generate_field_modification_events() == 1 { item.can_generate_field_modification_events() }
26        if other.can_generate_field_access_events() == 1 { item.can_generate_field_access_events() }
27        if other.can_get_bytecodes() == 1 { item.can_get_bytecodes() }
28        if other.can_get_synthetic_attribute() == 1 { item.can_get_synthetic_attribute() }
29        if other.can_get_owned_monitor_info() == 1 { item.can_get_owned_monitor_info() }
30        if other.can_get_current_contended_monitor() == 1 { item.can_get_current_contended_monitor() }
31        if other.can_get_monitor_info() == 1 { item.can_get_monitor_info() }
32        if other.can_pop_frame() == 1 { item.can_pop_frame() }
33        if other.can_redefine_classes() == 1 { item.can_redefine_classes() }
34        if other.can_signal_thread() == 1 { item.can_signal_thread() }
35        if other.can_get_source_file_name() == 1 { item.can_get_source_file_name() }
36        if other.can_get_line_numbers() == 1 { item.can_get_line_numbers() }
37        if other.can_get_source_debug_extension() == 1 { item.can_get_source_debug_extension() }
38        if other.can_access_local_variables() == 1 { item.can_access_local_variables() }
39        if other.can_maintain_original_method_order() == 1 { item.can_maintain_original_method_order() }
40        if other.can_generate_single_step_events() == 1 { item.can_generate_single_step_events() }
41        if other.can_generate_exception_events() == 1 { item.can_generate_exception_events() }
42        if other.can_generate_frame_pop_events() == 1 { item.can_generate_frame_pop_events() }
43        if other.can_generate_breakpoint_events() == 1 { item.can_generate_breakpoint_events() }
44        if other.can_suspend() == 1 { item.can_suspend() }
45        if other.can_redefine_any_class() == 1 { item.can_redefine_any_class() }
46        if other.can_get_current_thread_cpu_time() == 1 { item.can_get_current_thread_cpu_time() }
47        if other.can_get_thread_cpu_time() == 1 { item.can_get_thread_cpu_time() }
48        if other.can_generate_method_entry_events() == 1 { item.can_generate_method_entry_events() }
49        if other.can_generate_method_exit_events() == 1 { item.can_generate_method_exit_events() }
50        if other.can_generate_all_class_hook_events() == 1 { item.can_generate_all_class_hook_events() }
51        if other.can_generate_compiled_method_load_events() == 1 { item.can_generate_compiled_method_load_events() }
52        if other.can_generate_monitor_events() == 1 { item.can_generate_monitor_events() }
53        if other.can_generate_vm_object_alloc_events() == 1 { item.can_generate_vm_object_alloc_events() }
54        if other.can_generate_native_method_bind_events() == 1 { item.can_generate_native_method_bind_events() }
55        if other.can_generate_garbage_collection_events() == 1 { item.can_generate_garbage_collection_events() }
56        if other.can_generate_object_free_events() == 1 { item.can_generate_object_free_events() }
57        if other.can_force_early_return() == 1 { item.can_force_early_return() }
58        if other.can_get_owned_monitor_stack_depth_info() == 1 { item.can_get_owned_monitor_stack_depth_info() }
59        if other.can_get_constant_pool() == 1 { item.can_get_constant_pool() }
60        if other.can_set_native_method_prefix() == 1 { item.can_set_native_method_prefix() }
61        if other.can_retransform_classes() == 1 { item.can_retransform_classes() }
62        if other.can_retransform_any_class() == 1 { item.can_retransform_any_class() }
63        if other.can_generate_resource_exhaustion_heap_events() == 1 { item.can_generate_resource_exhaustion_heap_events() }
64        if other.can_generate_resource_exhaustion_heap_events() == 1 { item.can_generate_resource_exhaustion_threads_events() }
65
66        item
67    }
68
69    pub fn can_tag_objects(&mut self) { self.caps.set_can_tag_objects(1) }
70    pub fn can_generate_field_modification_events(&mut self) { self.caps.set_can_generate_field_modification_events(1) }
71    pub fn can_generate_field_access_events(&mut self) { self.caps.set_can_generate_field_access_events(1) }
72    pub fn can_get_bytecodes(&mut self) { self.caps.set_can_get_bytecodes(1) }
73    pub fn can_get_synthetic_attribute(&mut self) { self.caps.set_can_get_synthetic_attribute(1) }
74    pub fn can_get_owned_monitor_info(&mut self) { self.caps.set_can_get_owned_monitor_info(1) }
75    pub fn can_get_current_contended_monitor(&mut self) { self.caps.set_can_get_current_contended_monitor(1) }
76    pub fn can_get_monitor_info(&mut self) { self.caps.set_can_get_monitor_info(1) }
77    pub fn can_pop_frame(&mut self) { self.caps.set_can_pop_frame(1) }
78    pub fn can_redefine_classes(&mut self) { self.caps.set_can_redefine_classes(1) }
79    pub fn can_signal_thread(&mut self) { self.caps.set_can_signal_thread(1) }
80    pub fn can_get_source_file_name(&mut self) { self.caps.set_can_get_source_file_name(1) }
81    pub fn can_get_line_numbers(&mut self) { self.caps.set_can_get_line_numbers(1) }
82    pub fn can_get_source_debug_extension(&mut self) { self.caps.set_can_get_source_debug_extension(1) }
83    pub fn can_access_local_variables(&mut self) { self.caps.set_can_access_local_variables(1) }
84    pub fn can_maintain_original_method_order(&mut self) { self.caps.set_can_maintain_original_method_order(1) }
85    pub fn can_generate_single_step_events(&mut self) { self.caps.set_can_generate_single_step_events(1) }
86    pub fn can_generate_exception_events(&mut self) { self.caps.set_can_generate_exception_events(1) }
87    pub fn can_generate_frame_pop_events(&mut self) { self.caps.set_can_generate_frame_pop_events(1) }
88    pub fn can_generate_breakpoint_events(&mut self) { self.caps.set_can_generate_breakpoint_events(1) }
89    pub fn can_suspend(&mut self) { self.caps.set_can_suspend(1) }
90    pub fn can_redefine_any_class(&mut self) { self.caps.set_can_redefine_any_class(1) }
91    pub fn can_get_current_thread_cpu_time(&mut self) { self.caps.set_can_get_current_thread_cpu_time(1) }
92    pub fn can_get_thread_cpu_time(&mut self) { self.caps.set_can_get_thread_cpu_time(1) }
93    pub fn can_generate_method_entry_events(&mut self) { self.caps.set_can_generate_method_entry_events(1) }
94    pub fn can_generate_method_exit_events(&mut self) { self.caps.set_can_generate_method_exit_events(1) }
95    pub fn can_generate_all_class_hook_events(&mut self) { self.caps.set_can_generate_all_class_hook_events(1) }
96    pub fn can_generate_compiled_method_load_events(&mut self) { self.caps.set_can_generate_compiled_method_load_events(1) }
97    pub fn can_generate_monitor_events(&mut self) { self.caps.set_can_generate_monitor_events(1) }
98    pub fn can_generate_vm_object_alloc_events(&mut self) { self.caps.set_can_generate_vm_object_alloc_events(1) }
99    pub fn can_generate_native_method_bind_events(&mut self) { self.caps.set_can_generate_native_method_bind_events(1) }
100    pub fn can_generate_garbage_collection_events(&mut self) { self.caps.set_can_generate_garbage_collection_events(1) }
101    pub fn can_generate_object_free_events(&mut self) { self.caps.set_can_generate_object_free_events(1) }
102    pub fn can_force_early_return(&mut self) { self.caps.set_can_force_early_return(1) }
103    pub fn can_get_owned_monitor_stack_depth_info(&mut self) { self.caps.set_can_get_owned_monitor_stack_depth_info(1) }
104    pub fn can_get_constant_pool(&mut self) { self.caps.set_can_get_constant_pool(1) }
105    pub fn can_set_native_method_prefix(&mut self) { self.caps.set_can_set_native_method_prefix(1) }
106    pub fn can_retransform_classes(&mut self) { self.caps.set_can_retransform_classes(1) }
107    pub fn can_retransform_any_class(&mut self) { self.caps.set_can_retransform_any_class(1) }
108    pub fn can_generate_resource_exhaustion_heap_events(&mut self) { self.caps.set_can_generate_resource_exhaustion_heap_events(1) }
109    pub fn can_generate_resource_exhaustion_threads_events(&mut self) { self.caps.set_can_generate_resource_exhaustion_threads_events(1) }
110}
111
112impl<'a> From<JCapabilities<'a>> for sys::jvmtiCapabilities {
113    fn from(value: JCapabilities<'a>) -> Self {
114        value.caps
115    }
116}