diff options
| author | gingerBill <bill@gingerbill.org> | 2020-03-24 15:51:17 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-03-24 15:51:17 +0000 |
| commit | b7893082ce138f5670d52b6c267d0a6599694166 (patch) | |
| tree | fcfc142893a3e6e46134fbcb670137ad29692aaf /src/llvm_backend.cpp | |
| parent | 6bfe9b66562f05fe262c08f7b71eb9fdaa5c11cc (diff) | |
Allow map indices to be referenced `&m[key]` and return a valid pointer if it exists otherwise `nil`
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 2e36a9b99..47c55f769 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -107,7 +107,19 @@ lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) { } 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: { lbValue v = lb_addr_load(p, addr); return lb_address_from_load_or_generate_local(p, v); |