jvmti_rs/wrapper/objects/
jvmti_string.rs

1use 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}