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;
|
let slen: int = String_Len(s) as int;
|
||||||
var start: int = 0;
|
var start: int = 0;
|
||||||
var end: int = slen;
|
var end: int = slen;
|
||||||
|
var isQuoted: bool = false;
|
||||||
|
var isBacktick: bool = false;
|
||||||
// If the literal is wrapped in quotes (from lexer), preserve outer quotes
|
// If the literal is wrapped in quotes (from lexer), preserve outer quotes
|
||||||
// and only escape the inner content.
|
// and only escape the inner content.
|
||||||
if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 {
|
if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 {
|
||||||
StringBuilder_Append(&cbe.sb, "\"");
|
isQuoted = true;
|
||||||
start = 1;
|
start = 1;
|
||||||
end = slen - 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;
|
var i: int = start;
|
||||||
while i < end {
|
while i < end {
|
||||||
let c: int = s[i] as int;
|
let c: int = s[i] as int;
|
||||||
@@ -133,7 +144,7 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
|
|||||||
}
|
}
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
}
|
}
|
||||||
if slen >= 2 && s[0] == 34 as char8 && s[slen - 1] == 34 as char8 {
|
if isQuoted || isBacktick {
|
||||||
StringBuilder_Append(&cbe.sb, "\"");
|
StringBuilder_Append(&cbe.sb, "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user