From 74ccd0c40b6871093f52769d342c1316e9ded0c0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 23 Mar 2022 19:20:38 -0700 Subject: [PATCH] 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. --- src/value.zig | 10 +++++++++- test/behavior/cast.zig | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/value.zig b/src/value.zig index fb9a2f826a..24f6b1df75 100644 --- a/src/value.zig +++ b/src/value.zig @@ -526,7 +526,15 @@ pub const Value = extern union { }; return Value{ .ptr_otherwise = &new_payload.base }; }, - .bytes => return self.copyPayloadShallow(arena, Payload.Bytes), + .bytes => { + const bytes = self.castTag(.bytes).?.data; + const new_payload = try arena.create(Payload.Bytes); + new_payload.* = .{ + .base = .{ .tag = .bytes }, + .data = try arena.dupe(u8, bytes), + }; + return Value{ .ptr_otherwise = &new_payload.base }; + }, .repeated, .eu_payload, .opt_payload, diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 003b1b7bec..4bb8f147ec 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -462,7 +462,7 @@ fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) anyerror![]u8 { } test "implicit cast from *const [N]T to []const T" { - if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO try testCastConstArrayRefToConstSlice(); comptime try testCastConstArrayRefToConstSlice();