jvmti_rs/wrapper/
macros.rs

1
2// see https://github.com/jni-rs/jni-rs/blob/master/src/wrapper/macros.rs
3
4macro_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}