Add @(deferred_*_by_ptr=<proc>)

This commit is contained in:
gingerBill
2023-04-15 16:04:04 +01:00
parent 7abaf77292
commit dc55e88588
3 changed files with 226 additions and 115 deletions

View File

@@ -1169,17 +1169,27 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> c
lbValue deferred = lb_find_procedure_value_from_entity(p->module, deferred_entity);
bool by_ptr = false;
auto in_args = args;
Array<lbValue> result_as_args = {};
switch (kind) {
case DeferredProcedure_none:
break;
case DeferredProcedure_in_by_ptr:
by_ptr = true;
/*fallthrough*/
case DeferredProcedure_in:
result_as_args = array_clone(heap_allocator(), in_args);
break;
case DeferredProcedure_out_by_ptr:
by_ptr = true;
/*fallthrough*/
case DeferredProcedure_out:
result_as_args = lb_value_to_array(p, heap_allocator(), result);
break;
case DeferredProcedure_in_out_by_ptr:
by_ptr = true;
/*fallthrough*/
case DeferredProcedure_in_out:
{
auto out_args = lb_value_to_array(p, heap_allocator(), result);
@@ -1189,6 +1199,12 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> c
}
break;
}
if (by_ptr) {
for_array(i, result_as_args) {
lbValue arg_ptr = lb_address_from_load_or_generate_local(p, result_as_args[i]);
result_as_args[i] = arg_ptr;
}
}
lb_add_defer_proc(p, p->scope_index, deferred, result_as_args);
}