diff options
| author | gingerBill <bill@gingerbill.org> | 2021-06-16 17:04:05 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-06-16 17:04:05 +0100 |
| commit | 574ceb37a9f93f90906fe8389896c53bc71b94f6 (patch) | |
| tree | 09780a25776a2b4f0e1dc18c4302763959ff2b74 /src/llvm_backend.cpp | |
| parent | dbdc4471c2c7c9fcb477b09c1e6c7fe4256a95f7 (diff) | |
Correct selector call expression chaining behaviour (a bit of a hack)
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 769f5be45..79364b0eb 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -10534,7 +10534,26 @@ lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterVal } +lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr); + lbValue lb_build_call_expr(lbProcedure *p, Ast *expr) { + expr = unparen_expr(expr); + ast_node(ce, CallExpr, expr); + + if (ce->sce_temp_data) { + return *(lbValue *)ce->sce_temp_data; + } + + lbValue res = lb_build_call_expr_internal(p, expr); + + if (ce->optional_ok_one) { // TODO(bill): Minor hack for #optional_ok procedures + GB_ASSERT(is_type_tuple(res.type)); + GB_ASSERT(res.type->Tuple.variables.count == 2); + return lb_emit_struct_ev(p, res, 0); + } + return res; +} +lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { lbModule *m = p->module; TypeAndValue tv = type_and_value_of_expr(expr); @@ -12482,7 +12501,12 @@ lbValue lb_build_expr(lbProcedure *p, Ast *expr) { GB_ASSERT(se->modified_call); TypeAndValue tav = type_and_value_of_expr(expr); GB_ASSERT(tav.mode != Addressing_Invalid); - return lb_build_expr(p, se->call); + lbValue res = lb_build_call_expr(p, se->call); + + ast_node(ce, CallExpr, se->call); + ce->sce_temp_data = gb_alloc_copy(permanent_allocator(), &res, gb_size_of(res)); + + return res; case_end; case_ast_node(te, TernaryIfExpr, expr); @@ -12596,13 +12620,7 @@ lbValue lb_build_expr(lbProcedure *p, Ast *expr) { case_end; case_ast_node(ce, CallExpr, expr); - lbValue res = lb_build_call_expr(p, expr); - if (ce->optional_ok_one) { // TODO(bill): Minor hack for #optional_ok procedures - GB_ASSERT(is_type_tuple(res.type)); - GB_ASSERT(res.type->Tuple.variables.count == 2); - return lb_emit_struct_ev(p, res, 0); - } - return res; + return lb_build_call_expr(p, expr); case_end; case_ast_node(se, SliceExpr, expr); @@ -12992,7 +13010,8 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) { GB_ASSERT(se->modified_call); TypeAndValue tav = type_and_value_of_expr(expr); GB_ASSERT(tav.mode != Addressing_Invalid); - return lb_build_addr(p, se->call); + lbValue e = lb_build_expr(p, expr); + return lb_addr(lb_address_from_load_or_generate_local(p, e)); case_end; case_ast_node(ta, TypeAssertion, expr); |