aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-08-07 14:43:11 +0100
committergingerBill <bill@gingerbill.org>2023-08-07 14:43:11 +0100
commit06368879316c3face7b284fa4dfec8d1428d7c7c (patch)
treecace8395d87d46b53f00e9b7511b9618cd5a4331
parent0c1b39d881a5f91534bf0f33fb945ab57ef293d8 (diff)
Tilde: Add `in`/`not_in` for maps
-rw-r--r--src/tilde.hpp5
-rw-r--r--src/tilde_expr.cpp17
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: