1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use std::ffi::{CStr, CString};
use std::ptr;
use std::slice;
use binding::global::RubySpecialConsts;
use types::{c_char, c_int, c_void, Argc, InternalValue, Value};
use {AnyObject, Object};
pub unsafe fn cstr_to_string(str: *const c_char) -> String {
CStr::from_ptr(str).to_string_lossy().into_owned()
}
pub unsafe fn cstr_to_str<'a>(str: *const c_char) -> &'a str {
CStr::from_ptr(str).to_str().unwrap()
}
pub fn str_to_cstring(str: &str) -> CString {
CString::new(str).unwrap()
}
pub fn bool_to_value(state: bool) -> Value {
let internal_value = if state {
RubySpecialConsts::True
} else {
RubySpecialConsts::False
};
Value::from(internal_value as InternalValue)
}
#[inline]
pub fn c_int_to_bool(int: c_int) -> bool {
int != 0
}
#[inline]
pub fn bool_to_c_int(state: bool) -> c_int {
state as c_int
}
pub fn arguments_to_values(arguments: Option<&[AnyObject]>) -> Option<Vec<Value>> {
arguments.map(|arguments| arguments.iter().map(Object::value).collect())
}
pub fn process_arguments(arguments: &Option<Vec<Value>>) -> (Argc, *const Value) {
match *arguments {
Some(ref arguments) => (arguments.len() as Argc, arguments.as_ptr()),
None => (0, ptr::null()),
}
}
pub fn parse_arguments(argc: Argc, arguments: *const AnyObject) -> Vec<AnyObject> {
unsafe { slice::from_raw_parts(arguments, argc as usize).to_vec() }
}
pub fn closure_to_ptr<F, R>(func: F) -> *const c_void
where
F: FnOnce() -> R,
{
let wrap_return = || {
let r = func();
Box::into_raw(Box::new(r)) as *const c_void
};
let fnbox = Box::new(wrap_return) as Box<FnOnce() -> *const c_void>;
Box::into_raw(Box::new(fnbox)) as *const c_void
}
pub unsafe fn ptr_to_data<R>(ptr: *mut c_void) -> R {
*Box::from_raw(ptr as *mut R)
}