jvmti_rs/wrapper/descriptors/
exception_desc.rs1use 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 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 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 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}