mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 21:39:07 +00:00
WIP
This commit is contained in:
parent
1c1112ec35
commit
98ba49baf6
6 changed files with 48 additions and 23 deletions
|
@ -4591,9 +4591,6 @@ pub fn build_procedures<'a, 'ctx, 'env>(
|
||||||
let niche = Niche::NONE;
|
let niche = Niche::NONE;
|
||||||
|
|
||||||
for (symbol, top_level) in glue_layouts.getters.iter().copied() {
|
for (symbol, top_level) in glue_layouts.getters.iter().copied() {
|
||||||
dbg!(symbol, unsafe {
|
|
||||||
std::mem::transmute::<Symbol, u64>(symbol)
|
|
||||||
});
|
|
||||||
let it = top_level.arguments.iter().copied();
|
let it = top_level.arguments.iter().copied();
|
||||||
let bytes = roc_alias_analysis::func_name_bytes_help(symbol, it, niche, &top_level.result);
|
let bytes = roc_alias_analysis::func_name_bytes_help(symbol, it, niche, &top_level.result);
|
||||||
let func_name = FuncName(&bytes);
|
let func_name = FuncName(&bytes);
|
||||||
|
@ -4613,6 +4610,8 @@ pub fn build_procedures<'a, 'ctx, 'env>(
|
||||||
let name = getter_fn.get_name().to_str().unwrap();
|
let name = getter_fn.get_name().to_str().unwrap();
|
||||||
let getter_name = symbol.as_str(&env.interns);
|
let getter_name = symbol.as_str(&env.interns);
|
||||||
|
|
||||||
|
dbg!(&getter_name);
|
||||||
|
|
||||||
// Add the getter function to the module.
|
// Add the getter function to the module.
|
||||||
let _ = expose_function_to_host_help_c_abi(
|
let _ = expose_function_to_host_help_c_abi(
|
||||||
env,
|
env,
|
||||||
|
|
|
@ -974,7 +974,7 @@ fn add_type_help<'a>(
|
||||||
add_type_help(env, ret_layout, *ret_var, None, types)
|
add_type_help(env, ret_layout, *ret_var, None, types)
|
||||||
};
|
};
|
||||||
|
|
||||||
let name = format!("TODO_roc_function_{:?}", closure_var);
|
let name = format!("RocFunction_{:?}", closure_var);
|
||||||
let fn_type_id = types.add_named(
|
let fn_type_id = types.add_named(
|
||||||
&env.layout_cache.interner,
|
&env.layout_cache.interner,
|
||||||
name.clone(),
|
name.clone(),
|
||||||
|
|
|
@ -7,5 +7,9 @@ platform "echo-in-rust"
|
||||||
|
|
||||||
Op : [StdoutWrite Str ({} -> Op), StderrWrite Str ({} -> Op), Done]
|
Op : [StdoutWrite Str ({} -> Op), StderrWrite Str ({} -> Op), Done]
|
||||||
|
|
||||||
|
|
||||||
|
# mainForHost : { bar: Str, foo: I64 -> I64 }
|
||||||
|
# mainForHost = { bar: main, foo: \x -> x }
|
||||||
|
|
||||||
mainForHost : Op
|
mainForHost : Op
|
||||||
mainForHost = main
|
mainForHost = main
|
||||||
|
|
|
@ -97,6 +97,21 @@ union union_Op {
|
||||||
_sizer: [u8; 8],
|
_sizer: [u8; 8],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct RocFunction_3 {
|
||||||
|
closure_data: T
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RocFunction_3 {
|
||||||
|
pub fn call(self) -> U {
|
||||||
|
extern "C" {
|
||||||
|
fn call_the_closure(T) -> U ;
|
||||||
|
}
|
||||||
|
|
||||||
|
call_the_closure(self.closure_data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Op {
|
impl Op {
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
target_arch = "arm",
|
target_arch = "arm",
|
||||||
|
|
|
@ -93,7 +93,7 @@ pub extern "C" fn rust_main() -> i32 {
|
||||||
|
|
||||||
println!("Let's do things!");
|
println!("Let's do things!");
|
||||||
|
|
||||||
let op: Op = unsafe {
|
let mut op: Op = unsafe {
|
||||||
let mut mem = MaybeUninit::uninit();
|
let mut mem = MaybeUninit::uninit();
|
||||||
|
|
||||||
roc_main(mem.as_mut_ptr());
|
roc_main(mem.as_mut_ptr());
|
||||||
|
@ -101,26 +101,33 @@ pub extern "C" fn rust_main() -> i32 {
|
||||||
mem.assume_init()
|
mem.assume_init()
|
||||||
};
|
};
|
||||||
|
|
||||||
match dbg!(op.discriminant()) {
|
loop {
|
||||||
StdoutWrite => {
|
match dbg!(op.discriminant()) {
|
||||||
let output: RocStr = unsafe { op.get_StdoutWrite_0() };
|
StdoutWrite => {
|
||||||
// let _next = unsafe { op.get_StdoutWrite_1() };
|
let output: RocStr = unsafe { op.get_StdoutWrite_0() };
|
||||||
|
op = unsafe { op.get_StdoutWrite_1() };
|
||||||
|
|
||||||
dbg!(&output);
|
dbg!(&output);
|
||||||
|
|
||||||
if let Err(e) = std::io::stdout().write_all(output.as_bytes()) {
|
if let Err(e) = std::io::stdout().write_all(output.as_bytes()) {
|
||||||
panic!("Writing to stdout failed! {:?}", e);
|
panic!("Writing to stdout failed! {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StderrWrite => {
|
||||||
|
let output: RocStr = unsafe { op.get_StderrWrite_0() };
|
||||||
|
// let _next = unsafe { op.get_StderrWrite_1() };
|
||||||
|
dbg!(&output);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
if let Err(e) = std::io::stderr().write_all(output.as_bytes()) {
|
||||||
|
panic!("Writing to stderr failed! {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Done => {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StderrWrite => {
|
|
||||||
let output: RocStr = unsafe { op.get_StderrWrite_0() };
|
|
||||||
// let _next = unsafe { op.get_StderrWrite_1() };
|
|
||||||
|
|
||||||
if let Err(e) = std::io::stderr().write_all(output.as_bytes()) {
|
|
||||||
panic!("Writing to stderr failed! {:?}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Done => {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("Done!");
|
println!("Done!");
|
||||||
|
|
|
@ -5,5 +5,5 @@ platform "echo-in-zig"
|
||||||
imports []
|
imports []
|
||||||
provides [mainForHost]
|
provides [mainForHost]
|
||||||
|
|
||||||
mainForHost : Str
|
mainForHost : { bar: Str, foo: I64 -> I64 }
|
||||||
mainForHost = main
|
mainForHost = { bar: main, foo: \x -> x }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue