mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
so close
This commit is contained in:
parent
4c5a5dc6a2
commit
cb28e533b8
6 changed files with 234 additions and 50 deletions
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue