jvmti_rs/wrapper/jvmtifns/
field.rs

1use std::ptr;
2
3use jni::strings::JNIString;
4
5use crate::{Desc, errors::*, JFieldName, JSignature, JVMTIEnv, objects::*, sys::*, to_bool, Transform};
6
7impl<'a> JVMTIEnv<'a> {
8    pub fn get_field_id<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<(JClass, JFieldID)>
9        where
10            K: Into<JNIString>,
11            F: Into<JNIString>,
12            V: Into<JNIString> {
13        let class_name = class.into();
14
15        let klass: JClass = class_name.lookup(jni)?;
16        Ok((klass, (klass, name, sig).lookup(jni)?))
17    }
18
19    pub fn get_static_field_id<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<(JClass, JStaticFieldID)>
20        where
21            K: Into<JNIString>,
22            F: Into<JNIString>,
23            V: Into<JNIString> {
24        let class_name = class.into();
25
26        let klass: JClass = class_name.lookup(jni)?;
27        Ok((klass, (klass, name, sig).lookup(jni)?))
28    }
29
30    pub fn get_field_name<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<JFieldName>
31        where
32            K: Transform<'a, JClass<'a>>,
33            F: Transform<'a, jfieldID> {
34        let klass: JClass = class.transform(jni)?;
35
36        let mut name = ptr::null_mut();
37        let mut signature = ptr::null_mut();
38        let mut generic = ptr::null_mut();
39        let res = jvmti_call_result!(self.jvmti_raw(), GetFieldName,
40            klass.into_inner(),
41            field.transform(jni)?,
42            &mut name,
43            &mut signature,
44            &mut generic
45        );
46        jvmti_error_code_to_result(res)?;
47
48        let signature = JSignature::new(self.build_string(signature)?, self.build_string(generic)?)?;
49        Ok(JFieldName::new(self.build_string(name)?, signature))
50    }
51
52    pub fn get_field_declaring_class<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<JObject>
53        where
54            K: Transform<'a, JClass<'a>>,
55            F: Transform<'a, jfieldID> {
56        let klass: JClass = class.transform(jni)?;
57
58        let mut value_ptr: jclass = ptr::null_mut();
59        let res = jvmti_call_result!(self.jvmti_raw(), GetFieldDeclaringClass,
60            klass.into_inner(),
61            field.transform(jni)?,
62            &mut value_ptr
63        );
64        jvmti_error_code_to_result(res)?;
65        Ok(value_ptr.into())
66    }
67
68    pub fn get_field_modifiers<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<jint>
69        where
70            K: Transform<'a, JClass<'a>>,
71            F: Transform<'a, jfieldID> {
72        let klass: JClass = class.transform(jni)?;
73
74        Ok(jvmti_call_number_result!(self.jvmti_raw(), jint,
75            GetFieldModifiers,
76            klass.into_inner(),
77            field.transform(jni)?
78        ))
79    }
80
81    pub fn is_field_synthetic<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<bool>
82        where
83            K: Transform<'a, JClass<'a>>,
84            F: Transform<'a, jfieldID> {
85        let klass: JClass = class.transform(jni)?;
86
87        let res = jvmti_call_number_result!(self.jvmti_raw(), jboolean,
88            IsFieldSynthetic,
89            klass.into_inner(),
90            field.transform(jni)?
91        );
92        Ok(to_bool(res))
93    }
94}