| ... | ... | @@ -3246,6 +3246,7 @@ static IrInstruction *ir_build_end_expr(IrBuilder *irb, Scope *scope, AstNode *s |
| 3246 | 3246 | IrInstruction *value, ResultLoc *result_loc) |
| 3247 | 3247 | { |
| 3248 | 3248 | IrInstructionEndExpr *instruction = ir_build_instruction<IrInstructionEndExpr>(irb, scope, source_node); |
| 3249 | instruction->base.is_gen = true; |
| 3249 | 3250 | instruction->value = value; |
| 3250 | 3251 | instruction->result_loc = result_loc; |
| 3251 | 3252 | |
| ... | ... | @@ -5487,8 +5488,10 @@ static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction * |
| 5487 | 5488 | // We needed a pointer to a value, but we got a value. So we create |
| 5488 | 5489 | // an instruction which just makes a pointer of it. |
| 5489 | 5490 | return ir_build_ref(irb, scope, value->source_node, value, false, false); |
| 5490 | | } else { |
| 5491 | } else if (result_loc != nullptr) { |
| 5491 | 5492 | return ir_expr_wrap(irb, scope, value, result_loc); |
| 5493 | } else { |
| 5494 | return value; |
| 5492 | 5495 | } |
| 5493 | 5496 | |
| 5494 | 5497 | } |
| ... | ... | @@ -5625,6 +5628,10 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5625 | 5628 | { |
| 5626 | 5629 | assert(node->type == NodeTypeContainerInitExpr); |
| 5627 | 5630 | |
| 5631 | if (ir_should_inline(irb->exec, scope)) { |
| 5632 | result_loc = nullptr; |
| 5633 | } |
| 5634 | |
| 5628 | 5635 | AstNodeContainerInitExpr *container_init_expr = &node->data.container_init_expr; |
| 5629 | 5636 | ContainerInitKind kind = container_init_expr->kind; |
| 5630 | 5637 | |
| ... | ... | @@ -5648,12 +5655,15 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5648 | 5655 | return irb->codegen->invalid_instruction; |
| 5649 | 5656 | } |
| 5650 | 5657 | |
| 5651 | | src_assert(result_loc->scope_elide == nullptr, node); |
| 5652 | | result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope); |
| 5658 | IrInstruction *container_ptr = nullptr; |
| 5659 | if (result_loc != nullptr) { |
| 5660 | src_assert(result_loc->scope_elide == nullptr, node); |
| 5661 | result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope); |
| 5653 | 5662 | |
| 5654 | | src_assert(result_loc != nullptr, node); |
| 5655 | | IrInstruction *container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base, |
| 5656 | | node, result_loc, container_type); |
| 5663 | src_assert(result_loc != nullptr, node); |
| 5664 | container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base, |
| 5665 | node, result_loc, container_type); |
| 5666 | } |
| 5657 | 5667 | |
| 5658 | 5668 | size_t field_count = container_init_expr->entries.length; |
| 5659 | 5669 | IrInstructionContainerInitFieldsField *fields = allocate<IrInstructionContainerInitFieldsField>(field_count); |
| ... | ... | @@ -5664,16 +5674,21 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5664 | 5674 | Buf *name = entry_node->data.struct_val_field.name; |
| 5665 | 5675 | AstNode *expr_node = entry_node->data.struct_val_field.expr; |
| 5666 | 5676 | |
| 5667 | | IrInstruction *field_ptr = ir_build_field_ptr(irb, &result_loc->scope_elide->base, expr_node, |
| 5668 | | container_ptr, name, true); |
| 5669 | | ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1); |
| 5670 | | result_loc_inst->base.id = ResultLocIdInstruction; |
| 5671 | | result_loc_inst->base.source_instruction = field_ptr; |
| 5672 | | ir_ref_instruction(field_ptr, irb->current_basic_block); |
| 5673 | | ResultLoc *child_result_loc = &result_loc_inst->base; |
| 5677 | Scope *val_scope = scope; |
| 5678 | ResultLoc *child_result_loc = nullptr; |
| 5679 | if (container_ptr != nullptr) { |
| 5680 | IrInstruction *field_ptr = ir_build_field_ptr(irb, &result_loc->scope_elide->base, expr_node, |
| 5681 | container_ptr, name, true); |
| 5682 | ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1); |
| 5683 | result_loc_inst->base.id = ResultLocIdInstruction; |
| 5684 | result_loc_inst->base.source_instruction = field_ptr; |
| 5685 | ir_ref_instruction(field_ptr, irb->current_basic_block); |
| 5686 | child_result_loc = &result_loc_inst->base; |
| 5687 | val_scope = &result_loc->scope_elide->base; |
| 5688 | } |
| 5674 | 5689 | |
| 5675 | | IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, &result_loc->scope_elide->base, |
| 5676 | | LValNone, child_result_loc); |
| 5690 | IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, val_scope, LValNone, |
| 5691 | child_result_loc); |
| 5677 | 5692 | if (expr_value == irb->codegen->invalid_instruction) |
| 5678 | 5693 | return expr_value; |
| 5679 | 5694 | |
| ... | ... | @@ -5686,9 +5701,6 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5686 | 5701 | return ir_lval_wrap(irb, scope, init_fields, lval, result_loc); |
| 5687 | 5702 | } |
| 5688 | 5703 | case ContainerInitKindArray: { |
| 5689 | | src_assert(result_loc->scope_elide == nullptr, node); |
| 5690 | | result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope); |
| 5691 | | |
| 5692 | 5704 | size_t item_count = container_init_expr->entries.length; |
| 5693 | 5705 | |
| 5694 | 5706 | if (container_type == nullptr) { |
| ... | ... | @@ -5696,25 +5708,35 @@ static IrInstruction *ir_gen_container_init_expr(IrBuilder *irb, Scope *scope, A |
| 5696 | 5708 | container_type = ir_build_array_type(irb, scope, node, item_count_inst, elem_type); |
| 5697 | 5709 | } |
| 5698 | 5710 | |
| 5699 | | src_assert(result_loc != nullptr, node); |
| 5700 | | IrInstruction *container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base, |
| 5701 | | node, result_loc, container_type); |
| 5711 | IrInstruction *container_ptr = nullptr; |
| 5712 | if (result_loc != nullptr) { |
| 5713 | src_assert(result_loc->scope_elide == nullptr, node); |
| 5714 | result_loc->scope_elide = create_elide_scope(irb->codegen, node, scope); |
| 5715 | |
| 5716 | container_ptr = ir_build_resolve_result(irb, &result_loc->scope_elide->base, |
| 5717 | node, result_loc, container_type); |
| 5718 | } |
| 5702 | 5719 | |
| 5703 | 5720 | IrInstruction **values = allocate<IrInstruction *>(item_count); |
| 5704 | 5721 | for (size_t i = 0; i < item_count; i += 1) { |
| 5705 | 5722 | AstNode *expr_node = container_init_expr->entries.at(i); |
| 5706 | 5723 | |
| 5707 | | IrInstruction *elem_index = ir_build_const_usize(irb, &result_loc->scope_elide->base, expr_node, i); |
| 5708 | | IrInstruction *elem_ptr = ir_build_elem_ptr(irb, &result_loc->scope_elide->base, expr_node, |
| 5709 | | container_ptr, elem_index, false, PtrLenSingle); |
| 5710 | | ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1); |
| 5711 | | result_loc_inst->base.id = ResultLocIdInstruction; |
| 5712 | | result_loc_inst->base.source_instruction = elem_ptr; |
| 5713 | | ir_ref_instruction(elem_ptr, irb->current_basic_block); |
| 5714 | | ResultLoc *child_result_loc = &result_loc_inst->base; |
| 5715 | | |
| 5716 | | IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, &result_loc->scope_elide->base, |
| 5717 | | LValNone, child_result_loc); |
| 5724 | ResultLoc *child_result_loc = nullptr; |
| 5725 | Scope *val_scope = scope; |
| 5726 | if (container_ptr != nullptr) { |
| 5727 | IrInstruction *elem_index = ir_build_const_usize(irb, &result_loc->scope_elide->base, expr_node, i); |
| 5728 | IrInstruction *elem_ptr = ir_build_elem_ptr(irb, &result_loc->scope_elide->base, expr_node, |
| 5729 | container_ptr, elem_index, false, PtrLenSingle); |
| 5730 | ResultLocInstruction *result_loc_inst = allocate<ResultLocInstruction>(1); |
| 5731 | result_loc_inst->base.id = ResultLocIdInstruction; |
| 5732 | result_loc_inst->base.source_instruction = elem_ptr; |
| 5733 | ir_ref_instruction(elem_ptr, irb->current_basic_block); |
| 5734 | child_result_loc = &result_loc_inst->base; |
| 5735 | val_scope = &result_loc->scope_elide->base; |
| 5736 | } |
| 5737 | |
| 5738 | IrInstruction *expr_value = ir_gen_node_extra(irb, expr_node, val_scope, LValNone, |
| 5739 | child_result_loc); |
| 5718 | 5740 | if (expr_value == irb->codegen->invalid_instruction) |
| 5719 | 5741 | return expr_value; |
| 5720 | 5742 | |