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...@@ -8111,6 +8111,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
8111 } else {8111 } else {
8112 payload_scope = subexpr_scope;8112 payload_scope = subexpr_scope;
8113 }8113 }
8114 ScopeExpr *spill_scope = create_expr_scope(irb->codegen, node, payload_scope);
8114 IrInstSrc *err_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope,8115 IrInstSrc *err_val_ptr = ir_gen_node_extra(irb, node->data.while_expr.condition, subexpr_scope,
8115 LValPtr, nullptr);8116 LValPtr, nullptr);
8116 if (err_val_ptr == irb->codegen->invalid_inst_src)8117 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...@@ -8134,10 +8135,10 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
81348135
8135 ir_set_cursor_at_end_and_append_block(irb, body_block);8136 ir_set_cursor_at_end_and_append_block(irb, body_block);
8136 if (var_symbol) {8137 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,
8138 err_val_ptr, false, false);8139 err_val_ptr, false, false);
8139 IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ?8140 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;
8141 ir_build_var_decl_src(irb, payload_scope, symbol_node, payload_var, nullptr, var_ptr);8142 ir_build_var_decl_src(irb, payload_scope, symbol_node, payload_var, nullptr, var_ptr);
8142 }8143 }
81438144
...@@ -8152,6 +8153,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no...@@ -8152,6 +8153,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
8152 loop_scope->incoming_values = &incoming_values;8153 loop_scope->incoming_values = &incoming_values;
8153 loop_scope->lval = lval;8154 loop_scope->lval = lval;
8154 loop_scope->peer_parent = peer_parent;8155 loop_scope->peer_parent = peer_parent;
8156 loop_scope->spill_scope = spill_scope;
81558157
8156 // Note the body block of the loop is not the place that lval and result_loc are used -8158 // Note the body block of the loop is not the place that lval and result_loc are used -
8157 // it's actually in break statements, handled similarly to return statements.8159 // 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...@@ -8247,7 +8249,7 @@ static IrInstSrc *ir_gen_while_expr(IrBuilderSrc *irb, Scope *scope, AstNode *no
8247 ir_set_cursor_at_end_and_append_block(irb, body_block);8249 ir_set_cursor_at_end_and_append_block(irb, body_block);
8248 IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false);8250 IrInstSrc *payload_ptr = ir_build_optional_unwrap_ptr(irb, &spill_scope->base, symbol_node, maybe_val_ptr, false, false);
8249 IrInstSrc *var_ptr = node->data.while_expr.var_is_ptr ?8251 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;
8251 ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr);8253 ir_build_var_decl_src(irb, child_scope, symbol_node, payload_var, nullptr, var_ptr);
82528254
8253 ZigList<IrInstSrc *> incoming_values = {0};8255 ZigList<IrInstSrc *> incoming_values = {0};