summaryrefslogtreecommitdiff
path: root/ops/optimizer.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2023-03-31 21:16:25 +0530
committerGitHub <noreply@github.com>2023-03-31 17:46:25 +0200
commitfeab94ff512987a9a7e01f41d7a1788712b4247c (patch)
treefd968bed8e1b1a0f7d3f76182f41a213b7f2b944 /ops/optimizer.rs
parentb9a379093264da47368ea9665f685016fe35bfca (diff)
fix(ops): fallback when FastApiOneByteString is not utf8 (#18518)
Fixes https://github.com/denoland/deno/issues/18255
Diffstat (limited to 'ops/optimizer.rs')
-rw-r--r--ops/optimizer.rs29
1 files changed, 26 insertions, 3 deletions
diff --git a/ops/optimizer.rs b/ops/optimizer.rs
index 5a2be7a01..cc266c716 100644
--- a/ops/optimizer.rs
+++ b/ops/optimizer.rs
@@ -200,13 +200,33 @@ impl Transform {
*ty = parse_quote! { *const #core::v8::fast_api::FastApiOneByteString };
match str_ty {
StringType::Ref => q!(Vars { var: &ident }, {
- let var = unsafe { &*var }.as_str();
+ let var = match ::std::str::from_utf8(unsafe { &*var }.as_bytes()) {
+ Ok(v) => v,
+ Err(_) => {
+ unsafe { &mut *fast_api_callback_options }.fallback = true;
+ return Default::default();
+ }
+ };
}),
StringType::Cow => q!(Vars { var: &ident }, {
- let var = ::std::borrow::Cow::Borrowed(unsafe { &*var }.as_str());
+ let var = ::std::borrow::Cow::Borrowed(
+ match ::std::str::from_utf8(unsafe { &*var }.as_bytes()) {
+ Ok(v) => v,
+ Err(_) => {
+ unsafe { &mut *fast_api_callback_options }.fallback = true;
+ return Default::default();
+ }
+ },
+ );
}),
StringType::Owned => q!(Vars { var: &ident }, {
- let var = unsafe { &*var }.as_str().to_owned();
+ let var = match ::std::str::from_utf8(unsafe { &*var }.as_bytes()) {
+ Ok(v) => v.to_owned(),
+ Err(_) => {
+ unsafe { &mut *fast_api_callback_options }.fallback = true;
+ return Default::default();
+ }
+ };
}),
}
}
@@ -718,6 +738,7 @@ impl Optimizer {
let segment = single_segment(segments)?;
match segment {
PathSegment { ident, .. } if ident == "str" => {
+ self.needs_fast_callback_option = true;
self.fast_parameters.push(FastValue::SeqOneByteString);
assert!(self
.transforms
@@ -742,6 +763,7 @@ impl Optimizer {
if let Some(val) = get_fast_scalar(ident.to_string().as_str()) {
self.fast_parameters.push(val);
} else if ident == "String" {
+ self.needs_fast_callback_option = true;
// Is `T` an owned String?
self.fast_parameters.push(FastValue::SeqOneByteString);
assert!(self
@@ -775,6 +797,7 @@ impl Optimizer {
}
// Is `T` a str?
PathSegment { ident, .. } if ident == "str" => {
+ self.needs_fast_callback_option = true;
self.fast_parameters.push(FastValue::SeqOneByteString);
assert!(self
.transforms