authorgravatar for benjamin.feng@glassdoor.comBenjamin Feng <benjamin.feng@glassdoor.com> 2020-01-28 23:50:05-06:00
committergravatar for benjamin.feng@glassdoor.comBenjamin Feng <benjamin.feng@glassdoor.com> 2020-01-29 10:01:51-06:00
loga4ac7980b4a37c3d9d36b63685c8a5867d4849f5
tree111a6d1bd524498539f0838e3c987eac779fa79e
parent2f239e3dbd809df3e4cdd10189986aa09d912b48

Add a spill to while error union


1 files changed, 5 insertions(+), 3 deletions(-)

src/ir.cpp+5-3
......@@ -8111,6 +8111,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
81118111 } else {
81128112 payload_scope = subexpr_scope;
81138113 }
8114 ScopeExpr *spill_scope = create_expr_scope(irb->codegen, node, payload_scope);
81148115 IrInstSrc *err_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope,
81158116 LValPtr, nullptr);
81168117 if (err_val_ptr == irb->codegen->invalid_inst_src)
......@@ -8134,10 +8135,10 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
81348135
81358136 ir_set_cursor_at_end_and_append_block(irb, body_block);
81368137 if (var_symbol) {
8137 IrInstSrc *payload_ptr = ir_build_unwrap_err_payload_src(irb, payload_scope, symbol_node,
8138 IrInstSrc *payload_ptr = ir_build_unwrap_err_payload_src(irb, &spill_scope->base, symbol_node,
81388139 err_val_ptr, false, false);
81398140 IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ?
8140 ir_build_ref_src(irb, payload_scope, symbol_node, payload_ptr, true, false) : payload_ptr;
8141 ir_build_ref_src(irb, &spill_scope->base, symbol_node, payload_ptr, true, false) : payload_ptr;
81418142 ir_build_var_decl_src(irb, payload_scope, symbol_node, payload_var, nullptr, var_ptr);
81428143 }
81438144
......@@ -8152,6 +8153,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
81528153 loop_scope->incoming_values = &incoming_values;
81538154 loop_scope->lval = lval;
81548155 loop_scope->peer_parent = peer_parent;
8156 loop_scope->spill_scope = spill_scope;
81558157
81568158 // Note the body block of the loop is not the place that lval and result_loc are used -
81578159 // it's actually in break statements, handled similarly to return statements.
......@@ -8247,7 +8249,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
82478249 ir_set_cursor_at_end_and_append_block(irb, body_block);
82488250 IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false);
82498251 IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ?
8250 ir_build_ref_src(irb, child_scope, symbol_node, payload_ptr, true, false) : payload_ptr;
8252 ir_build_ref_src(irb, &spill_scope->base, symbol_node, payload_ptr, true, false) : payload_ptr;
82518253 ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr);
82528254
82538255 ZigList<IrInstSrc *> incoming_values = {0};