aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-03-24 15:48:31 +0000
committergingerBill <bill@gingerbill.org>2020-03-24 15:48:31 +0000
commitda703edbf47858c832a3f358967051c8f3cccb90 (patch)
treed7bf8176b986473f83c7592ed192b9efec260d3b /src/ir.cpp
parentd57fbf48f0cdf4d120679205ef111c3bac4e5545 (diff)
Allow map indices to be referenced `&m[key]` and return a valid pointer if it exists otherwise `nil`
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 4736f2ba1..fe5608a4a 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -3929,7 +3929,20 @@ irValue *ir_addr_get_ptr(irProcedure *proc, irAddr const &addr) {
}
switch (addr.kind) {
- case irAddr_Map:
+ case irAddr_Map: {
+ Type *map_type = base_type(addr.map_type);
+ irValue *h = ir_gen_map_header(proc, addr.addr, map_type);
+ irValue *key = ir_gen_map_key(proc, addr.map_key, map_type->Map.key);
+
+ auto args = array_make<irValue *>(ir_allocator(), 2);
+ args[0] = h;
+ args[1] = key;
+
+ irValue *ptr = ir_emit_runtime_call(proc, "__dynamic_map_get", args);
+ return ir_emit_conv(proc, ptr, alloc_type_pointer(map_type->Map.value));
+ }
+
+
case irAddr_BitField: {
irValue *v = ir_addr_load(proc, addr);
return ir_address_from_load_or_generate_local(proc, v);