Skip to content

Commit

Permalink
perf(punycode): avoid double allocation in decode_to_string (#894)
Browse files Browse the repository at this point in the history
* perf(punycode): avoid double allocation in decode_to_string

* include decode_to_string in tests
  • Loading branch information
bishopcheckmate authored Jan 10, 2024
1 parent 92f356e commit f447500
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
6 changes: 4 additions & 2 deletions idna/src/punycode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ fn adapt(mut delta: u32, num_points: u32, first_time: bool) -> u32 {

/// Convert Punycode to an Unicode `String`.
///
/// This is a convenience wrapper around `decode`.
/// Return None on malformed input or overflow.
/// Overflow can only happen on inputs that take more than
/// 63 encoded bytes, the DNS limit on domain name labels.
#[inline]
pub fn decode_to_string(input: &str) -> Option<String> {
decode(input).map(|chars| chars.into_iter().collect())
Some(Decoder::default().decode(input).ok()?.collect())
}

/// Convert Punycode to Unicode.
Expand Down
13 changes: 12 additions & 1 deletion idna/tests/punycode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// except according to those terms.

use crate::test::TestFn;
use idna::punycode::{decode, encode_str};
use idna::punycode::{decode, decode_to_string, encode_str};
use serde_json::map::Map;
use serde_json::Value;
use std::panic::catch_unwind;
Expand All @@ -28,6 +28,17 @@ fn one_test(decoded: &str, encoded: &str) {
}
}

match decode_to_string(encoded) {
None => panic!("Decoding {} failed.", encoded),
Some(result) => assert!(
result == decoded,
"Incorrect decoding of \"{}\":\n \"{}\"\n!= \"{}\"\n",
encoded,
result,
decoded
),
}

match encode_str(decoded) {
None => panic!("Encoding {} failed.", decoded),
Some(result) => assert!(
Expand Down

0 comments on commit f447500

Please sign in to comment.