diff --git a/crates/nargo_cli/tests/execution_success/str_as_bytes/Nargo.toml b/crates/nargo_cli/tests/execution_success/str_as_bytes/Nargo.toml new file mode 100644 index 00000000000..31f7ab5d9b4 --- /dev/null +++ b/crates/nargo_cli/tests/execution_success/str_as_bytes/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "str_as_bytes" +type = "bin" +authors = [""] +compiler_version = "0.9.0" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/execution_success/str_as_bytes/src/main.nr b/crates/nargo_cli/tests/execution_success/str_as_bytes/src/main.nr new file mode 100644 index 00000000000..6890b156b15 --- /dev/null +++ b/crates/nargo_cli/tests/execution_success/str_as_bytes/src/main.nr @@ -0,0 +1,18 @@ +use dep::std; +fn main() { + let a = "hello"; + let b = a.as_bytes(); + assert(b[0]==104); + assert(b[1]==101); + assert(b[2]==108); + assert(b[3]==108); + assert(b[4]==111); + assert(b.len()==5); + let mut c = a.as_bytes_vec(); + assert(c.get(0)==104); + assert(c.get(1)==101); + assert(c.get(2)==108); + assert(c.get(3)==108); + assert(c.get(4)==111); + assert(c.len()==5); +} diff --git a/crates/noirc_evaluator/src/ssa/ir/instruction.rs b/crates/noirc_evaluator/src/ssa/ir/instruction.rs index 31521def27f..e09e21f158f 100644 --- a/crates/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/crates/noirc_evaluator/src/ssa/ir/instruction.rs @@ -41,6 +41,7 @@ pub(crate) enum Intrinsic { SlicePopFront, SliceInsert, SliceRemove, + StrAsBytes, Println, ToBits(Endian), ToRadix(Endian), @@ -60,6 +61,7 @@ impl std::fmt::Display for Intrinsic { Intrinsic::SlicePopFront => write!(f, "slice_pop_front"), Intrinsic::SliceInsert => write!(f, "slice_insert"), Intrinsic::SliceRemove => write!(f, "slice_remove"), + Intrinsic::StrAsBytes => write!(f, "str_as_bytes"), Intrinsic::ToBits(Endian::Big) => write!(f, "to_be_bits"), Intrinsic::ToBits(Endian::Little) => write!(f, "to_le_bits"), Intrinsic::ToRadix(Endian::Big) => write!(f, "to_be_radix"), @@ -84,6 +86,7 @@ impl Intrinsic { "slice_pop_front" => Some(Intrinsic::SlicePopFront), "slice_insert" => Some(Intrinsic::SliceInsert), "slice_remove" => Some(Intrinsic::SliceRemove), + "str_as_bytes" => Some(Intrinsic::StrAsBytes), "to_le_radix" => Some(Intrinsic::ToRadix(Endian::Little)), "to_be_radix" => Some(Intrinsic::ToRadix(Endian::Big)), "to_le_bits" => Some(Intrinsic::ToBits(Endian::Little)), diff --git a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs index 648bffd093a..e73ff02ba08 100644 --- a/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs +++ b/crates/noirc_evaluator/src/ssa/ir/instruction/call.rs @@ -165,6 +165,10 @@ pub(super) fn simplify_call( SimplifyResult::None } } + Intrinsic::StrAsBytes => { + // Strings are already represented as bytes internally + SimplifyResult::SimplifiedTo(arguments[0]) + } Intrinsic::AssertConstant => { if arguments.iter().all(|argument| dfg.is_constant(*argument)) { SimplifyResult::Remove diff --git a/noir_stdlib/Nargo.toml b/noir_stdlib/Nargo.toml index 29392dcc38a..9b7a79ad2a6 100644 --- a/noir_stdlib/Nargo.toml +++ b/noir_stdlib/Nargo.toml @@ -1,5 +1,6 @@ [package] name = "std" +type = "lib" authors = [""] compiler_version = "0.1" diff --git a/noir_stdlib/src/lib.nr b/noir_stdlib/src/lib.nr index d552ca44a29..f033334c140 100644 --- a/noir_stdlib/src/lib.nr +++ b/noir_stdlib/src/lib.nr @@ -15,6 +15,7 @@ mod unsafe; mod collections; mod compat; mod option; +mod string; // Oracle calls are required to be wrapped in an unconstrained function // Thus, the only argument to the `println` oracle is expected to always be an ident diff --git a/noir_stdlib/src/string.nr b/noir_stdlib/src/string.nr new file mode 100644 index 00000000000..e24bb567681 --- /dev/null +++ b/noir_stdlib/src/string.nr @@ -0,0 +1,11 @@ +use crate::collections::vec::Vec; +impl str { + /// Converts the given string into a byte array + #[builtin(str_as_bytes)] + fn as_bytes(_self: Self) -> [u8; N] { } + + /// return a byte vector of the str content + fn as_bytes_vec(self: Self) -> Vec { + Vec::from_slice(self.as_bytes().as_slice()) + } +} \ No newline at end of file