Fixed emitting escape sequences
This commit is contained in:
@@ -54,7 +54,13 @@ pub fn build_boot(src: &str) -> Result<Vec<String>, CompileError> {
|
|||||||
|
|
||||||
// Strings:
|
// Strings:
|
||||||
for (label, val) in state.strings.iter() {
|
for (label, val) in state.strings.iter() {
|
||||||
asm.push(format!("{}: .db \"{}\\0\"", label, val))
|
let cleaned = val.replace("\\", "\\\\")
|
||||||
|
.replace("\t","\\t")
|
||||||
|
.replace("\r","\\r")
|
||||||
|
.replace("\n","\\n")
|
||||||
|
.replace("\0","\\0")
|
||||||
|
.replace("\"","\\\"");
|
||||||
|
asm.push(format!("{}: .db \"{}\\0\"", label, cleaned))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global vars:
|
// Global vars:
|
||||||
@@ -217,4 +223,26 @@ mod test {
|
|||||||
"stack: .db 0",
|
"stack: .db 0",
|
||||||
].join("\n"))
|
].join("\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_string_escapes() {
|
||||||
|
let asm = build_boot("global a = \"\\\\foo\"; fn main() { }".into()).unwrap();
|
||||||
|
assert_eq!(asm.join("\n"), vec![
|
||||||
|
".org 0x400",
|
||||||
|
"push _forge_gensym_2",
|
||||||
|
"storew _forge_gensym_1",
|
||||||
|
"push stack",
|
||||||
|
"call _forge_gensym_3",
|
||||||
|
"hlt",
|
||||||
|
"_forge_gensym_3:", // fn main()
|
||||||
|
"dup", "pushr", "pushr", // capture pool / frame ptrs
|
||||||
|
"push 0", // Implicit return value
|
||||||
|
"_forge_gensym_4:", // Outro start
|
||||||
|
"popr", "pop", "popr", "pop", // Drop frame / pool ptrs
|
||||||
|
"ret",
|
||||||
|
"_forge_gensym_2: .db \"\\\\foo\\0\"", // here
|
||||||
|
"_forge_gensym_1: .db 0",
|
||||||
|
"stack: .db 0",
|
||||||
|
].join("\n"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user