diff --git a/ext/flash/lib.rs b/ext/flash/lib.rs index 92490e0b8f..273aff02d3 100644 --- a/ext/flash/lib.rs +++ b/ext/flash/lib.rs @@ -373,11 +373,9 @@ unsafe fn op_flash_respond_fast( let ctx = &mut *(ptr as *mut ServerContext); let response = &*response; - if let Some(response) = response.get_storage_if_aligned() { - flash_respond(ctx, token, shutdown, response) - } else { - todo!(); - } + // Uint8Array is always byte-aligned. + let response = response.get_storage_if_aligned().unwrap_unchecked(); + flash_respond(ctx, token, shutdown, response) } macro_rules! get_request { diff --git a/ops/optimizer.rs b/ops/optimizer.rs index 82593d2473..7c19a7cfda 100644 --- a/ops/optimizer.rs +++ b/ops/optimizer.rs @@ -126,6 +126,10 @@ impl Transform { parse_quote! { *const #core::v8::fast_api::FastApiTypedArray }; q!(Vars { var: &ident }, { + // V8 guarantees that ArrayBuffers are always 4-byte aligned + // (seems to be always 8-byte aligned on 64-bit machines) + // but Deno FFI makes it possible to create ArrayBuffers at any + // alignment. Thus this check is needed. let var = match unsafe { &*var }.get_storage_if_aligned() { Some(v) => v, None => { @@ -141,17 +145,14 @@ impl Transform { parse_quote! { *const #core::v8::fast_api::FastApiTypedArray }; q!(Vars { var: &ident }, { - let var = match unsafe { &*var }.get_storage_if_aligned() { - Some(v) => v, - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; + // SAFETY: U8 slice is always byte-aligned. + let var = + unsafe { (&*var).get_storage_if_aligned().unwrap_unchecked() }; }) } TransformKind::WasmMemory => { // Note: `ty` is correctly set to __opts by the fast call tier. + // U8 slice is always byte-aligned. q!(Vars { var: &ident, core }, { let var = unsafe { &*(__opts.wasm_memory @@ -166,13 +167,10 @@ impl Transform { parse_quote! { *const #core::v8::fast_api::FastApiTypedArray }; q!(Vars { var: &ident }, { - let var = match unsafe { &*var }.get_storage_if_aligned() { - Some(v) => v.as_ptr(), - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; + // SAFETY: U8 slice is always byte-aligned. + let var = + unsafe { (&*var).get_storage_if_aligned().unwrap_unchecked() } + .as_ptr(); }) } } @@ -473,7 +471,6 @@ impl Optimizer { match segment { // Is `T` a u8? PathSegment { ident, .. } if ident == "u8" => { - self.needs_fast_callback_option = true; assert!(self .transforms .insert(index, Transform::wasm_memory(index)) @@ -608,7 +605,6 @@ impl Optimizer { match segment { // Is `T` a u8? PathSegment { ident, .. } if ident == "u8" => { - self.needs_fast_callback_option = true; self.fast_parameters.push(FastValue::Uint8Array); assert!(self .transforms @@ -645,7 +641,6 @@ impl Optimizer { match segment { // Is `T` a u8? PathSegment { ident, .. } if ident == "u8" => { - self.needs_fast_callback_option = true; self.fast_parameters.push(FastValue::Uint8Array); assert!(self .transforms diff --git a/ops/optimizer_tests/op_state_with_transforms.expected b/ops/optimizer_tests/op_state_with_transforms.expected index d6757801ee..f5f236b7d9 100644 --- a/ops/optimizer_tests/op_state_with_transforms.expected +++ b/ops/optimizer_tests/op_state_with_transforms.expected @@ -3,7 +3,7 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false -needs_fast_callback_option: true +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value, Uint8Array] transforms: {1: Transform { kind: SliceU8(true), index: 1 }} diff --git a/ops/optimizer_tests/op_state_with_transforms.out b/ops/optimizer_tests/op_state_with_transforms.out index 541a4fd36f..b2ded3c5a4 100644 --- a/ops/optimizer_tests/op_state_with_transforms.out +++ b/ops/optimizer_tests/op_state_with_transforms.out @@ -142,13 +142,7 @@ where as *const _ops::OpCtx) }; let state = &mut ::std::cell::RefCell::borrow_mut(&__ctx.state); - let buf = match unsafe { &*buf }.get_storage_if_aligned() { - Some(v) => v, - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; + let buf = unsafe { (&*buf).get_storage_if_aligned().unwrap_unchecked() }; let result = op_now::call::(state, buf); result } diff --git a/ops/optimizer_tests/raw_ptr.out b/ops/optimizer_tests/raw_ptr.out index f9f467ad9b..cf678ddb9d 100644 --- a/ops/optimizer_tests/raw_ptr.out +++ b/ops/optimizer_tests/raw_ptr.out @@ -169,13 +169,7 @@ where as *const _ops::OpCtx) }; let state = &mut ::std::cell::RefCell::borrow_mut(&__ctx.state); - let buf = match unsafe { &*buf }.get_storage_if_aligned() { - Some(v) => v.as_ptr(), - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; + let buf = unsafe { (&*buf).get_storage_if_aligned().unwrap_unchecked() }.as_ptr(); let out = match unsafe { &*out }.get_storage_if_aligned() { Some(v) => v, None => { diff --git a/ops/optimizer_tests/uint8array.expected b/ops/optimizer_tests/uint8array.expected index 0e5667a637..49554a2e83 100644 --- a/ops/optimizer_tests/uint8array.expected +++ b/ops/optimizer_tests/uint8array.expected @@ -3,7 +3,7 @@ returns_result: false has_ref_opstate: false has_rc_opstate: false has_fast_callback_option: false -needs_fast_callback_option: true +needs_fast_callback_option: false fast_result: Some(Bool) fast_parameters: [V8Value, Uint8Array, Uint8Array] transforms: {0: Transform { kind: SliceU8(false), index: 0 }, 1: Transform { kind: SliceU8(true), index: 1 }} diff --git a/ops/optimizer_tests/uint8array.out b/ops/optimizer_tests/uint8array.out index 90d420fa0d..bd7fa4d87e 100644 --- a/ops/optimizer_tests/uint8array.out +++ b/ops/optimizer_tests/uint8array.out @@ -158,7 +158,7 @@ impl<'scope> deno_core::v8::fast_api::FastFunction for op_import_spki_x25519_fas fn args(&self) -> &'static [deno_core::v8::fast_api::Type] { use deno_core::v8::fast_api::Type::*; use deno_core::v8::fast_api::CType; - &[V8Value, TypedArray(CType::Uint8), TypedArray(CType::Uint8), CallbackOptions] + &[V8Value, TypedArray(CType::Uint8), TypedArray(CType::Uint8)] } fn return_type(&self) -> deno_core::v8::fast_api::CType { deno_core::v8::fast_api::CType::Bool @@ -168,24 +168,11 @@ fn op_import_spki_x25519_fast_fn<'scope>( _: deno_core::v8::Local, key_data: *const deno_core::v8::fast_api::FastApiTypedArray, out: *const deno_core::v8::fast_api::FastApiTypedArray, - fast_api_callback_options: *mut deno_core::v8::fast_api::FastApiCallbackOptions, ) -> bool { use deno_core::v8; use deno_core::_ops; - let key_data = match unsafe { &*key_data }.get_storage_if_aligned() { - Some(v) => v, - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; - let out = match unsafe { &*out }.get_storage_if_aligned() { - Some(v) => v, - None => { - unsafe { &mut *fast_api_callback_options }.fallback = true; - return Default::default(); - } - }; + let key_data = unsafe { (&*key_data).get_storage_if_aligned().unwrap_unchecked() }; + let out = unsafe { (&*out).get_storage_if_aligned().unwrap_unchecked() }; let result = op_import_spki_x25519::call(key_data, out); result } diff --git a/ops/optimizer_tests/wasm_op.expected b/ops/optimizer_tests/wasm_op.expected index 98cfb4e7db..8d3719cf79 100644 --- a/ops/optimizer_tests/wasm_op.expected +++ b/ops/optimizer_tests/wasm_op.expected @@ -3,7 +3,7 @@ returns_result: false has_ref_opstate: false has_rc_opstate: false has_fast_callback_option: false -needs_fast_callback_option: true +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value] transforms: {0: Transform { kind: WasmMemory, index: 0 }}