jvmti_rs/wrapper/jvmtifns/
field.rs1use 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}