fix argument passing

This commit is contained in:
Folkert 2021-09-22 21:23:53 +02:00
parent 3c53435e7e
commit cfdda10df4

View file

@ -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());