Skip to content

Commit d3191f4

Browse files
committed
runtime: implement some JVMTI stubs
1 parent b70ba27 commit d3191f4

File tree

14 files changed

+902
-258
lines changed

14 files changed

+902
-258
lines changed

jvmti/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition.workspace = true
77
license.workspace = true
88

99
[dependencies]
10+
jni.workspace = true
1011
jvmti_sys.workspace = true
1112

1213
[lints]

jvmti/src/error.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,77 @@ impl JvmtiError {
133133
_ => None,
134134
}
135135
}
136+
137+
pub fn raw(&self) -> jvmtiError {
138+
match self {
139+
JvmtiError::InvalidThread => crate::sys::JVMTI_ERROR_INVALID_THREAD,
140+
JvmtiError::InvalidThreadGroup => crate::sys::JVMTI_ERROR_INVALID_THREAD_GROUP,
141+
JvmtiError::InvalidPriority => crate::sys::JVMTI_ERROR_INVALID_PRIORITY,
142+
JvmtiError::ThreadNotSuspended => crate::sys::JVMTI_ERROR_THREAD_NOT_SUSPENDED,
143+
JvmtiError::ThreadSuspended => crate::sys::JVMTI_ERROR_THREAD_SUSPENDED,
144+
JvmtiError::ThreadNotAlive => crate::sys::JVMTI_ERROR_THREAD_NOT_ALIVE,
145+
JvmtiError::InvalidObject => crate::sys::JVMTI_ERROR_INVALID_OBJECT,
146+
JvmtiError::InvalidClass => crate::sys::JVMTI_ERROR_INVALID_CLASS,
147+
JvmtiError::ClassNotPrepared => crate::sys::JVMTI_ERROR_CLASS_NOT_PREPARED,
148+
JvmtiError::InvalidMethodId => crate::sys::JVMTI_ERROR_INVALID_METHODID,
149+
JvmtiError::InvalidLocation => crate::sys::JVMTI_ERROR_INVALID_LOCATION,
150+
JvmtiError::InvalidFieldId => crate::sys::JVMTI_ERROR_INVALID_FIELDID,
151+
JvmtiError::InvalidModule => crate::sys::JVMTI_ERROR_INVALID_MODULE,
152+
JvmtiError::NoMoreFrames => crate::sys::JVMTI_ERROR_NO_MORE_FRAMES,
153+
JvmtiError::OpaqueFrame => crate::sys::JVMTI_ERROR_OPAQUE_FRAME,
154+
JvmtiError::TypeMismatch => crate::sys::JVMTI_ERROR_TYPE_MISMATCH,
155+
JvmtiError::InvalidSlot => crate::sys::JVMTI_ERROR_INVALID_SLOT,
156+
JvmtiError::Duplicate => crate::sys::JVMTI_ERROR_DUPLICATE,
157+
JvmtiError::NotFound => crate::sys::JVMTI_ERROR_NOT_FOUND,
158+
JvmtiError::InvalidMonitor => crate::sys::JVMTI_ERROR_INVALID_MONITOR,
159+
JvmtiError::NotMonitorOwner => crate::sys::JVMTI_ERROR_NOT_MONITOR_OWNER,
160+
JvmtiError::Interrupt => crate::sys::JVMTI_ERROR_INTERRUPT,
161+
JvmtiError::InvalidClassFormat => crate::sys::JVMTI_ERROR_INVALID_CLASS_FORMAT,
162+
JvmtiError::CircularClassDefinition => {
163+
crate::sys::JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION
164+
},
165+
JvmtiError::FailsVerification => crate::sys::JVMTI_ERROR_FAILS_VERIFICATION,
166+
JvmtiError::UnsupportedRedefinitionMethodAdded => {
167+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED
168+
},
169+
JvmtiError::UnsupportedRedefinitionSchemaChanged => {
170+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED
171+
},
172+
JvmtiError::InvalidTypestate => crate::sys::JVMTI_ERROR_INVALID_TYPESTATE,
173+
JvmtiError::UnsupportedRedefinitionHierarchyChanged => {
174+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED
175+
},
176+
JvmtiError::UnsupportedRedefinitionMethodDeleted => {
177+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED
178+
},
179+
JvmtiError::UnsupportedVersion => crate::sys::JVMTI_ERROR_UNSUPPORTED_VERSION,
180+
JvmtiError::NamesDontMatch => crate::sys::JVMTI_ERROR_NAMES_DONT_MATCH,
181+
JvmtiError::UnsupportedRedefinitionClassModifiersChanged => {
182+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED
183+
},
184+
JvmtiError::UnsupportedRedefinitionMethodModifiersChanged => {
185+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED
186+
},
187+
JvmtiError::UnsupportedRedefinitionClassAttributeChanged => {
188+
crate::sys::JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED
189+
},
190+
JvmtiError::UnsupportedOperation => crate::sys::JVMTI_ERROR_UNSUPPORTED_OPERATION,
191+
JvmtiError::UnmodifiableClass => crate::sys::JVMTI_ERROR_UNMODIFIABLE_CLASS,
192+
JvmtiError::UnmodifiableModule => crate::sys::JVMTI_ERROR_UNMODIFIABLE_MODULE,
193+
JvmtiError::NotAvailable => crate::sys::JVMTI_ERROR_NOT_AVAILABLE,
194+
JvmtiError::MustPossessCapability => crate::sys::JVMTI_ERROR_MUST_POSSESS_CAPABILITY,
195+
JvmtiError::NullPointer => crate::sys::JVMTI_ERROR_NULL_POINTER,
196+
JvmtiError::AbsentInformation => crate::sys::JVMTI_ERROR_ABSENT_INFORMATION,
197+
JvmtiError::InvalidEventType => crate::sys::JVMTI_ERROR_INVALID_EVENT_TYPE,
198+
JvmtiError::IllegalArgument => crate::sys::JVMTI_ERROR_ILLEGAL_ARGUMENT,
199+
JvmtiError::NativeMethod => crate::sys::JVMTI_ERROR_NATIVE_METHOD,
200+
JvmtiError::ClassLoaderUnsupported => crate::sys::JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED,
201+
JvmtiError::OutOfMemory => crate::sys::JVMTI_ERROR_OUT_OF_MEMORY,
202+
JvmtiError::AccessDenied => crate::sys::JVMTI_ERROR_ACCESS_DENIED,
203+
JvmtiError::WrongPhase => crate::sys::JVMTI_ERROR_WRONG_PHASE,
204+
JvmtiError::Internal => crate::sys::JVMTI_ERROR_INTERNAL,
205+
JvmtiError::UnattachedThread => crate::sys::JVMTI_ERROR_UNATTACHED_THREAD,
206+
JvmtiError::InvalidEnvironment => crate::sys::JVMTI_ERROR_INVALID_ENVIRONMENT,
207+
}
208+
}
136209
}

jvmti/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod env;
22
pub mod error;
3+
pub mod objects;
34

45
/// `jvmti_sys` re-exports
56
pub mod sys {

jvmti/src/objects.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use jni::objects::JObject;
2+
3+
macro_rules! define_object_types {
4+
(
5+
$(
6+
$(#[$meta:meta])*
7+
struct $name:ident($ty:path)
8+
);+
9+
$(;)?
10+
) => {
11+
$(
12+
$(#[$meta])*
13+
#[repr(transparent)]
14+
#[derive(Copy, Clone, PartialEq, Eq)]
15+
pub struct $name($ty);
16+
17+
impl $name {
18+
#[doc = "Create a "]
19+
#[doc = stringify!($name)]
20+
#[doc = " from a raw pointer"]
21+
///
22+
/// # Safety
23+
///
24+
/// The caller *must* ensure that the pointer provided was obtained from the VM.
25+
pub unsafe fn from_raw(raw: $ty) -> Self {
26+
Self(raw)
27+
}
28+
29+
pub fn null() -> Self {
30+
Self(core::ptr::null_mut())
31+
}
32+
33+
pub fn raw(&self) -> $ty {
34+
self.0
35+
}
36+
37+
pub fn is_null(&self) -> bool {
38+
self.raw().is_null()
39+
}
40+
}
41+
42+
impl From<$name> for JObject {
43+
fn from(value: $name) -> Self {
44+
unsafe { JObject::from_raw(value.0) }
45+
}
46+
}
47+
)+
48+
};
49+
}
50+
51+
define_object_types! {
52+
struct JThread(crate::sys::jthread);
53+
struct JThreadGroup(crate::sys::jthreadGroup);
54+
}
55+
56+
#[repr(transparent)]
57+
#[derive(Copy, Clone, PartialEq, Eq)]
58+
pub struct JRawMonitorId(crate::sys::jrawMonitorID);
59+
60+
impl JRawMonitorId {
61+
/// Create a JRawMonitorId from a raw pointer
62+
///
63+
/// # Safety
64+
///
65+
/// The caller *must* ensure that the pointer provided was obtained from the VM.
66+
pub unsafe fn from_raw(raw: crate::sys::jrawMonitorID) -> Self {
67+
Self(raw)
68+
}
69+
70+
pub fn null() -> Self {
71+
Self(core::ptr::null_mut())
72+
}
73+
74+
pub fn raw(&self) -> crate::sys::jrawMonitorID {
75+
self.0
76+
}
77+
78+
pub fn is_null(&self) -> bool {
79+
self.raw().is_null()
80+
}
81+
}

jvmti/sys/src/version.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
pub(crate) const fn jvmti_version() -> std::ffi::c_int { 0x30000000 + (27 * 0x10000) }
1+
pub(crate) const fn jvmti_version() -> std::ffi::c_int {
2+
0x30000000 + (27 * 0x10000)
3+
}

0 commit comments

Comments
 (0)