jvmti_rs/wrapper/
macros.rs1
2macro_rules! jvmti_call {
5 ( $jvmtienv:expr, $name:tt $(, $args:expr )* ) => ({
6 log::trace!("calling checked jvmti method: {}", stringify!($name));
7
8 let res = unsafe {
9 jvmti_method!($jvmtienv, $name)($jvmtienv, $($args),*)
10 };
11
12 return jvmti_error_code_to_result(res)
13 })
14}
15
16macro_rules! jvmti_call_result {
17 ( $jvmtienv:expr, $name:tt $(, $args:expr )* ) => ({
18 log::trace!("calling checked jvmti method: {}", stringify!($name));
19
20 let res = unsafe {
21 jvmti_method!($jvmtienv, $name)($jvmtienv, $($args),*)
22 };
23
24 res
25 })
26}
27
28macro_rules! jvmti_call_number_result {
29 ( $jvmtienv:expr, $type:block, $name:tt) => ({
30 let def = (||$type)();
31 let mut value = def;
32 let res = jvmti_call_result!($jvmtienv, $name,
33 &mut value
34 );
35 jvmti_error_code_to_result(res)?;
36 value
37 });
38 ( $jvmtienv:expr, $type:ty, $name:tt) => ({
39 let mut value: $type = 0 as $type;
40 let res = jvmti_call_result!($jvmtienv, $name,
41 &mut value
42 );
43 jvmti_error_code_to_result(res)?;
44 value
45 });
46 ( $jvmtienv:expr, $type:ty, $name:tt $(, $args:expr )* ) => ({
47 let mut value: $type = 0 as $type;
48 let res = jvmti_call_result!($jvmtienv, $name,
49 $($args),*,
50 &mut value
51 );
52 jvmti_error_code_to_result(res)?;
53 value
54 });
55}
56
57macro_rules! jvmti_call_ptr_result {
58 ( $jvmtienv:expr, $type:tt, $name:tt $(, $args:expr )* ) => ({
59 let mut value: $type = ptr::null_mut();
60 let res = jvmti_call_result!($jvmtienv, $name,
61 $($args),*,
62 &mut value
63 );
64 jvmti_error_code_to_result(res)?;
65 value
66 })
67}
68
69macro_rules! non_null {
70 ( $obj:expr, $ctx:expr ) => {
71 if $obj.is_null() {
72 return Err($crate::wrapper::errors::ErrorKind::NullPtr($ctx).into());
73 } else {
74 $obj
75 }
76 };
77}
78
79macro_rules! jvmti_method {
80 ( $jvmtienv:expr, $name:tt ) => {{
81 log::trace!("looking up jvmti method {}", stringify!($name));
82 let env = $jvmtienv;
83 match deref!(deref!(env, "JVMTIEnv"), "*JVMTIEnv").$name {
84 Some(method) => {
85 log::trace!("found jvmti method");
86 method
87 }
88 None => {
89 log::trace!("jvmtienv method not defined, returning error");
90 return Err($crate::wrapper::errors::Error::from(
91 $crate::wrapper::errors::ErrorKind::JVMTIEnvMethodNotFound(stringify!($name)),
92 ).into());
93 }
94 }
95 }};
96}
97
98macro_rules! java_vm_unchecked {
99 ( $java_vm:expr, $name:tt $(, $args:expr )* ) => ({
100 log::trace!("calling unchecked JavaVM method: {}", stringify!($name));
101 java_vm_method!($java_vm, $name)($java_vm, $($args),*)
102 })
103}
104
105
106macro_rules! java_vm_method {
107 ( $jvmtienv:expr, $name:tt ) => {{
108 log::trace!("looking up JavaVM method {}", stringify!($name));
109 let env = $jvmtienv;
110 match deref!(deref!(env, "JavaVM"), "*JavaVM").$name {
111 Some(meth) => {
112 log::trace!("found JavaVM method");
113 meth
114 }
115 None => {
116 log::trace!("JavaVM method not defined, returning error");
117 return Err($crate::wrapper::errors::Error::from(
118 $crate::wrapper::errors::ErrorKind::JavaVMMethodNotFound(stringify!($name)),
119 )
120 .into());
121 }
122 }
123 }};
124}
125
126macro_rules! deref {
127 ( $obj:expr, $ctx:expr ) => {
128 if $obj.is_null() {
129 return Err($crate::wrapper::errors::ErrorKind::NullDeref($ctx).into());
130 } else {
131 #[allow(unused_unsafe)]
132 unsafe {
133 *$obj
134 }
135 }
136 };
137}
138
139
140#[macro_export]
141macro_rules! jvmti {
142 ($jvmti_env:expr) => {
143 $crate::JVMTIEnv::from_raw($jvmti_env).unwrap();
144 };
145}
146
147#[macro_export]
148macro_rules! jni {
149 ($jni_env:expr) => {
150 $crate::jni::JNIEnv::from_raw($jni_env).unwrap();
151 };
152}
153
154#[macro_export]
155macro_rules! java_vm {
156 ($vm:expr) => {{
157 unsafe {
158 $crate::JavaVM::from_raw($vm).unwrap()
159 }
160 }};
161}