summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-06-30 14:18:06 +0530
committerGitHub <noreply@github.com>2022-06-30 14:18:06 +0530
commit4e92f38d2ced6cbc2c7ed13d79d739dd4ddadb4c (patch)
tree453f9f3efac02ac0efd5571853c0131a989626da
parent79c5b84eab4d2d848b52b521babb6d11c16ee17c (diff)
perf(ext/web): avoid reallocations in op_base64_atob (#15018)
-rw-r--r--ext/web/lib.rs27
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)]