From 25d313f9115a939dfa1ffd65d00a392b30f235e3 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sun, 20 Feb 2022 18:26:09 +0100 Subject: codegen: lower repeated and empty_with_sentinel array type --- src/codegen.zig | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src/codegen.zig') 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, -- cgit v1.2.3