1use crate::sys;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
7pub enum JvmtiError {
8 #[error("Empty argument")]
9 EmptyArgument,
10 #[error("Invalid thread")]
11 InvalidThread,
12 #[error("Invalid thread group")]
13 InvalidThreadGroup,
14 #[error("Invalid priority")]
15 InvalidPriority,
16 #[error("Thread is not suspended")]
17 ThreadNotSuspended,
18 #[error("Thread is already suspended")]
19 ThreadSuspended,
20 #[error("Thread is not alive")]
21 ThreadNotAlive,
22 #[error("Invalid object")]
23 InvalidObject,
24 #[error("Invalid class")]
25 InvalidClass,
26 #[error("The class is not prepared yet")]
27 ClassNotPrepared,
28 #[error("Invalid method id")]
29 InvalidMethodId,
30 #[error("Invalid location")]
31 InvalidLocation,
32 #[error("Invalid field id")]
33 InvalidFieldId,
34 #[error("There are no more stack frames")]
35 NoMoreFrames,
36 #[error("No information is available about the stack frame")]
37 OpaqueFrame,
38 #[error("Variable type mismatch")]
39 TypeMismatch,
40 #[error("Invalid slot")]
41 InvalidSlot,
42 #[error("The item is already set")]
43 Duplicate,
44 #[error("Element is not found")]
45 NotFound,
46 #[error("Invalid raw monitor")]
47 InvalidMonitor,
48 #[error("The raw monitor is not owned by this thread")]
49 NotMonitorOwner,
50 #[error("The call has been interrupted")]
51 Interrupt,
52 #[error("Malformed class file")]
53 InvalidClassFormat,
54 #[error("Circular class definition")]
55 CircularClassDefinition,
56 #[error("The class fails verification")]
57 FailsVerification,
58 #[error("Class redefinition not possible, method addition is unsupported")]
59 UnsupportedRedefinitionMethodAdded,
60 #[error("Class redefinition not possible, field change is unsupported")]
61 UnsupportedRedefinitionSchemaChanged,
62 #[error("The thread state is inconsistent due to it having been modified")]
63 InvalidTypeState,
64 #[error("Class redefinition not possible, class hierarchy change is unsupported")]
65 UnsupportedRedefinitionHierarchyChanged,
66 #[error("Class redefinition not possible, method deletion is unsupported")]
67 UnsupportedRedefinitionMethodDeleted,
68 #[error("Class file version is unsupported")]
69 UnsupportedVersion,
70 #[error("Class names do not match")]
71 NamesDontMatch,
72 #[error("Class redefinition not possible, class modifiers change is unsupported")]
73 UnsupportedRedefinitionClassModifiersChanged,
74 #[error("Class redefinition not possible, method modifiers change is unsupported")]
75 UnsupportedRedefinitionMethodModifiersChanged,
76 #[error("The class is unmodifiable")]
77 UnmodifiableClass,
78 #[error("The functionality is not available")]
79 NotAvaliable,
80 #[error("This environment does not possess the required capability")]
81 MustPosessCapability,
82 #[error("Unexpected null pointer")]
83 NullPointer,
84 #[error("Information is not available")]
85 AbsentInformation,
86 #[error("Invalid event type")]
87 InvalidEventType,
88 #[error("Illegal argument")]
89 IllegalArgument,
90 #[error("Information is not available for native method")]
91 NativeMethod,
92 #[error("This class loader does not support the requested operation")]
93 ClassLoaderUnsupported,
94 #[error("Out of memory")]
95 OutOfMemory,
96 #[error("Access denied")]
97 AccessDenied,
98 #[error("The functionality is not available in the current phase")]
99 WrongPhase,
100 #[error("Unexpected internal error")]
101 Internal,
102 #[error("The thread is not attached to the virtual machine")]
103 UnattachedThread,
104 #[error("Invalid environment")]
105 InvalidEnvironment,
106 #[error("Unsupported JVMTI error code: {0}")]
107 UnsupportedError(sys::jvmtiError),
108}
109
110impl From<sys::jvmtiError> for JvmtiError {
111 fn from(error: sys::jvmtiError) -> Self {
112 match error {
113 sys::JVMTI_ERROR_INVALID_THREAD => JvmtiError::InvalidThread,
114 sys::JVMTI_ERROR_INVALID_THREAD_GROUP => JvmtiError::InvalidThreadGroup,
115 sys::JVMTI_ERROR_INVALID_PRIORITY => JvmtiError::InvalidPriority,
116 sys::JVMTI_ERROR_THREAD_NOT_SUSPENDED => JvmtiError::ThreadNotSuspended,
117 sys::JVMTI_ERROR_THREAD_SUSPENDED => JvmtiError::ThreadSuspended,
118 sys::JVMTI_ERROR_THREAD_NOT_ALIVE => JvmtiError::ThreadNotAlive,
119 sys::JVMTI_ERROR_INVALID_OBJECT => JvmtiError::InvalidObject,
120 sys::JVMTI_ERROR_INVALID_CLASS => JvmtiError::InvalidClass,
121 sys::JVMTI_ERROR_CLASS_NOT_PREPARED => JvmtiError::ClassNotPrepared,
122 sys::JVMTI_ERROR_INVALID_METHODID => JvmtiError::InvalidMethodId,
123 sys::JVMTI_ERROR_INVALID_LOCATION => JvmtiError::InvalidLocation,
124 sys::JVMTI_ERROR_INVALID_FIELDID => JvmtiError::InvalidFieldId,
125 sys::JVMTI_ERROR_NO_MORE_FRAMES => JvmtiError::NoMoreFrames,
126 sys::JVMTI_ERROR_OPAQUE_FRAME => JvmtiError::OpaqueFrame,
127 sys::JVMTI_ERROR_TYPE_MISMATCH => JvmtiError::TypeMismatch,
128 sys::JVMTI_ERROR_INVALID_SLOT => JvmtiError::InvalidSlot,
129 sys::JVMTI_ERROR_DUPLICATE => JvmtiError::Duplicate,
130 sys::JVMTI_ERROR_NOT_FOUND => JvmtiError::NotFound,
131 sys::JVMTI_ERROR_INVALID_MONITOR => JvmtiError::InvalidMonitor,
132 sys::JVMTI_ERROR_NOT_MONITOR_OWNER => JvmtiError::NotMonitorOwner,
133 sys::JVMTI_ERROR_INTERRUPT => JvmtiError::Interrupt,
134 sys::JVMTI_ERROR_INVALID_CLASS_FORMAT => JvmtiError::InvalidClassFormat,
135 sys::JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION => JvmtiError::CircularClassDefinition,
136 sys::JVMTI_ERROR_FAILS_VERIFICATION => JvmtiError::FailsVerification,
137 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED => JvmtiError::UnsupportedRedefinitionMethodAdded,
138 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED => JvmtiError::UnsupportedRedefinitionSchemaChanged,
139 sys::JVMTI_ERROR_INVALID_TYPESTATE => JvmtiError::InvalidTypeState,
140 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED => JvmtiError::UnsupportedRedefinitionHierarchyChanged,
141 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED => JvmtiError::UnsupportedRedefinitionMethodDeleted,
142 sys::JVMTI_ERROR_UNSUPPORTED_VERSION => JvmtiError::UnsupportedVersion,
143 sys::JVMTI_ERROR_NAMES_DONT_MATCH => JvmtiError::NamesDontMatch,
144 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED => JvmtiError::UnsupportedRedefinitionClassModifiersChanged,
145 sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED => JvmtiError::UnsupportedRedefinitionMethodModifiersChanged,
146 sys::JVMTI_ERROR_UNMODIFIABLE_CLASS => JvmtiError::UnmodifiableClass,
147 sys::JVMTI_ERROR_NOT_AVAILABLE => JvmtiError::NotAvaliable,
148 sys::JVMTI_ERROR_MUST_POSSESS_CAPABILITY => JvmtiError::MustPosessCapability,
149 sys::JVMTI_ERROR_NULL_POINTER => JvmtiError::NullPointer,
150 sys::JVMTI_ERROR_ABSENT_INFORMATION => JvmtiError::AbsentInformation,
151 sys::JVMTI_ERROR_INVALID_EVENT_TYPE => JvmtiError::InvalidEventType,
152 sys::JVMTI_ERROR_ILLEGAL_ARGUMENT => JvmtiError::IllegalArgument,
153 sys::JVMTI_ERROR_NATIVE_METHOD => JvmtiError::NativeMethod,
154 sys::JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED => JvmtiError::ClassLoaderUnsupported,
155 sys::JVMTI_ERROR_OUT_OF_MEMORY => JvmtiError::OutOfMemory,
156 sys::JVMTI_ERROR_ACCESS_DENIED => JvmtiError::AccessDenied,
157 sys::JVMTI_ERROR_WRONG_PHASE => JvmtiError::WrongPhase,
158 sys::JVMTI_ERROR_INTERNAL => JvmtiError::Internal,
159 sys::JVMTI_ERROR_UNATTACHED_THREAD => JvmtiError::UnattachedThread,
160 sys::JVMTI_ERROR_INVALID_ENVIRONMENT => JvmtiError::InvalidEnvironment,
161 _ => JvmtiError::UnsupportedError(error),
162 }
163 }
164}
165
166
167impl From<JvmtiError> for sys::jvmtiError {
168 fn from(error: JvmtiError) -> Self {
169 match error {
170 JvmtiError::InvalidThread => sys::JVMTI_ERROR_INVALID_THREAD,
171 JvmtiError::InvalidThreadGroup => sys::JVMTI_ERROR_INVALID_THREAD_GROUP,
172 JvmtiError::InvalidPriority => sys::JVMTI_ERROR_INVALID_PRIORITY,
173 JvmtiError::ThreadNotSuspended => sys::JVMTI_ERROR_THREAD_NOT_SUSPENDED,
174 JvmtiError::ThreadSuspended => sys::JVMTI_ERROR_THREAD_SUSPENDED,
175 JvmtiError::ThreadNotAlive => sys::JVMTI_ERROR_THREAD_NOT_ALIVE,
176 JvmtiError::InvalidObject => sys::JVMTI_ERROR_INVALID_OBJECT,
177 JvmtiError::InvalidClass => sys::JVMTI_ERROR_INVALID_CLASS,
178 JvmtiError::ClassNotPrepared => sys::JVMTI_ERROR_CLASS_NOT_PREPARED,
179 JvmtiError::InvalidMethodId => sys::JVMTI_ERROR_INVALID_METHODID,
180 JvmtiError::InvalidLocation => sys::JVMTI_ERROR_INVALID_LOCATION,
181 JvmtiError::InvalidFieldId => sys::JVMTI_ERROR_INVALID_FIELDID,
182 JvmtiError::NoMoreFrames => sys::JVMTI_ERROR_NO_MORE_FRAMES,
183 JvmtiError::OpaqueFrame => sys::JVMTI_ERROR_OPAQUE_FRAME,
184 JvmtiError::TypeMismatch => sys::JVMTI_ERROR_TYPE_MISMATCH,
185 JvmtiError::InvalidSlot => sys::JVMTI_ERROR_INVALID_SLOT,
186 JvmtiError::Duplicate => sys::JVMTI_ERROR_DUPLICATE,
187 JvmtiError::NotFound => sys::JVMTI_ERROR_NOT_FOUND,
188 JvmtiError::InvalidMonitor => sys::JVMTI_ERROR_INVALID_MONITOR,
189 JvmtiError::NotMonitorOwner => sys::JVMTI_ERROR_NOT_MONITOR_OWNER,
190 JvmtiError::Interrupt => sys::JVMTI_ERROR_INTERRUPT,
191 JvmtiError::InvalidClassFormat => sys::JVMTI_ERROR_INVALID_CLASS_FORMAT,
192 JvmtiError::CircularClassDefinition => sys::JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION,
193 JvmtiError::FailsVerification => sys::JVMTI_ERROR_FAILS_VERIFICATION,
194 JvmtiError::UnsupportedRedefinitionMethodAdded => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED,
195 JvmtiError::UnsupportedRedefinitionSchemaChanged => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED,
196 JvmtiError::InvalidTypeState => sys::JVMTI_ERROR_INVALID_TYPESTATE,
197 JvmtiError::UnsupportedRedefinitionHierarchyChanged => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED,
198 JvmtiError::UnsupportedRedefinitionMethodDeleted => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED,
199 JvmtiError::UnsupportedVersion => sys::JVMTI_ERROR_UNSUPPORTED_VERSION,
200 JvmtiError::NamesDontMatch => sys::JVMTI_ERROR_NAMES_DONT_MATCH,
201 JvmtiError::UnsupportedRedefinitionClassModifiersChanged => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED,
202 JvmtiError::UnsupportedRedefinitionMethodModifiersChanged => sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED,
203 JvmtiError::UnmodifiableClass => sys::JVMTI_ERROR_UNMODIFIABLE_CLASS,
204 JvmtiError::NotAvaliable => sys::JVMTI_ERROR_NOT_AVAILABLE,
205 JvmtiError::MustPosessCapability => sys::JVMTI_ERROR_MUST_POSSESS_CAPABILITY,
206 JvmtiError::NullPointer => sys::JVMTI_ERROR_NULL_POINTER,
207 JvmtiError::AbsentInformation => sys::JVMTI_ERROR_ABSENT_INFORMATION,
208 JvmtiError::InvalidEventType => sys::JVMTI_ERROR_INVALID_EVENT_TYPE,
209 JvmtiError::IllegalArgument => sys::JVMTI_ERROR_ILLEGAL_ARGUMENT,
210 JvmtiError::NativeMethod => sys::JVMTI_ERROR_NATIVE_METHOD,
211 JvmtiError::ClassLoaderUnsupported => sys::JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED,
212 JvmtiError::OutOfMemory => sys::JVMTI_ERROR_OUT_OF_MEMORY,
213 JvmtiError::AccessDenied => sys::JVMTI_ERROR_ACCESS_DENIED,
214 JvmtiError::WrongPhase => sys::JVMTI_ERROR_WRONG_PHASE,
215 JvmtiError::Internal => sys::JVMTI_ERROR_INTERNAL,
216 JvmtiError::UnattachedThread => sys::JVMTI_ERROR_UNATTACHED_THREAD,
217 JvmtiError::InvalidEnvironment => sys::JVMTI_ERROR_INVALID_ENVIRONMENT,
218 JvmtiError::EmptyArgument => sys::JVMTI_CONSTANT_UNSUPPORTED,
219 JvmtiError::UnsupportedError(error) => error
220 }
221 }
222}