fix(selfhost/c_backend): handle backtick raw string literals
Backtick strings were emitted directly into C code without stripping the backticks or escaping the content, causing C syntax errors. Fix: detect backtick-wrapped literals in CBE_EmitExpr, strip the backticks, escape inner content, and wrap in double quotes.
This commit is contained in:
+13
-2
@@ -108,13 +108,24 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
|
||||
let slen: int = String_Len(s) as int;
|
||||
var start: int = 0;
|
||||
var end: int = slen;
|
||||
var isQuoted: bool = false;
|
||||
var isBacktick: bool = false;
|
||||
// If the literal is wrapped in quotes (from lexer), preserve outer quotes
|
||||
// and only escape the inner content.
|
||||
if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 {
|
||||
StringBuilder_Append(&cbe.sb, "\"");
|
||||
isQuoted = true;
|
||||
start = 1;
|
||||
end = slen - 1;
|
||||
}
|
||||
// Backtick raw string: strip backticks, escape inner content for C
|
||||
if slen >= 2 && s[0] == 96 as char8 && s[slen - 1] == 96 as char8 {
|
||||
isBacktick = true;
|
||||
start = 1;
|
||||
end = slen - 1;
|
||||
}
|
||||
if isQuoted || isBacktick {
|
||||
StringBuilder_Append(&cbe.sb, "\"");
|
||||
}
|
||||
var i: int = start;
|
||||
while i < end {
|
||||
let c: int = s[i] as int;
|
||||
@@ -133,7 +144,7 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 {
|
||||
if isQuoted || isBacktick {
|
||||
StringBuilder_Append(&cbe.sb, "\"");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user