use crate::{ErrorHandle, RuntimeHandle, HUB};
use failure::err_msg;
use runtime::Runtime;
pub use memory::gc::GcPtr;
pub use runtime::UnsafeTypeInfo;
#[no_mangle]
pub unsafe extern "C" fn mun_gc_alloc(
handle: RuntimeHandle,
type_info: UnsafeTypeInfo,
obj: *mut GcPtr,
) -> ErrorHandle {
let runtime = match (handle.0 as *mut Runtime).as_ref() {
Some(runtime) => runtime,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'runtime' is null pointer."))
}
};
let obj = match obj.as_mut() {
Some(obj) => obj,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'obj' is null pointer."))
}
};
*obj = runtime.gc().alloc(type_info);
ErrorHandle::default()
}
#[no_mangle]
pub unsafe extern "C" fn mun_gc_ptr_type(
handle: RuntimeHandle,
obj: GcPtr,
type_info: *mut UnsafeTypeInfo,
) -> ErrorHandle {
let runtime = match (handle.0 as *mut Runtime).as_ref() {
Some(runtime) => runtime,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'runtime' is null pointer."))
}
};
let type_info = match type_info.as_mut() {
Some(type_info) => type_info,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'type_info' is null pointer."))
}
};
*type_info = runtime.gc().ptr_type(obj);
ErrorHandle::default()
}
#[no_mangle]
pub unsafe extern "C" fn mun_gc_root(handle: RuntimeHandle, obj: GcPtr) -> ErrorHandle {
let runtime = match (handle.0 as *mut Runtime).as_ref() {
Some(runtime) => runtime,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'runtime' is null pointer."))
}
};
runtime.gc().root(obj);
ErrorHandle::default()
}
#[no_mangle]
pub unsafe extern "C" fn mun_gc_unroot(handle: RuntimeHandle, obj: GcPtr) -> ErrorHandle {
let runtime = match (handle.0 as *mut Runtime).as_ref() {
Some(runtime) => runtime,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'runtime' is null pointer."))
}
};
runtime.gc().unroot(obj);
ErrorHandle::default()
}
#[no_mangle]
pub unsafe extern "C" fn mun_gc_collect(
handle: RuntimeHandle,
reclaimed: *mut bool,
) -> ErrorHandle {
let runtime = match (handle.0 as *mut Runtime).as_ref() {
Some(runtime) => runtime,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'runtime' is null pointer."))
}
};
let reclaimed = match reclaimed.as_mut() {
Some(reclaimed) => reclaimed,
None => {
return HUB
.errors
.register(err_msg("Invalid argument: 'reclaimed' is null pointer."))
}
};
*reclaimed = runtime.gc_collect();
ErrorHandle::default()
}