use cranelift::prelude::*;
use cranelift_jit::{JITBuilder, JITModule};
use cranelift_module::{FuncId, Linkage, Module};
use std::collections::HashMap;
use super::super::ffi::arc;
use super::super::ffi::object::closure as closure_ffi;
use super::super::ffi::string as string_ffi;
pub fn register_arc_symbols(builder: &mut JITBuilder) {
builder.symbol("jit_arc_retain", arc::jit_arc_retain as *const u8);
builder.symbol("jit_arc_release", arc::jit_arc_release as *const u8);
builder.symbol(
"jit_arc_string_retain",
string_ffi::jit_arc_string_retain as *const u8,
);
builder.symbol(
"jit_arc_string_release",
string_ffi::jit_arc_string_release as *const u8,
);
builder.symbol(
"jit_arc_closure_retain",
closure_ffi::jit_arc_closure_retain as *const u8,
);
builder.symbol(
"jit_arc_closure_release",
closure_ffi::jit_arc_closure_release as *const u8,
);
}
pub fn declare_arc_functions(module: &mut JITModule, ffi_funcs: &mut HashMap<String, FuncId>) {
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) = module.declare_function("jit_arc_retain", Linkage::Import, &sig) {
ffi_funcs.insert("jit_arc_retain".to_string(), func_id);
}
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) = module.declare_function("jit_arc_release", Linkage::Import, &sig) {
ffi_funcs.insert("jit_arc_release".to_string(), func_id);
}
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) =
module.declare_function("jit_arc_string_retain", Linkage::Import, &sig)
{
ffi_funcs.insert("jit_arc_string_retain".to_string(), func_id);
}
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) =
module.declare_function("jit_arc_string_release", Linkage::Import, &sig)
{
ffi_funcs.insert("jit_arc_string_release".to_string(), func_id);
}
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) =
module.declare_function("jit_arc_closure_retain", Linkage::Import, &sig)
{
ffi_funcs.insert("jit_arc_closure_retain".to_string(), func_id);
}
}
{
let mut sig = module.make_signature();
sig.params.push(AbiParam::new(types::I64));
if let Ok(func_id) =
module.declare_function("jit_arc_closure_release", Linkage::Import, &sig)
{
ffi_funcs.insert("jit_arc_closure_release".to_string(), func_id);
}
}
}