diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-06-30 14:18:06 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-30 14:18:06 +0530 |
commit | 4e92f38d2ced6cbc2c7ed13d79d739dd4ddadb4c (patch) | |
tree | 453f9f3efac02ac0efd5571853c0131a989626da | |
parent | 79c5b84eab4d2d848b52b521babb6d11c16ee17c (diff) |
perf(ext/web): avoid reallocations in op_base64_atob (#15018)
-rw-r--r-- | ext/web/lib.rs | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/ext/web/lib.rs b/ext/web/lib.rs index 9bc7c1cce..a80447614 100644 --- a/ext/web/lib.rs +++ b/ext/web/lib.rs @@ -124,25 +124,27 @@ pub fn init<P: TimersPermission + 'static>( #[op] fn op_base64_decode(input: String) -> Result<ZeroCopyBuf, AnyError> { - Ok(forgiving_base64_decode(input.into_bytes())?.into()) + let mut s = input.into_bytes(); + let decoded_len = forgiving_base64_decode(&mut s)?; + s.truncate(decoded_len); + Ok(s.into()) } #[op] -fn op_base64_atob(s: ByteString) -> Result<ByteString, AnyError> { - Ok(forgiving_base64_decode(s.into())?.into()) +fn op_base64_atob(mut s: ByteString) -> Result<ByteString, AnyError> { + let decoded_len = forgiving_base64_decode(&mut s)?; + s.truncate(decoded_len); + Ok(s) } /// See <https://infra.spec.whatwg.org/#forgiving-base64> -fn forgiving_base64_decode(mut input: Vec<u8>) -> Result<Vec<u8>, AnyError> { +#[inline] +fn forgiving_base64_decode(input: &mut [u8]) -> Result<usize, AnyError> { let error: _ = || DomExceptionInvalidCharacterError::new("Failed to decode base64"); - - let decoded = base64_simd::Base64::forgiving_decode_inplace(&mut input) + let decoded = base64_simd::Base64::forgiving_decode_inplace(input) .map_err(|_| error())?; - - let decoded_len = decoded.len(); - input.truncate(decoded_len); - Ok(input) + Ok(decoded.len()) } #[op] @@ -156,9 +158,10 @@ fn op_base64_btoa(s: ByteString) -> String { } /// See <https://infra.spec.whatwg.org/#forgiving-base64> +#[inline] fn forgiving_base64_encode(s: &[u8]) -> String { - let base64 = base64_simd::Base64::STANDARD; - base64.encode_to_boxed_str(s).into_string() + const BASE64_STANDARD: base64_simd::Base64 = base64_simd::Base64::STANDARD; + BASE64_STANDARD.encode_to_boxed_str(s).into_string() } #[derive(Deserialize)] |