update hosts with new string conventions

This commit is contained in:
Folkert 2022-03-13 00:16:21 +01:00
parent ec403958a3
commit ba40b6a957
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
4 changed files with 27 additions and 18 deletions

View file

@ -13,7 +13,7 @@ use std::os::raw::c_char;
extern "C" {
#[link_name = "roc__mainForHost_1_exposed_generic"]
fn roc_main(args: RocStr, output: *mut u8) -> ();
fn roc_main(output: *mut u8, args: &RocStr);
#[link_name = "roc__mainForHost_size"]
fn roc_main_size() -> i64;
@ -74,7 +74,7 @@ pub unsafe extern "C" fn roc_memset(dst: *mut c_void, c: i32, n: usize) -> *mut
#[no_mangle]
pub extern "C" fn rust_main() -> i32 {
let arg = env::args().skip(1).next().unwrap();
let arg = env::args().nth(1).unwrap();
let arg = RocStr::from(arg.as_str());
let size = unsafe { roc_main_size() } as usize;
@ -84,7 +84,11 @@ pub extern "C" fn rust_main() -> i32 {
// TODO allocate on the stack if it's under a certain size
let buffer = std::alloc::alloc(layout);
roc_main(arg, buffer);
roc_main(buffer, &arg);
// arg has been passed to roc now, and it assumes ownership.
// so we must not touch its refcount now
std::mem::forget(arg);
let result = call_the_closure(buffer);
@ -141,14 +145,14 @@ pub extern "C" fn roc_fx_getChar() -> u8 {
}
#[no_mangle]
pub extern "C" fn roc_fx_putLine(line: ManuallyDrop<RocStr>) {
pub extern "C" fn roc_fx_putLine(line: &RocStr) {
let string = line.as_str();
println!("{}", string);
std::io::stdout().lock().flush();
}
#[no_mangle]
pub extern "C" fn roc_fx_putRaw(line: ManuallyDrop<RocStr>) {
pub extern "C" fn roc_fx_putRaw(line: &RocStr) {
let string = line.as_str();
print!("{}", string);
std::io::stdout().lock().flush();
@ -185,8 +189,9 @@ pub extern "C" fn roc_fx_closeFile(br_ptr: *mut BufReader<File>) {
}
#[no_mangle]
pub extern "C" fn roc_fx_openFile(name: ManuallyDrop<RocStr>) -> *mut BufReader<File> {
match File::open(name.as_str()) {
pub extern "C" fn roc_fx_openFile(name: &RocStr) -> *mut BufReader<File> {
let string = name.as_str();
match File::open(string) {
Ok(f) => {
let br = BufReader::new(f);
@ -199,7 +204,7 @@ pub extern "C" fn roc_fx_openFile(name: ManuallyDrop<RocStr>) -> *mut BufReader<
}
#[no_mangle]
pub extern "C" fn roc_fx_withFileOpen(name: ManuallyDrop<RocStr>, buffer: *const u8) {
pub extern "C" fn roc_fx_withFileOpen(name: &RocStr, buffer: *const u8) {
// TODO: figure out accepting a closure in an fx and passing data to it.
// let f = File::open(name.as_str()).expect("Unable to open file");
// let mut br = BufReader::new(f);