From f40f7564407c1378e0118a621eff782666536fc2 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Sat, 27 Jun 2026 13:17:39 +0300 Subject: [PATCH] string_lit_as_bytes --- Cargo.toml | 1 + crates/common/src/int.rs | 4 ++-- crates/stdlib/src/json.rs | 16 ++++++++-------- crates/vm/src/builtins/bytes.rs | 13 +++++++++++++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 41432a98b..0f7591e82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -369,6 +369,7 @@ redundant_clone = "warn" search_is_some = "warn" significant_drop_in_scrutinee = "warn" single_option_map = "warn" +string_lit_as_bytes = "warn" trait_duplication_in_bounds = "warn" type_repetition_in_bounds = "warn" unnecessary_struct_initialization = "warn" diff --git a/crates/common/src/int.rs b/crates/common/src/int.rs index 0a8f054bf..8efbef698 100644 --- a/crates/common/src/int.rs +++ b/crates/common/src/int.rs @@ -195,7 +195,7 @@ mod tests { fn bytes_to_int_invalid_base() { for base in [1, 37] { assert_eq!( - bytes_to_int("012345".as_bytes(), base, DIGIT_LIMIT), + bytes_to_int(b"012345", base, DIGIT_LIMIT), Err(BytesToIntError::InvalidBase) ) } @@ -204,7 +204,7 @@ mod tests { #[test] fn bytes_to_int_digit_limit() { assert_eq!( - bytes_to_int("012345".as_bytes(), 10, 5), + bytes_to_int(b"012345", 10, 5), Err(BytesToIntError::DigitLimit { got: 6, limit: 5 }) ); } diff --git a/crates/stdlib/src/json.rs b/crates/stdlib/src/json.rs index dc2fbbc88..b3b70acc9 100644 --- a/crates/stdlib/src/json.rs +++ b/crates/stdlib/src/json.rs @@ -146,7 +146,7 @@ mod _json { macro_rules! parse_const { ($s:literal, $val:expr) => { - if rest.starts_with($s.as_bytes()) { + if rest.starts_with($s) { return Ok(PyIterReturn::Return( vm.new_tuple(($val, char_idx + $s.len())).into(), )); @@ -154,9 +154,9 @@ mod _json { }; } - parse_const!("null", vm.ctx.none()); - parse_const!("true", true); - parse_const!("false", false); + parse_const!(b"null", vm.ctx.none()); + parse_const!(b"true", true); + parse_const!(b"false", false); if let Some((res, len)) = self.parse_number(rest, vm) { return Ok(PyIterReturn::Return( @@ -166,7 +166,7 @@ mod _json { macro_rules! parse_constant { ($s:literal) => { - if rest.starts_with($s.as_bytes()) { + if rest.starts_with($s) { return Ok(PyIterReturn::Return( vm.new_tuple(( self.parse_constant.call(($s,), vm)?, @@ -178,9 +178,9 @@ mod _json { }; } - parse_constant!("NaN"); - parse_constant!("Infinity"); - parse_constant!("-Infinity"); + parse_constant!(b"NaN"); + parse_constant!(b"Infinity"); + parse_constant!(b"-Infinity"); Ok(PyIterReturn::StopIteration(Some( vm.ctx.new_int(char_idx).into(), diff --git a/crates/vm/src/builtins/bytes.rs b/crates/vm/src/builtins/bytes.rs index f28e8ddbb..00a5e95f4 100644 --- a/crates/vm/src/builtins/bytes.rs +++ b/crates/vm/src/builtins/bytes.rs @@ -60,6 +60,18 @@ impl ToPyObject for Vec { } } +impl ToPyObject for [u8; N] { + fn to_pyobject(self, vm: &VirtualMachine) -> PyObjectRef { + vm.ctx.new_bytes(self.into()).into() + } +} + +impl ToPyObject for &[u8; N] { + fn to_pyobject(self, vm: &VirtualMachine) -> PyObjectRef { + vm.ctx.new_bytes(self.into()).into() + } +} + impl Deref for PyBytes { type Target = [u8]; @@ -73,6 +85,7 @@ impl AsRef<[u8]> for PyBytes { self.as_bytes() } } + impl AsRef<[u8]> for PyBytesRef { fn as_ref(&self) -> &[u8] { self.as_bytes()