This commit is contained in:
Folkert 2020-11-04 23:04:52 +01:00
parent 4c5a5dc6a2
commit cb28e533b8
6 changed files with 234 additions and 50 deletions

View file

@ -6,16 +6,45 @@ use std::time::SystemTime;
use RocCallResult::*;
extern "C" {
#[link_name = "closure_1_exposed"]
#[link_name = "makeClosure_1_exposed"]
fn make_closure(output: *mut u8) -> ();
// #[link_name = "0_1_caller"]
// fn call_closure_0(unit: (), closure_data: *const u8, output: *mut u8) -> ();
#[link_name = "makeClosure_1_MyClosure_caller"]
fn call_MyClosure(
unit: (),
function_pointer: *const u8,
closure_data: *const u8,
output: *mut u8,
) -> ();
#[link_name = "closure_1_size"]
#[link_name = "makeClosure_1_size"]
fn closure_size() -> i64;
}
unsafe fn call_the_closure(function_pointer: *const u8, closure_data_ptr: *const u8) -> i64 {
// wow
let layout = Layout::array::<u8>(100).unwrap();
// let buffer = std::alloc::alloc(layout);
let mut foo = (0, 0);
let buffer: *mut (i64, i64) = &mut foo;
call_MyClosure(
(),
function_pointer,
closure_data_ptr as *const u8,
buffer as *mut u8,
);
dbg!(*buffer);
let output = &*(buffer as *mut RocCallResult<i64>);
match output.into() {
Ok(v) => v,
Err(e) => panic!("failed with {}", e),
}
}
#[no_mangle]
pub fn rust_main() -> isize {
println!("Running Roc closure");
@ -23,19 +52,19 @@ pub fn rust_main() -> isize {
let size = unsafe { closure_size() } as usize;
let layout = Layout::array::<u8>(size).unwrap();
let roc_closure = unsafe {
let answer = unsafe {
let buffer = std::alloc::alloc(layout);
make_closure(buffer);
type CLOSURE_DATA = i64;
let output = &*(buffer as *mut RocCallResult<(fn(CLOSURE_DATA) -> i64, CLOSURE_DATA)>);
let output = &*(buffer as *mut RocCallResult<(*const u8, ())>);
match output.into() {
Ok((function_pointer, closure_data)) => {
std::alloc::dealloc(buffer, layout);
Ok((function_pointer, _)) => {
let closure_data_ptr = buffer.offset(16);
dbg!(*closure_data_ptr);
move || function_pointer(closure_data)
call_the_closure(function_pointer as *const u8, closure_data_ptr as *const u8)
}
Err(msg) => {
std::alloc::dealloc(buffer, layout);
@ -44,7 +73,6 @@ pub fn rust_main() -> isize {
}
}
};
let answer = roc_closure();
let end_time = SystemTime::now();
let duration = end_time.duration_since(start_time).unwrap();