Browse Source

Tilde: Add `in`/`not_in` for maps

gingerBill 2 years ago
parent
commit
0636887931
2 changed files with 13 additions and 9 deletions
  1. 5 0
      src/tilde.hpp
  2. 8 9
      src/tilde_expr.cpp

+ 5 - 0
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);

+ 8 - 9
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: