Browse Source

Allow map indices to be referenced `&m[key]` and return a valid pointer if it exists otherwise `nil`

gingerBill 5 years ago
parent
commit
b7893082ce
1 changed files with 13 additions and 1 deletions
  1. 13 1
      src/llvm_backend.cpp

+ 13 - 1
src/llvm_backend.cpp

@@ -107,7 +107,19 @@ lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
 	}
 	}
 
 
 	switch (addr.kind) {
 	switch (addr.kind) {
-	case lbAddr_Map:
+	case lbAddr_Map: {
+		Type *map_type = base_type(addr.map.type);
+		lbValue h = lb_gen_map_header(p, addr.addr, map_type);
+		lbValue key = lb_gen_map_key(p, addr.map.key, map_type->Map.key);
+
+		auto args = array_make<lbValue>(heap_allocator(), 2);
+		args[0] = h;
+		args[1] = key;
+
+		lbValue ptr = lb_emit_runtime_call(p, "__dynamic_map_get", args);
+
+		return lb_emit_conv(p, ptr, alloc_type_pointer(map_type->Map.value));
+	}
 	case lbAddr_BitField: {
 	case lbAddr_BitField: {
 		lbValue v = lb_addr_load(p, addr);
 		lbValue v = lb_addr_load(p, addr);
 		return lb_address_from_load_or_generate_local(p, v);
 		return lb_address_from_load_or_generate_local(p, v);