| ... | ... | @@ -6095,7 +6095,6 @@ bool ir_gen(CodeGen *codegen, AstNode *node, Scope *scope, IrExecutable *ir_exec |
| 6095 | 6095 | IrInstruction *coro_id; |
| 6096 | 6096 | IrInstruction *coro_promise_ptr; |
| 6097 | 6097 | IrInstruction *coro_result_field_ptr; |
| 6098 | | IrInstruction *coro_need_dyn_alloc; |
| 6099 | 6098 | TypeTableEntry *return_type; |
| 6100 | 6099 | Buf *result_ptr_field_name; |
| 6101 | 6100 | if (is_async) { |
| ... | ... | @@ -6113,15 +6112,6 @@ bool ir_gen(CodeGen *codegen, AstNode *node, Scope *scope, IrExecutable *ir_exec |
| 6113 | 6112 | get_pointer_to_type(irb->codegen, irb->codegen->builtin_types.entry_u8, false)); |
| 6114 | 6113 | IrInstruction *promise_as_u8_ptr = ir_build_ptr_cast(irb, scope, node, u8_ptr_type, coro_promise_ptr); |
| 6115 | 6114 | coro_id = ir_build_coro_id(irb, scope, node, promise_as_u8_ptr); |
| 6116 | | coro_need_dyn_alloc = ir_build_coro_alloc(irb, scope, node, coro_id); |
| 6117 | | IrInstruction *zero = ir_build_const_usize(irb, scope, node, 0); |
| 6118 | | IrInstruction *null_ptr = ir_build_int_to_ptr(irb, scope, node, u8_ptr_type, zero); |
| 6119 | | |
| 6120 | | IrBasicBlock *dyn_alloc_block = ir_create_basic_block(irb, scope, "DynAlloc"); |
| 6121 | | IrBasicBlock *coro_begin_block = ir_create_basic_block(irb, scope, "CoroBegin"); |
| 6122 | | ir_build_cond_br(irb, scope, node, coro_need_dyn_alloc, dyn_alloc_block, coro_begin_block, const_bool_false); |
| 6123 | | |
| 6124 | | ir_set_cursor_at_end_and_append_block(irb, dyn_alloc_block); |
| 6125 | 6115 | IrInstruction *coro_size = ir_build_coro_size(irb, scope, node); |
| 6126 | 6116 | irb->exec->implicit_allocator_ptr = ir_build_get_implicit_allocator(irb, scope, node, ImplicitAllocatorIdContext); |
| 6127 | 6117 | IrInstruction *alloc_fn = ir_build_get_implicit_allocator(irb, scope, node, ImplicitAllocatorIdAlloc); |
| ... | ... | @@ -6144,31 +6134,11 @@ bool ir_gen(CodeGen *codegen, AstNode *node, Scope *scope, IrExecutable *ir_exec |
| 6144 | 6134 | ir_build_coro_alloc_fail(irb, scope, node, err_val); |
| 6145 | 6135 | |
| 6146 | 6136 | ir_set_cursor_at_end_and_append_block(irb, alloc_ok_block); |
| 6147 | | IrInstruction *unwrapped_mem_ptr = ir_build_unwrap_err_payload(irb, scope, node, alloc_result_ptr, false); |
| 6137 | coro_unwrapped_mem_ptr = ir_build_unwrap_err_payload(irb, scope, node, alloc_result_ptr, false); |
| 6148 | 6138 | Buf *ptr_field_name = buf_create_from_str("ptr"); |
| 6149 | | IrInstruction *coro_mem_ptr_field = ir_build_field_ptr(irb, scope, node, unwrapped_mem_ptr, |
| 6139 | IrInstruction *coro_mem_ptr_field = ir_build_field_ptr(irb, scope, node, coro_unwrapped_mem_ptr, |
| 6150 | 6140 | ptr_field_name); |
| 6151 | | IrInstruction *coro_mem_ptr = ir_build_load_ptr(irb, scope, node, coro_mem_ptr_field); |
| 6152 | | ir_build_br(irb, scope, node, coro_begin_block, const_bool_false); |
| 6153 | | |
| 6154 | | ir_set_cursor_at_end_and_append_block(irb, coro_begin_block); |
| 6155 | | |
| 6156 | | IrBasicBlock **coro_mem_incoming_blocks = allocate<IrBasicBlock *>(2); |
| 6157 | | IrInstruction **coro_mem_incoming_values = allocate<IrInstruction *>(2); |
| 6158 | | coro_mem_incoming_blocks[0] = entry_block; |
| 6159 | | coro_mem_incoming_values[0] = null_ptr; |
| 6160 | | coro_mem_incoming_blocks[1] = alloc_ok_block; |
| 6161 | | coro_mem_incoming_values[1] = coro_mem_ptr; |
| 6162 | | IrInstruction *coro_mem = ir_build_phi(irb, scope, node, 2, coro_mem_incoming_blocks, coro_mem_incoming_values); |
| 6163 | | |
| 6164 | | IrBasicBlock **unwrapped_mem_ptr_incoming_blocks = allocate<IrBasicBlock *>(2); |
| 6165 | | IrInstruction **unwrapped_mem_ptr_incoming_values = allocate<IrInstruction *>(2); |
| 6166 | | unwrapped_mem_ptr_incoming_blocks[0] = entry_block; |
| 6167 | | unwrapped_mem_ptr_incoming_values[0] = ir_build_const_undefined(irb, scope, node); |
| 6168 | | unwrapped_mem_ptr_incoming_blocks[1] = alloc_ok_block; |
| 6169 | | unwrapped_mem_ptr_incoming_values[1] = unwrapped_mem_ptr; |
| 6170 | | coro_unwrapped_mem_ptr = ir_build_phi(irb, scope, node, 2, |
| 6171 | | unwrapped_mem_ptr_incoming_blocks, unwrapped_mem_ptr_incoming_values); |
| 6141 | IrInstruction *coro_mem = ir_build_load_ptr(irb, scope, node, coro_mem_ptr_field); |
| 6172 | 6142 | |
| 6173 | 6143 | irb->exec->coro_handle = ir_build_coro_begin(irb, scope, node, coro_id, coro_mem); |
| 6174 | 6144 | |
| ... | ... | @@ -6245,20 +6215,14 @@ bool ir_gen(CodeGen *codegen, AstNode *node, Scope *scope, IrExecutable *ir_exec |
| 6245 | 6215 | incoming_blocks[1] = irb->exec->coro_normal_final; |
| 6246 | 6216 | incoming_values[1] = const_bool_true; |
| 6247 | 6217 | IrInstruction *resume_awaiter = ir_build_phi(irb, scope, node, 2, incoming_blocks, incoming_values); |
| 6248 | | IrBasicBlock *dyn_free_block = ir_create_basic_block(irb, scope, "DynFree"); |
| 6249 | | IrBasicBlock *end_free_block = ir_create_basic_block(irb, scope, "EndFree"); |
| 6250 | | ir_build_cond_br(irb, scope, node, coro_need_dyn_alloc, dyn_free_block, end_free_block, const_bool_false); |
| 6251 | 6218 | |
| 6252 | | ir_set_cursor_at_end_and_append_block(irb, dyn_free_block); |
| 6253 | 6219 | IrInstruction *free_fn = ir_build_get_implicit_allocator(irb, scope, node, ImplicitAllocatorIdFree); |
| 6254 | 6220 | size_t arg_count = 2; |
| 6255 | 6221 | IrInstruction **args = allocate<IrInstruction *>(arg_count); |
| 6256 | 6222 | args[0] = irb->exec->implicit_allocator_ptr; // self |
| 6257 | 6223 | args[1] = ir_build_load_ptr(irb, scope, node, coro_unwrapped_mem_ptr); // old_mem |
| 6258 | 6224 | ir_build_call(irb, scope, node, nullptr, free_fn, arg_count, args, false, FnInlineAuto, false, nullptr, nullptr, nullptr); |
| 6259 | | ir_build_br(irb, scope, node, end_free_block, const_bool_false); |
| 6260 | 6225 | |
| 6261 | | ir_set_cursor_at_end_and_append_block(irb, end_free_block); |
| 6262 | 6226 | IrBasicBlock *resume_block = ir_create_basic_block(irb, scope, "Resume"); |
| 6263 | 6227 | IrBasicBlock *return_block = ir_create_basic_block(irb, scope, "Return"); |
| 6264 | 6228 | ir_build_cond_br(irb, scope, node, resume_awaiter, resume_block, return_block, const_bool_false); |