This commit is contained in:
agra
2026-02-12 16:23:42 +02:00
parent 1087bd1977
commit dab162bfe4
13 changed files with 1190 additions and 775 deletions

View File

@@ -2617,6 +2617,9 @@ pub const CodeGen = struct {
'0' => {
result[j] = 0;
},
'`' => {
result[j] = '`';
},
else => {
result[j] = raw[i];
},
@@ -2648,10 +2651,10 @@ pub const CodeGen = struct {
return c.LLVMConstInt(i1_type, if (lit.value) 1 else 0, 0);
},
.string_literal => |lit| {
const unescaped = try unescapeString(self.allocator, lit.raw);
const str_z = try self.allocator.dupeZ(u8, unescaped);
const content = if (lit.is_raw) lit.raw else try unescapeString(self.allocator, lit.raw);
const str_z = try self.allocator.dupeZ(u8, content);
const ptr = c.LLVMBuildGlobalStringPtr(self.builder, str_z.ptr, "str");
return self.buildStringSlice(ptr, @intCast(unescaped.len));
return self.buildStringSlice(ptr, @intCast(content.len));
},
.identifier => |ident| {
if (self.named_values.get(ident.name)) |entry| {
@@ -3251,8 +3254,9 @@ pub const CodeGen = struct {
// String literal → pointer context: produce raw pointer directly (no {ptr, len} wrapping)
if (node.data == .string_literal and target_ty.isPointer()) {
const unescaped = try unescapeString(self.allocator, node.data.string_literal.raw);
const str_z = try self.allocator.dupeZ(u8, unescaped);
const lit = node.data.string_literal;
const content = if (lit.is_raw) lit.raw else try unescapeString(self.allocator, lit.raw);
const str_z = try self.allocator.dupeZ(u8, content);
return c.LLVMBuildGlobalStringPtr(self.builder, str_z.ptr, "str");
}
@@ -5329,13 +5333,14 @@ pub const CodeGen = struct {
if (self.comptime_param_nodes) |cpn| {
if (cpn.get(param.name)) |node| {
if (node.data == .string_literal) {
const raw = node.data.string_literal.raw;
const inner = if (raw.len >= 2 and raw[0] == '"' and raw[raw.len - 1] == '"')
const slit = node.data.string_literal;
const raw = slit.raw;
const inner = if (!slit.is_raw and raw.len >= 2 and raw[0] == '"' and raw[raw.len - 1] == '"')
raw[1 .. raw.len - 1]
else
raw;
const unescaped = try unescapeString(self.allocator, inner);
const str_val = self.buildConstStr(unescaped);
const content = if (slit.is_raw) inner else try unescapeString(self.allocator, inner);
const str_val = self.buildConstStr(content);
const param_name_z = try self.allocator.dupeZ(u8, param.name);
const alloca = c.LLVMBuildAlloca(self.builder, self.getStringStructType(), param_name_z.ptr);
_ = c.LLVMBuildStore(self.builder, str_val, alloca);