authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-20 18:26:09+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-22 21:56:34+01:00
log25d313f9115a939dfa1ffd65d00a392b30f235e3
tree9a0535faaadb5b03dc6fbe674acb09aff59338de
parent57c9eec232e1999fe6e8c89b53641c472421d629

codegen: lower repeated and empty_with_sentinel array type


1 files changed, 50 insertions(+), 1 deletions(-)

src/codegen.zig+50-1
......@@ -205,13 +205,62 @@ pub fn generateSymbol(
205205 .appended => {},
206206 .externally_managed => |slice| {
207207 code.appendSliceAssumeCapacity(slice);
208 return Result{ .appended = {} };
209208 },
210209 .fail => |em| return Result{ .fail = em },
211210 }
212211 }
213212 return Result{ .appended = {} };
214213 },
214 .repeated => {
215 const array = typed_value.val.castTag(.repeated).?.data;
216 const elem_ty = typed_value.ty.childType();
217 const sentinel = typed_value.ty.sentinel();
218 const len = typed_value.ty.arrayLen();
219
220 var index: u64 = 0;
221 while (index < len) : (index += 1) {
222 switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{
223 .ty = elem_ty,
224 .val = array,
225 }, code, debug_output)) {
226 .appended => {},
227 .externally_managed => |slice| {
228 code.appendSliceAssumeCapacity(slice);
229 },
230 .fail => |em| return Result{ .fail = em },
231 }
232 }
233
234 if (sentinel) |sentinel_val| {
235 switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{
236 .ty = elem_ty,
237 .val = sentinel_val,
238 }, code, debug_output)) {
239 .appended => {},
240 .externally_managed => |slice| {
241 code.appendSliceAssumeCapacity(slice);
242 },
243 .fail => |em| return Result{ .fail = em },
244 }
245 }
246
247 return Result{ .appended = {} };
248 },
249 .empty_array_sentinel => {
250 const elem_ty = typed_value.ty.childType();
251 const sentinel_val = typed_value.ty.sentinel().?;
252 switch (try generateSymbol(bin_file, parent_atom_index, src_loc, .{
253 .ty = elem_ty,
254 .val = sentinel_val,
255 }, code, debug_output)) {
256 .appended => {},
257 .externally_managed => |slice| {
258 code.appendSliceAssumeCapacity(slice);
259 },
260 .fail => |em| return Result{ .fail = em },
261 }
262 return Result{ .appended = {} };
263 },
215264 else => return Result{
216265 .fail = try ErrorMsg.create(
217266 bin_file.allocator,