mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
fix argument passing
This commit is contained in:
parent
3c53435e7e
commit
cfdda10df4
1 changed files with 11 additions and 17 deletions
|
@ -3959,24 +3959,18 @@ pub fn build_closure_caller<'a, 'ctx, 'env>(
|
||||||
|
|
||||||
builder.position_at_end(entry);
|
builder.position_at_end(entry);
|
||||||
|
|
||||||
let mut parameters = function_value.get_params();
|
let mut evaluator_arguments = function_value.get_params();
|
||||||
let output = parameters.pop().unwrap().into_pointer_value();
|
|
||||||
|
|
||||||
let closure_data = if let Some(closure_data_ptr) = parameters.pop() {
|
// the final parameter is the output pointer, pop it
|
||||||
let closure_data =
|
let output = evaluator_arguments.pop().unwrap().into_pointer_value();
|
||||||
builder.build_load(closure_data_ptr.into_pointer_value(), "load_closure_data");
|
|
||||||
|
|
||||||
env.arena.alloc([closure_data]) as &[_]
|
// NOTE this may be incorrect in the long run
|
||||||
} else {
|
// here we load any argument that is a pointer
|
||||||
&[]
|
for param in evaluator_arguments.iter_mut() {
|
||||||
};
|
if param.is_pointer_value() {
|
||||||
|
|
||||||
let mut parameters = parameters;
|
|
||||||
|
|
||||||
for param in parameters.iter_mut() {
|
|
||||||
debug_assert!(param.is_pointer_value());
|
|
||||||
*param = builder.build_load(param.into_pointer_value(), "load_param");
|
*param = builder.build_load(param.into_pointer_value(), "load_param");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let call_result = if env.is_gen_test {
|
let call_result = if env.is_gen_test {
|
||||||
set_jump_and_catch_long_jump(
|
set_jump_and_catch_long_jump(
|
||||||
|
@ -3984,13 +3978,13 @@ pub fn build_closure_caller<'a, 'ctx, 'env>(
|
||||||
function_value,
|
function_value,
|
||||||
evaluator,
|
evaluator,
|
||||||
evaluator.get_call_conventions(),
|
evaluator.get_call_conventions(),
|
||||||
closure_data,
|
&evaluator_arguments,
|
||||||
result_type,
|
result_type,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
let call = env
|
let call = env
|
||||||
.builder
|
.builder
|
||||||
.build_call(evaluator, closure_data, "call_function");
|
.build_call(evaluator, &evaluator_arguments, "call_function");
|
||||||
|
|
||||||
call.set_call_convention(evaluator.get_call_conventions());
|
call.set_call_convention(evaluator.get_call_conventions());
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue