fix import of top-level thunks

This commit is contained in:
Folkert 2020-12-12 17:56:43 +01:00
parent 3d827f40f4
commit 05a6b30644
4 changed files with 11 additions and 4 deletions

View file

@ -4758,6 +4758,8 @@ fn reuse_function_symbol<'a>(
.from_var(env.arena, arg_var, env.subs) .from_var(env.arena, arg_var, env.subs)
.expect("creating layout does not fail"); .expect("creating layout does not fail");
add_needed_external(procs, env, arg_var, original);
procs.insert_passed_by_name( procs.insert_passed_by_name(
env, env,
arg_var, arg_var,
@ -4765,6 +4767,11 @@ fn reuse_function_symbol<'a>(
layout.clone(), layout.clone(),
layout_cache, layout_cache,
); );
// an imported symbol is always a function pointer:
// either it's a function, or a top-level 0-argument thunk
let expr = Expr::FunctionPointer(original, layout.clone());
return Stmt::Let(original, expr, layout, env.arena.alloc(result));
} }
_ => { _ => {
// danger: a foreign symbol may not be specialized! // danger: a foreign symbol may not be specialized!

View file

@ -5,4 +5,4 @@ app "effect-example"
main : Task.Task {} F64 main : Task.Task {} F64
main = main =
Task.after (Task.getLine {}) \lineThisThing -> Task.putLine lineThisThing Task.after Task.getLine \lineThisThing -> Task.putLine lineThisThing

View file

@ -8,7 +8,7 @@ platform folkertdev/foo
{ {
putChar : I64 -> Effect {}, putChar : I64 -> Effect {},
putLine : Str -> Effect {}, putLine : Str -> Effect {},
getLine : {} -> Effect Str getLine : Effect Str
} }

View file

@ -10,8 +10,8 @@ always = \x -> Effect.always (Ok x)
fail : err -> Task * err fail : err -> Task * err
fail = \x -> Effect.always (Err x) fail = \x -> Effect.always (Err x)
getLine : {} -> Task Str * getLine : Task Str *
getLine = \{} -> Effect.after (Effect.getLine {}) always getLine = Effect.after Effect.getLine always
putLine : Str -> Task {} * putLine : Str -> Task {} *
putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {}) putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {})