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...@@ -6912,11 +6912,11 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
6912 const final_len = lhs_info.len + rhs_info.len;6912 const final_len = lhs_info.len + rhs_info.len;
6913 const final_len_including_sent = final_len + @boolToInt(res_sent != null);6913 const final_len_including_sent = final_len + @boolToInt(res_sent != null);
6914 const is_pointer = lhs_ty.zigTypeTag() == .Pointer;6914 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;
6915 var anon_decl = try block.startAnonDecl();6917 var anon_decl = try block.startAnonDecl();
6916 defer anon_decl.deinit();6918 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;
6920 const buf = try anon_decl.arena().alloc(Value, final_len_including_sent);6920 const buf = try anon_decl.arena().alloc(Value, final_len_including_sent);
6921 {6921 {
6922 var i: u64 = 0;6922 var i: u64 = 0;
...@@ -6936,18 +6936,20 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -6936,18 +6936,20 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
6936 buf[final_len] = try rs.copy(anon_decl.arena());6936 buf[final_len] = try rs.copy(anon_decl.arena());
6937 break :ty try Type.Tag.array_sentinel.create(anon_decl.arena(), .{6937 break :ty try Type.Tag.array_sentinel.create(anon_decl.arena(), .{
6938 .len = final_len,6938 .len = final_len,
6939 .elem_type = lhs_info.elem_type,6939 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
6940 .sentinel = rs,6940 .sentinel = try rs.copy(anon_decl.arena()),
6941 });6941 });
6942 } else try Type.Tag.array.create(anon_decl.arena(), .{6942 } else try Type.Tag.array.create(anon_decl.arena(), .{
6943 .len = final_len,6943 .len = final_len,
6944 .elem_type = lhs_info.elem_type,6944 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
6945 });6945 });
6946 const val = try Value.Tag.array.create(anon_decl.arena(), buf);6946 const val = try Value.Tag.array.create(anon_decl.arena(), buf);
6947 return if (is_pointer)6947 const decl = try anon_decl.finish(ty, val);
6948 sema.analyzeDeclRef(try anon_decl.finish(ty, val))6948 if (is_pointer) {
6949 else6949 return sema.analyzeDeclRef(decl);
6950 sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(ty, val));6950 } else {
6951 return sema.analyzeDeclVal(block, .unneeded, decl);
6952 }
6951 } else {6953 } else {
6952 return sema.fail(block, lhs_src, "TODO runtime array_cat", .{});6954 return sema.fail(block, lhs_src, "TODO runtime array_cat", .{});
6953 }6955 }
...@@ -6990,10 +6992,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -6990,10 +6992,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
6990 const final_len_including_sent = final_len + @boolToInt(mulinfo.sentinel != null);6992 const final_len_including_sent = final_len + @boolToInt(mulinfo.sentinel != null);
69916993
6992 if (try sema.resolveDefinedValue(block, lhs_src, lhs)) |lhs_val| {6994 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
6993 var anon_decl = try block.startAnonDecl();6997 var anon_decl = try block.startAnonDecl();
6994 defer anon_decl.deinit();6998 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;
6997 const final_ty = if (mulinfo.sentinel) |sent|7000 const final_ty = if (mulinfo.sentinel) |sent|
6998 try Type.Tag.array_sentinel.create(anon_decl.arena(), .{7001 try Type.Tag.array_sentinel.create(anon_decl.arena(), .{
6999 .len = final_len,7002 .len = final_len,
...@@ -7010,7 +7013,8 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -7010,7 +7013,8 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
7010 // Optimization for the common pattern of a single element repeated N times, such7013 // Optimization for the common pattern of a single element repeated N times, such
7011 // as zero-filling a byte array.7014 // as zero-filling a byte array.
7012 const val = if (mulinfo.len == 1) blk: {7015 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());
7014 break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val);7018 break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val);
7015 } else blk: {7019 } else blk: {
7016 // the actual loop7020 // the actual loop
...@@ -7027,10 +7031,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -7027,10 +7031,11 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
7027 }7031 }
7028 break :blk try Value.Tag.array.create(anon_decl.arena(), buf);7032 break :blk try Value.Tag.array.create(anon_decl.arena(), buf);
7029 };7033 };
7034 const decl = try anon_decl.finish(final_ty, val);
7030 if (lhs_ty.zigTypeTag() == .Pointer) {7035 if (lhs_ty.zigTypeTag() == .Pointer) {
7031 return sema.analyzeDeclRef(try anon_decl.finish(final_ty, val));7036 return sema.analyzeDeclRef(decl);
7032 } else {7037 } else {
7033 return sema.analyzeDeclVal(block, .unneeded, try anon_decl.finish(final_ty, val));7038 return sema.analyzeDeclVal(block, .unneeded, decl);
7034 }7039 }
7035 }7040 }
7036 return sema.fail(block, lhs_src, "TODO runtime array_mul", .{});7041 return sema.fail(block, lhs_src, "TODO runtime array_mul", .{});
src/value.zig+3-1
...@@ -514,7 +514,9 @@ pub const Value = extern union {...@@ -514,7 +514,9 @@ pub const Value = extern union {
514 .base = payload.base,514 .base = payload.base,
515 .data = try arena.alloc(Value, payload.data.len),515 .data = try arena.alloc(Value, payload.data.len),
516 };516 };
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 }
518 return Value{ .ptr_otherwise = &new_payload.base };520 return Value{ .ptr_otherwise = &new_payload.base };
519 },521 },
520 .slice => {522 .slice => {