jvmti_rs/wrapper/descriptors/
exception_desc.rs

1use crate::*;
2use crate::{objects::*, errors::*};
3use jni::strings::JNIString;
4use jni::errors::Exception;
5use jni::JNIEnv;
6
7const DEFAULT_EXCEPTION_CLASS: &str = "java/lang/RuntimeException";
8
9impl<'a, M> Desc<'a, JThrowable<'a>> for (JClass<'a>, M)
10    where
11        M: Into<JNIString>, {
12    fn lookup(self, jni: &JNIEnv<'a>) -> Result<JThrowable<'a>> {
13        let jmsg: JObject = jni.new_string(self.1)
14            .map_err(jni_lookup_error)?
15            .into();
16        let obj: JThrowable = jni
17            .new_object(self.0, "(Ljava/lang/String;)V", &[JValue::from(jmsg)])
18            .map_err(jni_lookup_error)?
19            .into();
20        Ok(obj)
21    }
22}
23
24impl<'a> Desc<'a, JThrowable<'a>> for Exception {
25    fn lookup(self, jni: &JNIEnv<'a>) -> Result<JThrowable<'a>> {
26        let jni_class: JNIString = self.class.into();
27        let class: JClass = jni_class.lookup(jni)?;
28        (class, self.msg).lookup(jni)
29    }
30}
31
32impl<'a> Desc<'a, JThrowable<'a>> for &'a str {
33    //noinspection DuplicatedCode
34    fn lookup(self, jni: &JNIEnv<'a>) -> Result<JThrowable<'a>> {
35        let class: JClass = DEFAULT_EXCEPTION_CLASS.lookup(jni)?;
36        (class, self).lookup(jni)
37    }
38}
39
40impl<'a> Desc<'a, JThrowable<'a>> for String {
41    //noinspection DuplicatedCode
42    fn lookup(self, jni: &JNIEnv<'a>) -> Result<JThrowable<'a>> {
43        let class: JClass = DEFAULT_EXCEPTION_CLASS.lookup(jni)?;
44        (class, self).lookup(jni)
45    }
46}
47
48impl<'a> Desc<'a, JThrowable<'a>> for JNIString {
49    //noinspection DuplicatedCode
50    fn lookup(self, jni: &JNIEnv<'a>) -> Result<JThrowable<'a>> {
51        let class: JClass = DEFAULT_EXCEPTION_CLASS.lookup(jni)?;
52        (class, self).lookup(jni)
53    }
54}