aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-05-24 15:32:12 -0400
committerGitHub <noreply@github.com>2022-05-24 15:32:12 -0400
commit60f0acd9b9c2bced47ba1c214460f34b73738f95 (patch)
tree7cc1ba371eab54fb84d5f56a67c3dab0d035bf7a /src/codegen.zig
parent8171972cbb477672ee1a99d953df4aaecb744a0c (diff)
parent953e2778d4402cf85b99061ef9bdb89aa3e5f2db (diff)
downloadzig-60f0acd9b9c2bced47ba1c214460f34b73738f95.tar.gz
zig-60f0acd9b9c2bced47ba1c214460f34b73738f95.zip
Merge pull request #11706 from ziglang/string-literal-interning
stage2: string literal interning
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index def69d952f..bd556baa5e 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -203,11 +203,23 @@ pub fn generateSymbol(
},
.Array => switch (typed_value.val.tag()) {
.bytes => {
- const payload = typed_value.val.castTag(.bytes).?;
+ const bytes = typed_value.val.castTag(.bytes).?.data;
const len = @intCast(usize, typed_value.ty.arrayLenIncludingSentinel());
// The bytes payload already includes the sentinel, if any
try code.ensureUnusedCapacity(len);
- code.appendSliceAssumeCapacity(payload.data[0..len]);
+ code.appendSliceAssumeCapacity(bytes[0..len]);
+ return Result{ .appended = {} };
+ },
+ .str_lit => {
+ const str_lit = typed_value.val.castTag(.str_lit).?.data;
+ const mod = bin_file.options.module.?;
+ const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
+ try code.ensureUnusedCapacity(bytes.len + 1);
+ code.appendSliceAssumeCapacity(bytes);
+ if (typed_value.ty.sentinel()) |sent_val| {
+ const byte = @intCast(u8, sent_val.toUnsignedInt(target));
+ code.appendAssumeCapacity(byte);
+ }
return Result{ .appended = {} };
},
.aggregate => {