diff options
Diffstat (limited to 'ops/optimizer_tests')
31 files changed, 775 insertions, 6 deletions
diff --git a/ops/optimizer_tests/async_nop.expected b/ops/optimizer_tests/async_nop.expected index 78c161e8c..42a1180bd 100644 --- a/ops/optimizer_tests/async_nop.expected +++ b/ops/optimizer_tests/async_nop.expected @@ -3,6 +3,7 @@ returns_result: false has_ref_opstate: false has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value, I32] transforms: {} diff --git a/ops/optimizer_tests/async_result.expected b/ops/optimizer_tests/async_result.expected index dcd9cd1e3..be2e79ac0 100644 --- a/ops/optimizer_tests/async_result.expected +++ b/ops/optimizer_tests/async_result.expected @@ -2,7 +2,8 @@ returns_result: true has_ref_opstate: false has_rc_opstate: true -has_fast_callback_option: true +has_fast_callback_option: false +needs_fast_callback_option: true fast_result: None fast_parameters: [V8Value, I32, U32, Uint8Array] transforms: {2: Transform { kind: SliceU8(true), index: 2 }} diff --git a/ops/optimizer_tests/callback_options.expected b/ops/optimizer_tests/callback_options.expected index b309ab987..245fdfd55 100644 --- a/ops/optimizer_tests/callback_options.expected +++ b/ops/optimizer_tests/callback_options.expected @@ -2,7 +2,8 @@ returns_result: false has_ref_opstate: false has_rc_opstate: false -has_fast_callback_option: false +has_fast_callback_option: true +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value] transforms: {} diff --git a/ops/optimizer_tests/callback_options.out b/ops/optimizer_tests/callback_options.out index 020cc4a3e..81745375d 100644 --- a/ops/optimizer_tests/callback_options.out +++ b/ops/optimizer_tests/callback_options.out @@ -61,7 +61,7 @@ impl<'scope> deno_core::v8::fast_api::FastFunction for op_fallback_fast { 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] + &[V8Value, CallbackOptions] } fn return_type(&self) -> deno_core::v8::fast_api::CType { deno_core::v8::fast_api::CType::Void @@ -69,10 +69,13 @@ impl<'scope> deno_core::v8::fast_api::FastFunction for op_fallback_fast { } fn op_fallback_fast_fn<'scope>( _: deno_core::v8::Local<deno_core::v8::Object>, - options: Option<&mut FastApiCallbackOptions>, + fast_api_callback_options: *mut deno_core::v8::fast_api::FastApiCallbackOptions, ) -> () { use deno_core::v8; use deno_core::_ops; + let __opts: &mut v8::fast_api::FastApiCallbackOptions = unsafe { + &mut *fast_api_callback_options + }; let result = op_fallback::call(options); result } diff --git a/ops/optimizer_tests/op_blob_revoke_object_url.expected b/ops/optimizer_tests/op_blob_revoke_object_url.expected new file mode 100644 index 000000000..0fae25e86 --- /dev/null +++ b/ops/optimizer_tests/op_blob_revoke_object_url.expected @@ -0,0 +1 @@ +MustBeSingleSegment
\ No newline at end of file diff --git a/ops/optimizer_tests/op_blob_revoke_object_url.out b/ops/optimizer_tests/op_blob_revoke_object_url.out new file mode 100644 index 000000000..72bc75e05 --- /dev/null +++ b/ops/optimizer_tests/op_blob_revoke_object_url.out @@ -0,0 +1,71 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_blob_revoke_object_url::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_blob_revoke_object_url; +#[doc(hidden)] +impl op_blob_revoke_object_url { + pub fn name() -> &'static str { + stringify!(op_blob_revoke_object_url) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: None, + is_async: false, + is_unstable: false, + is_v8: false, + argc: 1usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn call(state: &mut deno_core::OpState, url: String) -> Result<(), AnyError> { + let url = Url::parse(&url)?; + let blob_store = state.borrow::<BlobStore>(); + blob_store.remove_object_url(&url); + Ok(()) + } + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + let arg_0 = match deno_core::v8::Local::< + deno_core::v8::String, + >::try_from(args.get(0usize as i32)) { + Ok(v8_string) => deno_core::serde_v8::to_utf8(v8_string, scope), + Err(_) => { + return deno_core::_ops::throw_type_error( + scope, + format!("Expected string at position {}", 0usize), + ); + } + }; + let result = Self::call(&mut std::cell::RefCell::borrow_mut(&ctx.state), arg_0); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match result { + Ok(result) => {} + Err(err) => { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + } + }; + } +} diff --git a/ops/optimizer_tests/op_blob_revoke_object_url.rs b/ops/optimizer_tests/op_blob_revoke_object_url.rs new file mode 100644 index 000000000..8e139da06 --- /dev/null +++ b/ops/optimizer_tests/op_blob_revoke_object_url.rs @@ -0,0 +1,9 @@ +pub fn op_blob_revoke_object_url( + state: &mut deno_core::OpState, + url: String, +) -> Result<(), AnyError> { + let url = Url::parse(&url)?; + let blob_store = state.borrow::<BlobStore>(); + blob_store.remove_object_url(&url); + Ok(()) +} diff --git a/ops/optimizer_tests/op_state.expected b/ops/optimizer_tests/op_state.expected index d8d680455..241ea7693 100644 --- a/ops/optimizer_tests/op_state.expected +++ b/ops/optimizer_tests/op_state.expected @@ -3,6 +3,7 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value, I32] transforms: {} diff --git a/ops/optimizer_tests/op_state_basic1.expected b/ops/optimizer_tests/op_state_basic1.expected index 6e7b15493..e325dd2f7 100644 --- a/ops/optimizer_tests/op_state_basic1.expected +++ b/ops/optimizer_tests/op_state_basic1.expected @@ -3,6 +3,7 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(U32) fast_parameters: [V8Value, U32, U32] transforms: {} diff --git a/ops/optimizer_tests/op_state_generics.expected b/ops/optimizer_tests/op_state_generics.expected index b78c81c5f..c29258d75 100644 --- a/ops/optimizer_tests/op_state_generics.expected +++ b/ops/optimizer_tests/op_state_generics.expected @@ -3,6 +3,7 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(Void) fast_parameters: [V8Value] transforms: {} diff --git a/ops/optimizer_tests/op_state_result.expected b/ops/optimizer_tests/op_state_result.expected index e13390052..15ac033f3 100644 --- a/ops/optimizer_tests/op_state_result.expected +++ b/ops/optimizer_tests/op_state_result.expected @@ -3,6 +3,7 @@ returns_result: true has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(U32) fast_parameters: [V8Value, U32, U32] transforms: {} diff --git a/ops/optimizer_tests/op_state_warning.expected b/ops/optimizer_tests/op_state_warning.expected index 94580fd6d..7b33ad1ef 100644 --- a/ops/optimizer_tests/op_state_warning.expected +++ b/ops/optimizer_tests/op_state_warning.expected @@ -3,6 +3,7 @@ returns_result: true has_ref_opstate: true has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(U32) fast_parameters: [V8Value] transforms: {} diff --git a/ops/optimizer_tests/op_state_with_transforms.expected b/ops/optimizer_tests/op_state_with_transforms.expected index 0fc9c9949..d6757801e 100644 --- a/ops/optimizer_tests/op_state_with_transforms.expected +++ b/ops/optimizer_tests/op_state_with_transforms.expected @@ -2,7 +2,8 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false -has_fast_callback_option: true +has_fast_callback_option: false +needs_fast_callback_option: true fast_result: Some(Void) fast_parameters: [V8Value, Uint8Array] transforms: {1: Transform { kind: SliceU8(true), index: 1 }} diff --git a/ops/optimizer_tests/opstate_with_arity.expected b/ops/optimizer_tests/opstate_with_arity.expected index 4be888c33..b38455d0d 100644 --- a/ops/optimizer_tests/opstate_with_arity.expected +++ b/ops/optimizer_tests/opstate_with_arity.expected @@ -3,6 +3,7 @@ returns_result: true has_ref_opstate: false has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(U32) fast_parameters: [V8Value, U32, U32, U32, U32] transforms: {} diff --git a/ops/optimizer_tests/option_arg.expected b/ops/optimizer_tests/option_arg.expected new file mode 100644 index 000000000..250ff1022 --- /dev/null +++ b/ops/optimizer_tests/option_arg.expected @@ -0,0 +1 @@ +FastUnsupportedParamType
\ No newline at end of file diff --git a/ops/optimizer_tests/option_arg.out b/ops/optimizer_tests/option_arg.out new file mode 100644 index 000000000..9f647765f --- /dev/null +++ b/ops/optimizer_tests/option_arg.out @@ -0,0 +1,66 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_try_close::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_try_close; +#[doc(hidden)] +impl op_try_close { + pub fn name() -> &'static str { + stringify!(op_try_close) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: None, + is_async: false, + is_unstable: false, + is_v8: false, + argc: 1usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn call(state: &mut OpState, rid: Option<ResourceId>) -> Result<(), Error> {} + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + let arg_0 = args.get(0usize as i32); + let arg_0 = match deno_core::serde_v8::from_v8(scope, arg_0) { + Ok(v) => v, + Err(err) => { + let msg = format!( + "Error parsing args at position {}: {}", 0usize, + deno_core::anyhow::Error::from(err) + ); + return deno_core::_ops::throw_type_error(scope, msg); + } + }; + let result = Self::call(&mut std::cell::RefCell::borrow_mut(&ctx.state), arg_0); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match result { + Ok(result) => {} + Err(err) => { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + } + }; + } +} diff --git a/ops/optimizer_tests/option_arg.rs b/ops/optimizer_tests/option_arg.rs new file mode 100644 index 000000000..47a02974d --- /dev/null +++ b/ops/optimizer_tests/option_arg.rs @@ -0,0 +1,6 @@ +pub fn op_try_close( + state: &mut OpState, + rid: Option<ResourceId>, +) -> Result<(), Error> { + // ... +} diff --git a/ops/optimizer_tests/raw_ptr.expected b/ops/optimizer_tests/raw_ptr.expected index 12577eb77..badd6e3f4 100644 --- a/ops/optimizer_tests/raw_ptr.expected +++ b/ops/optimizer_tests/raw_ptr.expected @@ -2,7 +2,8 @@ returns_result: false has_ref_opstate: true has_rc_opstate: false -has_fast_callback_option: true +has_fast_callback_option: false +needs_fast_callback_option: true fast_result: Some(Void) fast_parameters: [V8Value, Uint8Array, Uint32Array] transforms: {1: Transform { kind: PtrU8, index: 1 }, 2: Transform { kind: SliceU32(true), index: 2 }} diff --git a/ops/optimizer_tests/serde_v8_value.expected b/ops/optimizer_tests/serde_v8_value.expected index 058b17b1c..411fbec0b 100644 --- a/ops/optimizer_tests/serde_v8_value.expected +++ b/ops/optimizer_tests/serde_v8_value.expected @@ -3,6 +3,7 @@ returns_result: false has_ref_opstate: false has_rc_opstate: false has_fast_callback_option: false +needs_fast_callback_option: false fast_result: Some(Bool) fast_parameters: [V8Value, V8Value] transforms: {0: Transform { kind: V8Value, index: 0 }} diff --git a/ops/optimizer_tests/uint8array.expected b/ops/optimizer_tests/uint8array.expected new file mode 100644 index 000000000..0e5667a63 --- /dev/null +++ b/ops/optimizer_tests/uint8array.expected @@ -0,0 +1,11 @@ +=== Optimizer Dump === +returns_result: false +has_ref_opstate: false +has_rc_opstate: false +has_fast_callback_option: false +needs_fast_callback_option: true +fast_result: Some(Bool) +fast_parameters: [V8Value, Uint8Array, Uint8Array] +transforms: {0: Transform { kind: SliceU8(false), index: 0 }, 1: Transform { kind: SliceU8(true), index: 1 }} +is_async: false +fast_compatible: true diff --git a/ops/optimizer_tests/uint8array.out b/ops/optimizer_tests/uint8array.out new file mode 100644 index 000000000..90d420fa0 --- /dev/null +++ b/ops/optimizer_tests/uint8array.out @@ -0,0 +1,191 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_import_spki_x25519::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_import_spki_x25519; +#[doc(hidden)] +impl op_import_spki_x25519 { + pub fn name() -> &'static str { + stringify!(op_import_spki_x25519) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: Some( + Box::new(op_import_spki_x25519_fast { + _phantom: ::std::marker::PhantomData, + }), + ), + is_async: false, + is_unstable: false, + is_v8: false, + argc: 2usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn call(key_data: &[u8], out: &mut [u8]) -> bool {} + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + let arg_0 = { + let value = args.get(0usize as i32); + match deno_core::v8::Local::<deno_core::v8::ArrayBuffer>::try_from(value) { + Ok(b) => { + let byte_length = b.byte_length(); + if let Some(data) = b.data() { + let store = data.cast::<u8>().as_ptr(); + unsafe { ::std::slice::from_raw_parts_mut(store, byte_length) } + } else { + &mut [] + } + } + Err(_) => { + if let Ok(view) + = deno_core::v8::Local::< + deno_core::v8::ArrayBufferView, + >::try_from(value) { + let len = view.byte_length(); + let offset = view.byte_offset(); + let buffer = match view.buffer(scope) { + Some(v) => v, + None => { + return deno_core::_ops::throw_type_error( + scope, + format!("Expected ArrayBufferView at position {}", 0usize), + ); + } + }; + if let Some(data) = buffer.data() { + let store = data.cast::<u8>().as_ptr(); + unsafe { + ::std::slice::from_raw_parts_mut(store.add(offset), len) + } + } else { + &mut [] + } + } else { + return deno_core::_ops::throw_type_error( + scope, + format!("Expected ArrayBufferView at position {}", 0usize), + ); + } + } + } + }; + let arg_1 = { + let value = args.get(1usize as i32); + match deno_core::v8::Local::<deno_core::v8::ArrayBuffer>::try_from(value) { + Ok(b) => { + let byte_length = b.byte_length(); + if let Some(data) = b.data() { + let store = data.cast::<u8>().as_ptr(); + unsafe { ::std::slice::from_raw_parts_mut(store, byte_length) } + } else { + &mut [] + } + } + Err(_) => { + if let Ok(view) + = deno_core::v8::Local::< + deno_core::v8::ArrayBufferView, + >::try_from(value) { + let len = view.byte_length(); + let offset = view.byte_offset(); + let buffer = match view.buffer(scope) { + Some(v) => v, + None => { + return deno_core::_ops::throw_type_error( + scope, + format!("Expected ArrayBufferView at position {}", 1usize), + ); + } + }; + if let Some(data) = buffer.data() { + let store = data.cast::<u8>().as_ptr(); + unsafe { + ::std::slice::from_raw_parts_mut(store.add(offset), len) + } + } else { + &mut [] + } + } else { + return deno_core::_ops::throw_type_error( + scope, + format!("Expected ArrayBufferView at position {}", 1usize), + ); + } + } + } + }; + let result = Self::call(arg_0, arg_1); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match deno_core::serde_v8::to_v8(scope, result) { + Ok(ret) => rv.set(ret), + Err(err) => { + deno_core::_ops::throw_type_error( + scope, + format!( + "Error serializing return: {}", + deno_core::anyhow::Error::from(err) + ), + ) + } + }; + } +} +struct op_import_spki_x25519_fast { + _phantom: ::std::marker::PhantomData<()>, +} +impl<'scope> deno_core::v8::fast_api::FastFunction for op_import_spki_x25519_fast { + fn function(&self) -> *const ::std::ffi::c_void { + op_import_spki_x25519_fast_fn as *const ::std::ffi::c_void + } + 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] + } + fn return_type(&self) -> deno_core::v8::fast_api::CType { + deno_core::v8::fast_api::CType::Bool + } +} +fn op_import_spki_x25519_fast_fn<'scope>( + _: deno_core::v8::Local<deno_core::v8::Object>, + key_data: *const deno_core::v8::fast_api::FastApiTypedArray<u8>, + out: *const deno_core::v8::fast_api::FastApiTypedArray<u8>, + 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 result = op_import_spki_x25519::call(key_data, out); + result +} diff --git a/ops/optimizer_tests/uint8array.rs b/ops/optimizer_tests/uint8array.rs new file mode 100644 index 000000000..f4507b21f --- /dev/null +++ b/ops/optimizer_tests/uint8array.rs @@ -0,0 +1,3 @@ +pub fn op_import_spki_x25519(key_data: &[u8], out: &mut [u8]) -> bool { + // ... +} diff --git a/ops/optimizer_tests/unit_result.expected b/ops/optimizer_tests/unit_result.expected new file mode 100644 index 000000000..693a771e9 --- /dev/null +++ b/ops/optimizer_tests/unit_result.expected @@ -0,0 +1,11 @@ +=== Optimizer Dump === +returns_result: true +has_ref_opstate: false +has_rc_opstate: false +has_fast_callback_option: false +needs_fast_callback_option: false +fast_result: Some(Void) +fast_parameters: [V8Value] +transforms: {} +is_async: false +fast_compatible: true diff --git a/ops/optimizer_tests/unit_result.out b/ops/optimizer_tests/unit_result.out new file mode 100644 index 000000000..f9d1e0c34 --- /dev/null +++ b/ops/optimizer_tests/unit_result.out @@ -0,0 +1,113 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_unit_result::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_unit_result; +#[doc(hidden)] +impl op_unit_result { + pub fn name() -> &'static str { + stringify!(op_unit_result) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: Some( + Box::new(op_unit_result_fast { + _phantom: ::std::marker::PhantomData, + }), + ), + is_async: false, + is_unstable: false, + is_v8: false, + argc: 0usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + fn call() -> Result<(), AnyError> { + Ok(()) + } + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + { + let op_state = &mut std::cell::RefCell::borrow_mut(&ctx.state); + if let Some(err) = op_state.last_fast_op_error.take() { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + return; + } + } + let result = Self::call(); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match result { + Ok(result) => {} + Err(err) => { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + } + }; + } +} +struct op_unit_result_fast { + _phantom: ::std::marker::PhantomData<()>, +} +impl<'scope> deno_core::v8::fast_api::FastFunction for op_unit_result_fast { + fn function(&self) -> *const ::std::ffi::c_void { + op_unit_result_fast_fn as *const ::std::ffi::c_void + } + 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, CallbackOptions] + } + fn return_type(&self) -> deno_core::v8::fast_api::CType { + deno_core::v8::fast_api::CType::Void + } +} +fn op_unit_result_fast_fn<'scope>( + _: deno_core::v8::Local<deno_core::v8::Object>, + fast_api_callback_options: *mut deno_core::v8::fast_api::FastApiCallbackOptions, +) -> () { + use deno_core::v8; + use deno_core::_ops; + let __opts: &mut v8::fast_api::FastApiCallbackOptions = unsafe { + &mut *fast_api_callback_options + }; + let __ctx = unsafe { + &*(v8::Local::<v8::External>::cast(unsafe { __opts.data.data }).value() + as *const _ops::OpCtx) + }; + let op_state = &mut ::std::cell::RefCell::borrow_mut(&__ctx.state); + let result = op_unit_result::call(); + match result { + Ok(result) => result, + Err(err) => { + op_state.last_fast_op_error.replace(err); + __opts.fallback = true; + Default::default() + } + } +} diff --git a/ops/optimizer_tests/unit_result.rs b/ops/optimizer_tests/unit_result.rs new file mode 100644 index 000000000..207896929 --- /dev/null +++ b/ops/optimizer_tests/unit_result.rs @@ -0,0 +1,3 @@ +fn op_unit_result() -> Result<(), AnyError> { + Ok(()) +} diff --git a/ops/optimizer_tests/unit_result2.expected b/ops/optimizer_tests/unit_result2.expected new file mode 100644 index 000000000..d799a77b2 --- /dev/null +++ b/ops/optimizer_tests/unit_result2.expected @@ -0,0 +1,11 @@ +=== Optimizer Dump === +returns_result: true +has_ref_opstate: true +has_rc_opstate: false +has_fast_callback_option: false +needs_fast_callback_option: false +fast_result: Some(Void) +fast_parameters: [V8Value, U32, Bool] +transforms: {} +is_async: false +fast_compatible: true diff --git a/ops/optimizer_tests/unit_result2.out b/ops/optimizer_tests/unit_result2.out new file mode 100644 index 000000000..87e0ee0b5 --- /dev/null +++ b/ops/optimizer_tests/unit_result2.out @@ -0,0 +1,149 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_set_nodelay::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_set_nodelay; +#[doc(hidden)] +impl op_set_nodelay { + pub fn name() -> &'static str { + stringify!(op_set_nodelay) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: Some( + Box::new(op_set_nodelay_fast { + _phantom: ::std::marker::PhantomData, + }), + ), + is_async: false, + is_unstable: false, + is_v8: false, + argc: 2usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + pub fn call( + state: &mut OpState, + rid: ResourceId, + nodelay: bool, + ) -> Result<(), AnyError> { + super::check_unstable(state, "Deno.Conn#setNoDelay"); + let resource: Rc<TcpStreamResource> = state + .resource_table + .get::<TcpStreamResource>(rid)?; + resource.set_nodelay(nodelay) + } + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + { + let op_state = &mut std::cell::RefCell::borrow_mut(&ctx.state); + if let Some(err) = op_state.last_fast_op_error.take() { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + return; + } + } + let arg_0 = args.get(0usize as i32); + let arg_0 = match deno_core::serde_v8::from_v8(scope, arg_0) { + Ok(v) => v, + Err(err) => { + let msg = format!( + "Error parsing args at position {}: {}", 0usize, + deno_core::anyhow::Error::from(err) + ); + return deno_core::_ops::throw_type_error(scope, msg); + } + }; + let arg_1 = args.get(1usize as i32); + let arg_1 = match deno_core::serde_v8::from_v8(scope, arg_1) { + Ok(v) => v, + Err(err) => { + let msg = format!( + "Error parsing args at position {}: {}", 1usize, + deno_core::anyhow::Error::from(err) + ); + return deno_core::_ops::throw_type_error(scope, msg); + } + }; + let result = Self::call( + &mut std::cell::RefCell::borrow_mut(&ctx.state), + arg_0, + arg_1, + ); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match result { + Ok(result) => {} + Err(err) => { + let exception = deno_core::error::to_v8_error( + scope, + op_state.get_error_class_fn, + &err, + ); + scope.throw_exception(exception); + } + }; + } +} +struct op_set_nodelay_fast { + _phantom: ::std::marker::PhantomData<()>, +} +impl<'scope> deno_core::v8::fast_api::FastFunction for op_set_nodelay_fast { + fn function(&self) -> *const ::std::ffi::c_void { + op_set_nodelay_fast_fn as *const ::std::ffi::c_void + } + 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, Uint32, Bool, CallbackOptions] + } + fn return_type(&self) -> deno_core::v8::fast_api::CType { + deno_core::v8::fast_api::CType::Void + } +} +fn op_set_nodelay_fast_fn<'scope>( + _: deno_core::v8::Local<deno_core::v8::Object>, + rid: ResourceId, + nodelay: bool, + fast_api_callback_options: *mut deno_core::v8::fast_api::FastApiCallbackOptions, +) -> () { + use deno_core::v8; + use deno_core::_ops; + let __opts: &mut v8::fast_api::FastApiCallbackOptions = unsafe { + &mut *fast_api_callback_options + }; + let __ctx = unsafe { + &*(v8::Local::<v8::External>::cast(unsafe { __opts.data.data }).value() + as *const _ops::OpCtx) + }; + let state = &mut ::std::cell::RefCell::borrow_mut(&__ctx.state); + let result = op_set_nodelay::call(state, rid, nodelay); + match result { + Ok(result) => result, + Err(err) => { + state.last_fast_op_error.replace(err); + __opts.fallback = true; + Default::default() + } + } +} diff --git a/ops/optimizer_tests/unit_result2.rs b/ops/optimizer_tests/unit_result2.rs new file mode 100644 index 000000000..d3e8ced6a --- /dev/null +++ b/ops/optimizer_tests/unit_result2.rs @@ -0,0 +1,10 @@ +pub fn op_set_nodelay( + state: &mut OpState, + rid: ResourceId, + nodelay: bool, +) -> Result<(), AnyError> { + super::check_unstable(state, "Deno.Conn#setNoDelay"); + let resource: Rc<TcpStreamResource> = + state.resource_table.get::<TcpStreamResource>(rid)?; + resource.set_nodelay(nodelay) +} diff --git a/ops/optimizer_tests/unit_ret.expected b/ops/optimizer_tests/unit_ret.expected new file mode 100644 index 000000000..5d414e1e3 --- /dev/null +++ b/ops/optimizer_tests/unit_ret.expected @@ -0,0 +1,11 @@ +=== Optimizer Dump === +returns_result: false +has_ref_opstate: false +has_rc_opstate: false +has_fast_callback_option: false +needs_fast_callback_option: false +fast_result: Some(Void) +fast_parameters: [V8Value] +transforms: {} +is_async: false +fast_compatible: true diff --git a/ops/optimizer_tests/unit_ret.out b/ops/optimizer_tests/unit_ret.out new file mode 100644 index 000000000..c18fa1915 --- /dev/null +++ b/ops/optimizer_tests/unit_ret.out @@ -0,0 +1,84 @@ +#[allow(non_camel_case_types)] +///Auto-generated by `deno_ops`, i.e: `#[op]` +/// +///Use `op_unit::decl()` to get an op-declaration +///you can include in a `deno_core::Extension`. +pub struct op_unit; +#[doc(hidden)] +impl op_unit { + pub fn name() -> &'static str { + stringify!(op_unit) + } + pub fn v8_fn_ptr<'scope>() -> deno_core::v8::FunctionCallback { + use deno_core::v8::MapFnTo; + Self::v8_func.map_fn_to() + } + pub fn decl<'scope>() -> deno_core::OpDecl { + deno_core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr(), + enabled: true, + fast_fn: Some( + Box::new(op_unit_fast { + _phantom: ::std::marker::PhantomData, + }), + ), + is_async: false, + is_unstable: false, + is_v8: false, + argc: 0usize, + } + } + #[inline] + #[allow(clippy::too_many_arguments)] + fn call() -> () { + () + } + pub fn v8_func<'scope>( + scope: &mut deno_core::v8::HandleScope<'scope>, + args: deno_core::v8::FunctionCallbackArguments, + mut rv: deno_core::v8::ReturnValue, + ) { + let ctx = unsafe { + &*(deno_core::v8::Local::<deno_core::v8::External>::cast(args.data()).value() + as *const deno_core::_ops::OpCtx) + }; + let result = Self::call(); + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); + match deno_core::serde_v8::to_v8(scope, result) { + Ok(ret) => rv.set(ret), + Err(err) => { + deno_core::_ops::throw_type_error( + scope, + format!( + "Error serializing return: {}", + deno_core::anyhow::Error::from(err) + ), + ) + } + }; + } +} +struct op_unit_fast { + _phantom: ::std::marker::PhantomData<()>, +} +impl<'scope> deno_core::v8::fast_api::FastFunction for op_unit_fast { + fn function(&self) -> *const ::std::ffi::c_void { + op_unit_fast_fn as *const ::std::ffi::c_void + } + 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] + } + fn return_type(&self) -> deno_core::v8::fast_api::CType { + deno_core::v8::fast_api::CType::Void + } +} +fn op_unit_fast_fn<'scope>(_: deno_core::v8::Local<deno_core::v8::Object>) -> () { + use deno_core::v8; + use deno_core::_ops; + let result = op_unit::call(); + result +} diff --git a/ops/optimizer_tests/unit_ret.rs b/ops/optimizer_tests/unit_ret.rs new file mode 100644 index 000000000..4cf3651db --- /dev/null +++ b/ops/optimizer_tests/unit_ret.rs @@ -0,0 +1,3 @@ +fn op_unit() -> () { + () +} |