diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-03-05 13:30:22 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-05 13:30:22 +0530 |
commit | 0910be4d64272be6774b8b3d44852737e8c53ad4 (patch) | |
tree | ef8dcbf2e5cf0c8940512923dec016dd2a30c762 /ops/lib.rs | |
parent | 888ceac7fdc6e9b96d860f183dd2f31df3f3d601 (diff) |
feat(ops): relational ops (#18023)
Join two independent ops into one. A fast impl of one + a slow callback
of another. Here's an example showing optimized paths for latin-1 via
fast call and the next-best fallback using V8 apis.
```rust
#[op(v8)]
fn op_encoding_encode_into_fallback(
scope: &mut v8::HandleScope,
input: serde_v8::Value,
// ...
#[op(fast, slow = op_encoding_encode_into_fallback)]
fn op_encoding_encode_into(
input: Cow<'_, str>,
// ...
```
Benchmark results of the fallback path:
```
time target/release/deno run -A --unstable ./cli/tests/testdata/benches/text_encoder_into_perf.js
________________________________________________________
Executed in 70.90 millis fish external
usr time 57.76 millis 0.23 millis 57.53 millis
sys time 17.02 millis 1.28 millis 15.74 millis
target/release/deno_main run -A --unstable ./cli/tests/testdata/benches/text_encoder_into_perf.js
________________________________________________________
Executed in 154.00 millis fish external
usr time 67.14 millis 0.26 millis 66.88 millis
sys time 38.82 millis 1.47 millis 37.35 millis
```
Diffstat (limited to 'ops/lib.rs')
-rw-r--r-- | ops/lib.rs | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/ops/lib.rs b/ops/lib.rs index 19667ab45..21812f605 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -111,24 +111,68 @@ impl Op { active, } = fast_call::generate(&core, &mut optimizer, &item); + let docline = format!("Use `{name}::decl()` to get an op-declaration"); + + let is_v8 = attrs.is_v8; + let is_unstable = attrs.is_unstable; + + if let Some(v8_fn) = attrs.relation { + return quote! { + #[allow(non_camel_case_types)] + #[doc="Auto-generated by `deno_ops`, i.e: `#[op]`"] + #[doc=""] + #[doc=#docline] + #[doc="you can include in a `deno_core::Extension`."] + pub struct #name; + + #[doc(hidden)] + impl #name { + pub fn name() -> &'static str { + stringify!(#name) + } + + pub fn v8_fn_ptr #generics () -> #core::v8::FunctionCallback #where_clause { + use #core::v8::MapFnTo; + #v8_fn::v8_func::<#type_params>.map_fn_to() + } + + pub fn decl #generics () -> #core::OpDecl #where_clause { + #core::OpDecl { + name: Self::name(), + v8_fn_ptr: Self::v8_fn_ptr::<#type_params>(), + enabled: true, + fast_fn: #decl, + is_async: #is_async, + is_unstable: #is_unstable, + is_v8: #is_v8, + argc: 0, + } + } + + #[inline] + #[allow(clippy::too_many_arguments)] + #orig + } + + #impl_and_fn + }; + } + let has_fallible_fast_call = active && optimizer.returns_result; let (v8_body, argc) = if is_async { + let deferred = attrs.deferred; codegen_v8_async( &core, &item, attrs, item.sig.asyncness.is_some(), - attrs.deferred, + deferred, ) } else { codegen_v8_sync(&core, &item, attrs, has_fallible_fast_call) }; - let is_v8 = attrs.is_v8; - let is_unstable = attrs.is_unstable; - - let docline = format!("Use `{name}::decl()` to get an op-declaration"); // Generate wrapper quote! { #[allow(non_camel_case_types)] |