jvmti_rs/wrapper/objects/
jvmti_string.rs1use std::os::raw::c_char;
2use crate::*;
3use std::str;
4use std::borrow::Cow;
5use crate::sys::jmemory;
6use crate::objects::JDeallocate;
7
8pub struct JvmtiString<'a> {
9 ptr: *mut c_char,
10 env: &'a JVMTIEnv<'a>,
11}
12
13impl<'a> JvmtiString<'a> {
14 pub fn with_pointer<'b: 'a>(ptr: *mut c_char, env: &'b JVMTIEnv<'a>) -> JvmtiString<'a> {
15 JvmtiString {
16 ptr,
17 env,
18 }
19 }
20
21 pub fn as_ptr(&mut self) -> *mut c_char {
22 self.ptr
23 }
24
25 pub fn deallocate(&self) {
26 if !self.ptr.is_null() {
27 self.env.deallocate(self).unwrap()
28 }
29 }
30}
31
32
33impl<'a> From<&JvmtiString<'a>> for Cow<'a, str> {
34 fn from(other: &JvmtiString) -> Cow<'a, str> {
35 if other.ptr.is_null() {
36 return "".into();
37 }
38 to_modified_utf8(other.ptr as *const c_char)
39 }
40}
41
42impl<'a> From<&JvmtiString<'a>> for String {
43 fn from(other: &JvmtiString) -> String {
44 let cow: Cow<str> = other.into();
45 cow.into()
46 }
47}
48
49impl<'a> From<JvmtiString<'a>> for Cow<'a, str> {
50 fn from(other: JvmtiString) -> Cow<'a, str> {
51 if other.ptr.is_null() {
52 return "".into();
53 }
54 to_modified_utf8(other.ptr as *const c_char)
55 }
56}
57
58impl<'a> From<JvmtiString<'a>> for String {
59 fn from(other: JvmtiString) -> String {
60 let cow: Cow<str> = other.into();
61 cow.into()
62 }
63}
64
65impl<'a> Drop for JvmtiString<'a> {
66 fn drop(&mut self) {
67 self.deallocate()
68 }
69}
70
71impl<'a> JDeallocate<'a> for JvmtiString<'a> {
72 fn as_deallocate_ptr(&self) -> jmemory {
73 self.ptr as jmemory
74 }
75}