From d581183cc6afea171dde2a851d6b5c742b2179a7 Mon Sep 17 00:00:00 2001 From: KtorZ Date: Sat, 9 Mar 2024 18:59:35 +0100 Subject: [PATCH] Fix formatter discarding nul bytes. --- CHANGELOG.md | 3 ++- crates/aiken-lang/src/format.rs | 1 + crates/aiken-lang/src/tests/format.rs | 12 ++++++++++++ .../src/tests/snapshots/format_nul_byte.snap | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 crates/aiken-lang/src/tests/snapshots/format_nul_byte.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c1ce44..8a710e10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - **aikup**: error message when version is not found. @rvcas - **aiken**: support outputting mainnet addresses for validators. @rvcas - **aiken-lang**: added serde to CheckedModule to encode modules as cbor. @rvcas +- **aiken-lang**: Strings can contain a nul byte using the escape sequence `\0`. @KtorZ ### Fixed @@ -32,7 +33,7 @@ - **aiken-lang**: disallow `MLResult` in a type definition. @rvcas - **aiken-lang**: reversed deserialization of bls types out of data types. @rvcas - **aiken-lang**: validator args unexpectedly unbound causing code gen crashes. @rvcas -- **aiken-lang**: allow implicitly discarded values when right-hand-side unified with `Void`. @KtorZ +- **aiken-lang**: allow implicitly discarded values when right-hand side unified with `Void`. @KtorZ ### Changed diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index 25caf3ec..8d0d8ad6 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -2138,6 +2138,7 @@ fn escape(string: &str) -> String { '\n' => vec!['\\', 'n'], '\r' => vec!['\\', 'r'], '\t' => vec!['\\', 't'], + '\0' => vec!['\\', '0'], '"' => vec!['\\', c], '\\' => vec!['\\', c], _ => vec![c], diff --git a/crates/aiken-lang/src/tests/format.rs b/crates/aiken-lang/src/tests/format.rs index d04dfc30..a26eb58b 100644 --- a/crates/aiken-lang/src/tests/format.rs +++ b/crates/aiken-lang/src/tests/format.rs @@ -20,6 +20,18 @@ fn format_simple_module() { ); } +#[test] +fn format_nul_byte() { + assert_format!( + r#" + fn label(str: String) -> Void { + str + |> builtin.append_string(@"\0", _) + |> builtin.debug(Void) + }"# + ); +} + #[test] fn format_g1_element_constant() { assert_format!( diff --git a/crates/aiken-lang/src/tests/snapshots/format_nul_byte.snap b/crates/aiken-lang/src/tests/snapshots/format_nul_byte.snap new file mode 100644 index 00000000..b2b84286 --- /dev/null +++ b/crates/aiken-lang/src/tests/snapshots/format_nul_byte.snap @@ -0,0 +1,9 @@ +--- +source: crates/aiken-lang/src/tests/format.rs +description: "Code:\n\nfn label(str: String) -> Void {\n str\n |> builtin.append_string(@\"\\0\", _)\n |> builtin.debug(Void)\n}" +--- +fn label(str: String) -> Void { + str + |> builtin.append_string(@"\0", _) + |> builtin.debug(Void) +}