diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-02-20 18:26:09 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-02-22 21:56:34 +0100 |
| commit | 25d313f9115a939dfa1ffd65d00a392b30f235e3 (patch) | |
| tree | 9a0535faaadb5b03dc6fbe674acb09aff59338de /src/codegen.zig | |
| parent | 57c9eec232e1999fe6e8c89b53641c472421d629 (diff) | |
| download | zig-25d313f9115a939dfa1ffd65d00a392b30f235e3.tar.gz zig-25d313f9115a939dfa1ffd65d00a392b30f235e3.zip | |
codegen: lower repeated and empty_with_sentinel array type
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 9a8eb7abf2..1c1881bc32 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -205,13 +205,62 @@ pub fn generateSymbol( .appended => {}, .externally_managed => |slice| { code.appendSliceAssumeCapacity(slice); - return Result{ .appended = {} }; }, .fail => |em| return Result{ .fail = em }, } } return Result{ .appended = {} }; }, + .repeated => { + const array = typed_value.val.castTag(.repeated).?.data; + const elem_ty = typed_value.ty.childType(); + const sentinel = typed_value.ty.sentinel(); + const len = typed_value.ty.arrayLen(); + + var index: u64 = 0; + while (index < len) : (index += 1) { + switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ + .ty = elem_ty, + .val = array, + }, code, debug_output)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + } + + if (sentinel) |sentinel_val| { + switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ + .ty = elem_ty, + .val = sentinel_val, + }, code, debug_output)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + } + + return Result{ .appended = {} }; + }, + .empty_array_sentinel => { + const elem_ty = typed_value.ty.childType(); + const sentinel_val = typed_value.ty.sentinel().?; + switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{ + .ty = elem_ty, + .val = sentinel_val, + }, code, debug_output)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + return Result{ .appended = {} }; + }, else => return Result{ .fail = try ErrorMsg.create( bin_file.allocator, |
