authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-21 20:28:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-21 20:28:32-07:00
log1bce0ed0460e2bdeb47d534e28090ed4b3794b97
tree5e4994656468fbb9430dd29a4f6591d3837855a4
parent7f70c27e9d57c8234545120da81861e2cfb354b5

stage2: fix Value.copy not copying arrays


2 files changed, 21 insertions(+), 14 deletions(-)

src/Sema.zig+18-13
......@@ -6912,11 +6912,11 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
69126912 const final_len = lhs_info.len + rhs_info.len;
69136913 const final_len_including_sent = final_len + @boolToInt(res_sent != null);
69146914 const is_pointer = lhs_ty.zigTypeTag() == .Pointer;
6915 const lhs_sub_val = if (is_pointer) (try lhs_val.pointerDeref(sema.arena)).? else lhs_val;
6916 const rhs_sub_val = if (is_pointer) (try rhs_val.pointerDeref(sema.arena)).? else rhs_val;
69156917 var anon_decl = try block.startAnonDecl();
69166918 defer anon_decl.deinit();
69176919
6918 const lhs_sub_val = if (is_pointer) (try lhs_val.pointerDeref(anon_decl.arena())).? else lhs_val;
6919 const rhs_sub_val = if (is_pointer) (try rhs_val.pointerDeref(anon_decl.arena())).? else rhs_val;
69206920 const buf = try anon_decl.arena().alloc(Value, final_len_including_sent);
69216921 {
69226922 var i: u64 = 0;
......@@ -6936,18 +6936,20 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
69366936 buf[final_len] = try rs.copy(anon_decl.arena());
69376937 break :ty try Type.Tag.array_sentinel.create(anon_decl.arena(), .{
69386938 .len = final_len,
6939 .elem_type = lhs_info.elem_type,
6940 .sentinel = rs,
6939 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
6940 .sentinel = try rs.copy(anon_decl.arena()),
69416941 });
69426942 } else try Type.Tag.array.create(anon_decl.arena(), .{
69436943 .len = final_len,
6944 .elem_type = lhs_info.elem_type,
6944 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
69456945 });
69466946 const val = try Value.Tag.array.create(anon_decl.arena(), buf);
6947 return if (is_pointer)
6948 sema.analyzeDeclRef(try anon_decl.finish(ty, val))
6949 else
6950 sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(ty, val));
6947 const decl = try anon_decl.finish(ty, val);
6948 if (is_pointer) {
6949 return sema.analyzeDeclRef(decl);
6950 } else {
6951 return sema.analyzeDeclVal(block, .unneeded, decl);
6952 }
69516953 } else {
69526954 return sema.fail(block, lhs_src, "TODO runtime array_cat", .{});
69536955 }
......@@ -6990,10 +6992,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
69906992 const final_len_including_sent = final_len + @boolToInt(mulinfo.sentinel != null);
69916993
69926994 if (try sema.resolveDefinedValue(block, lhs_src, lhs)) |lhs_val| {
6995 const lhs_sub_val = if (lhs_ty.zigTypeTag() == .Pointer) (try lhs_val.pointerDeref(sema.arena)).? else lhs_val;
6996
69936997 var anon_decl = try block.startAnonDecl();
69946998 defer anon_decl.deinit();
69956999
6996 const lhs_sub_val = if (lhs_ty.zigTypeTag() == .Pointer) (try lhs_val.pointerDeref(anon_decl.arena())).? else lhs_val;
69977000 const final_ty = if (mulinfo.sentinel) |sent|
69987001 try Type.Tag.array_sentinel.create(anon_decl.arena(), .{
69997002 .len = final_len,
......@@ -7010,7 +7013,8 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
70107013 // Optimization for the common pattern of a single element repeated N times, such
70117014 // as zero-filling a byte array.
70127015 const val = if (mulinfo.len == 1) blk: {
7013 const copied_val = try (try lhs_sub_val.elemValue(sema.arena, 0)).copy(anon_decl.arena());
7016 const elem_val = try lhs_sub_val.elemValue(sema.arena, 0);
7017 const copied_val = try elem_val.copy(anon_decl.arena());
70147018 break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val);
70157019 } else blk: {
70167020 // the actual loop
......@@ -7027,10 +7031,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
70277031 }
70287032 break :blk try Value.Tag.array.create(anon_decl.arena(), buf);
70297033 };
7034 const decl = try anon_decl.finish(final_ty, val);
70307035 if (lhs_ty.zigTypeTag() == .Pointer) {
7031 return sema.analyzeDeclRef(try anon_decl.finish(final_ty, val));
7036 return sema.analyzeDeclRef(decl);
70327037 } else {
7033 return sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(final_ty, val));
7038 return sema.analyzeDeclVal(block, .unneeded, decl);
70347039 }
70357040 }
70367041 return sema.fail(block, lhs_src, "TODO runtime array_mul", .{});
src/value.zig+3-1
......@@ -514,7 +514,9 @@ pub const Value = extern union {
514514 .base = payload.base,
515515 .data = try arena.alloc(Value, payload.data.len),
516516 };
517 std.mem.copy(Value, new_payload.data, payload.data);
517 for (new_payload.data) |*elem, i| {
518 elem.* = try payload.data[i].copy(arena);
519 }
518520 return Value{ .ptr_otherwise = &new_payload.base };
519521 },
520522 .slice => {