authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-23 19:20:38-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-23 19:20:38-07:00
log74ccd0c40b6871093f52769d342c1316e9ded0c0
tree0344132802f5581c1687e7f72083577c0648eb3a
parent7378ce67dabf996f2d0927138f826dfb3d6fa05f

Sema: Value.copy: we gotta copy the bytes

For Value.Tag.bytes, the value copy implementation did not copy the bytes array. No good. This operation must do a deep copy. If we want some other mechanism for not copying very large byte buffers then it has to work differently than this one.

2 files changed, 10 insertions(+), 2 deletions(-)

src/value.zig+9-1
......@@ -526,7 +526,15 @@ pub const Value = extern union {
526526 };
527527 return Value{ .ptr_otherwise = &new_payload.base };
528528 },
529 .bytes => return self.copyPayloadShallow(arena, Payload.Bytes),
529 .bytes => {
530 const bytes = self.castTag(.bytes).?.data;
531 const new_payload = try arena.create(Payload.Bytes);
532 new_payload.* = .{
533 .base = .{ .tag = .bytes },
534 .data = try arena.dupe(u8, bytes),
535 };
536 return Value{ .ptr_otherwise = &new_payload.base };
537 },
530538 .repeated,
531539 .eu_payload,
532540 .opt_payload,
test/behavior/cast.zig+1-1
......@@ -462,7 +462,7 @@ fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) anyerror![]u8 {
462462}
463463
464464test "implicit cast from *const [N]T to []const T" {
465 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
465 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
466466
467467 try testCastConstArrayRefToConstSlice();
468468 comptime try testCastConstArrayRefToConstSlice();