use toplevel more

This commit is contained in:
Folkert 2021-06-18 21:05:31 +02:00
parent 88f4b6bc9b
commit d894a06290
2 changed files with 39 additions and 21 deletions

View file

@ -602,7 +602,9 @@ fn promote_to_main_function<'a, 'ctx, 'env>(
"we expect only one specialization of this symbol" "we expect only one specialization of this symbol"
); );
let roc_main_fn = function_value_by_func_spec(env, *func_spec, symbol, Layout::Struct(&[])); // NOTE fake layout; it is only used for debug prints
let roc_main_fn =
function_value_by_func_spec(env, *func_spec, symbol, &[], &Layout::Struct(&[]));
let main_fn_name = "$Test.main"; let main_fn_name = "$Test.main";
@ -800,8 +802,9 @@ pub fn build_exp_call<'a, 'ctx, 'env>(
match call_type { match call_type {
CallType::ByName { CallType::ByName {
name, name,
full_layout,
specialization_id, specialization_id,
arg_layouts,
ret_layout,
.. ..
} => { } => {
let mut arg_tuples: Vec<BasicValueEnum> = let mut arg_tuples: Vec<BasicValueEnum> =
@ -817,7 +820,8 @@ pub fn build_exp_call<'a, 'ctx, 'env>(
roc_call_with_args( roc_call_with_args(
env, env,
&full_layout, arg_layouts,
ret_layout,
*name, *name,
func_spec, func_spec,
arg_tuples.into_bump_slice(), arg_tuples.into_bump_slice(),
@ -2050,7 +2054,8 @@ pub fn build_exp_stmt<'a, 'ctx, 'env>(
} => match call.call_type { } => match call.call_type {
CallType::ByName { CallType::ByName {
name, name,
ref full_layout, arg_layouts,
ref ret_layout,
specialization_id, specialization_id,
.. ..
} => { } => {
@ -2059,7 +2064,7 @@ pub fn build_exp_stmt<'a, 'ctx, 'env>(
let func_spec = func_spec_solutions.callee_spec(callee_var).unwrap(); let func_spec = func_spec_solutions.callee_spec(callee_var).unwrap();
let function_value = let function_value =
function_value_by_func_spec(env, func_spec, name, *full_layout); function_value_by_func_spec(env, func_spec, name, arg_layouts, ret_layout);
invoke_roc_function( invoke_roc_function(
env, env,
@ -3591,8 +3596,6 @@ pub fn build_proc<'a, 'ctx, 'env>(
// * roc__mainForHost_1_Update_size() -> i64 // * roc__mainForHost_1_Update_size() -> i64
// * roc__mainForHost_1_Update_result_size() -> i64 // * roc__mainForHost_1_Update_result_size() -> i64
let evaluator_layout = env.arena.alloc(top_level).full();
let it = top_level.arguments.iter().copied(); let it = top_level.arguments.iter().copied();
let bytes = roc_mono::alias_analysis::func_name_bytes_help( let bytes = roc_mono::alias_analysis::func_name_bytes_help(
symbol, symbol,
@ -3609,8 +3612,13 @@ pub fn build_proc<'a, 'ctx, 'env>(
"we expect only one specialization of this symbol" "we expect only one specialization of this symbol"
); );
let evaluator = let evaluator = function_value_by_func_spec(
function_value_by_func_spec(env, *func_spec, symbol, evaluator_layout); env,
*func_spec,
symbol,
top_level.arguments,
&top_level.result,
);
let ident_string = proc.name.ident_string(&env.interns); let ident_string = proc.name.ident_string(&env.interns);
let fn_name: String = format!("{}_1", ident_string); let fn_name: String = format!("{}_1", ident_string);
@ -3684,17 +3692,19 @@ fn function_value_by_func_spec<'a, 'ctx, 'env>(
env: &Env<'a, 'ctx, 'env>, env: &Env<'a, 'ctx, 'env>,
func_spec: FuncSpec, func_spec: FuncSpec,
symbol: Symbol, symbol: Symbol,
layout: Layout<'a>, arguments: &[Layout<'a>],
result: &Layout<'a>,
) -> FunctionValue<'ctx> { ) -> FunctionValue<'ctx> {
let fn_name = func_spec_name(env.arena, &env.interns, symbol, func_spec); let fn_name = func_spec_name(env.arena, &env.interns, symbol, func_spec);
let fn_name = fn_name.as_str(); let fn_name = fn_name.as_str();
function_value_by_name_help(env, layout, symbol, fn_name) function_value_by_name_help(env, arguments, result, symbol, fn_name)
} }
fn function_value_by_name_help<'a, 'ctx, 'env>( fn function_value_by_name_help<'a, 'ctx, 'env>(
env: &Env<'a, 'ctx, 'env>, env: &Env<'a, 'ctx, 'env>,
layout: Layout<'a>, arguments: &[Layout<'a>],
result: &Layout<'a>,
symbol: Symbol, symbol: Symbol,
fn_name: &str, fn_name: &str,
) -> FunctionValue<'ctx> { ) -> FunctionValue<'ctx> {
@ -3702,7 +3712,8 @@ fn function_value_by_name_help<'a, 'ctx, 'env>(
if symbol.is_builtin() { if symbol.is_builtin() {
eprintln!( eprintln!(
"Unrecognized builtin function: {:?}\nLayout: {:?}\n", "Unrecognized builtin function: {:?}\nLayout: {:?}\n",
fn_name, layout fn_name,
(arguments, result)
); );
eprintln!("Is the function defined? If so, maybe there is a problem with the layout"); eprintln!("Is the function defined? If so, maybe there is a problem with the layout");
@ -3714,7 +3725,9 @@ fn function_value_by_name_help<'a, 'ctx, 'env>(
// Unrecognized non-builtin function: // Unrecognized non-builtin function:
eprintln!( eprintln!(
"Unrecognized non-builtin function: {:?}\n\nSymbol: {:?}\nLayout: {:?}\n", "Unrecognized non-builtin function: {:?}\n\nSymbol: {:?}\nLayout: {:?}\n",
fn_name, symbol, layout fn_name,
symbol,
(arguments, result)
); );
eprintln!("Is the function defined? If so, maybe there is a problem with the layout"); eprintln!("Is the function defined? If so, maybe there is a problem with the layout");
@ -3730,12 +3743,14 @@ fn function_value_by_name_help<'a, 'ctx, 'env>(
#[inline(always)] #[inline(always)]
fn roc_call_with_args<'a, 'ctx, 'env>( fn roc_call_with_args<'a, 'ctx, 'env>(
env: &Env<'a, 'ctx, 'env>, env: &Env<'a, 'ctx, 'env>,
layout: &Layout<'a>, argument_layouts: &[Layout<'a>],
result_layout: &Layout<'a>,
symbol: Symbol, symbol: Symbol,
func_spec: FuncSpec, func_spec: FuncSpec,
args: &[BasicValueEnum<'ctx>], args: &[BasicValueEnum<'ctx>],
) -> BasicValueEnum<'ctx> { ) -> BasicValueEnum<'ctx> {
let fn_val = function_value_by_func_spec(env, func_spec, symbol, *layout); let fn_val =
function_value_by_func_spec(env, func_spec, symbol, argument_layouts, result_layout);
let call = env.builder.build_call(fn_val, args, "call"); let call = env.builder.build_call(fn_val, args, "call");
@ -3831,9 +3846,14 @@ fn run_higher_order_low_level<'a, 'ctx, 'env>(
macro_rules! passed_function_at_index { macro_rules! passed_function_at_index {
($index:expr) => {{ ($index:expr) => {{
let function_symbol = args[$index]; let function_symbol = args[$index];
let function_layout = Layout::FunctionPointer(argument_layouts, return_layout);
function_value_by_func_spec(env, func_spec, function_symbol, function_layout) function_value_by_func_spec(
env,
func_spec,
function_symbol,
argument_layouts,
return_layout,
)
}}; }};
} }

View file

@ -44,9 +44,7 @@ pub fn basic_type_from_layout<'a, 'ctx, 'env>(
use Layout::*; use Layout::*;
match layout { match layout {
FunctionPointer(args, ret_layout) => { FunctionPointer(args, ret_layout) => basic_type_from_function_layout(env, args, ret_layout),
basic_type_from_function_layout(env, args, None, ret_layout)
}
Closure(_args, closure_layout, _ret_layout) => { Closure(_args, closure_layout, _ret_layout) => {
let closure_data_layout = closure_layout.runtime_representation(); let closure_data_layout = closure_layout.runtime_representation();
basic_type_from_layout(env, &closure_data_layout) basic_type_from_layout(env, &closure_data_layout)