From 06368879316c3face7b284fa4dfec8d1428d7c7c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 7 Aug 2023 14:43:11 +0100 Subject: [PATCH] Tilde: Add `in`/`not_in` for maps --- src/tilde.hpp | 5 +++++ src/tilde_expr.cpp | 17 ++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/tilde.hpp b/src/tilde.hpp index 4bc221e29..f98b52512 100644 --- a/src/tilde.hpp +++ b/src/tilde.hpp @@ -378,3 +378,8 @@ gb_internal cgValue cg_builtin_map_info(cgProcedure *p, Type *map_type); gb_internal cgValue cg_builtin_map_cell_info(cgProcedure *p, Type *type); gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, String const &proc_name, TokenPos pos); gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, Ast *node); + + +gb_internal cgValue cg_internal_dynamic_map_get_ptr(cgProcedure *p, cgValue const &map_ptr, cgValue const &key); +gb_internal void cg_internal_dynamic_map_set(cgProcedure *p, cgValue const &map_ptr, Type *map_type, + cgValue const &map_key, cgValue const &map_value, Ast *node); \ No newline at end of file diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp index 7097f76ed..6dadc5c67 100644 --- a/src/tilde_expr.cpp +++ b/src/tilde_expr.cpp @@ -2135,15 +2135,14 @@ gb_internal cgValue cg_build_binary_expr(cgProcedure *p, Ast *expr) { switch (rt->kind) { case Type_Map: { - GB_PANIC("TODO(bill): in/not_in for maps"); - // cgValue map_ptr = cg_address_from_load_or_generate_local(p, right); - // cgValue key = left; - // cgValue ptr = cg_internal_dynamic_map_get_ptr(p, map_ptr, key); - // if (be->op.kind == Token_in) { - // return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool); - // } else { - // return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_CmpEq, ptr), t_bool); - // } + cgValue map_ptr = cg_address_from_load_or_generate_local(p, right); + cgValue key = left; + cgValue ptr = cg_internal_dynamic_map_get_ptr(p, map_ptr, key); + if (be->op.kind == Token_in) { + return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool); + } else { + return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_CmpEq, ptr), t_bool); + } } break; case Type_BitSet: