jvmti_rs/wrapper/jvmtifns/
watched_field.rs

1use jni::strings::JNIString;
2use jni_sys::jfieldID;
3
4use crate::{AdapterTransform, errors::*, JVMTIEnv, objects::*, Transform};
5
6impl<'a> JVMTIEnv<'a> {
7    pub fn set_field_access_watch<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<()>
8        where
9            K: Transform<'a, JClass<'a>>,
10            F: AdapterTransform<jfieldID> {
11        let klass: JClass = class.transform(jni)?;
12
13        jvmti_call!(self.jvmti_raw(), SetFieldAccessWatch,
14            klass.into_inner(),
15            field.transform()
16        )
17    }
18
19    pub fn clear_field_access_watch<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<()>
20        where
21            K: Transform<'a, JClass<'a>>,
22            F: AdapterTransform<jfieldID> {
23        let klass: JClass = class.transform(jni)?;
24
25        jvmti_call!(self.jvmti_raw(), ClearFieldAccessWatch,
26            klass.into_inner(),
27            field.transform()
28        )
29    }
30
31    pub fn set_field_modification_watch<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<()>
32        where
33            K: Transform<'a, JClass<'a>>,
34            F: AdapterTransform<jfieldID> {
35        let klass: JClass = class.transform(jni)?;
36
37        jvmti_call!(self.jvmti_raw(), SetFieldModificationWatch,
38            klass.into_inner(),
39            field.transform()
40        )
41    }
42
43    pub fn clear_field_modification_watch<K, F>(&self, jni: &jni::JNIEnv<'a>, class: K, field: F) -> Result<()>
44        where
45            K: Transform<'a, JClass<'a>>,
46            F: AdapterTransform<jfieldID> {
47        let klass: JClass = class.transform(jni)?;
48
49        jvmti_call!(self.jvmti_raw(), ClearFieldModificationWatch,
50            klass.into_inner(),
51            field.transform()
52        )
53    }
54
55    pub fn set_field_access_watch_s<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<()>
56        where
57            K: Into<JNIString>,
58            F: Into<JNIString>,
59            V: Into<JNIString> {
60        let (klass, field) = self.get_field_id(jni, class, name, sig)?;
61
62        jvmti_call!(self.jvmti_raw(), SetFieldAccessWatch,
63            klass.into_inner(),
64            field.into_inner()
65        )
66    }
67
68    pub fn clear_field_access_watch_s<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<()>
69        where
70            K: Into<JNIString>,
71            F: Into<JNIString>,
72            V: Into<JNIString> {
73        let (klass, field) = self.get_field_id(jni, class, name, sig)?;
74
75        jvmti_call!(self.jvmti_raw(), ClearFieldAccessWatch,
76            klass.into_inner(),
77            field.into_inner()
78        )
79    }
80
81    pub fn set_field_modification_watch_s<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<()>
82        where
83            K: Into<JNIString>,
84            F: Into<JNIString>,
85            V: Into<JNIString> {
86        let (klass, field) = self.get_field_id(jni, class, name, sig)?;
87
88        jvmti_call!(self.jvmti_raw(), SetFieldModificationWatch,
89            klass.into_inner(),
90            field.into_inner()
91        )
92    }
93
94    pub fn clear_field_modification_watch_s<K, F, V>(&self, jni: &jni::JNIEnv<'a>, class: K, name: F, sig: V) -> Result<()>
95        where
96            K: Into<JNIString>,
97            F: Into<JNIString>,
98            V: Into<JNIString> {
99        let (klass, field) = self.get_field_id(jni, class, name, sig)?;
100
101        jvmti_call!(self.jvmti_raw(), ClearFieldModificationWatch,
102            klass.into_inner(),
103            field.into_inner()
104        )
105    }
106}