summaryrefslogtreecommitdiff
path: root/ops/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ops/lib.rs')
-rw-r--r--ops/lib.rs21
1 files changed, 18 insertions, 3 deletions
diff --git a/ops/lib.rs b/ops/lib.rs
index 01548ad5f..7fb618425 100644
--- a/ops/lib.rs
+++ b/ops/lib.rs
@@ -6,7 +6,10 @@ use proc_macro_crate::crate_name;
use proc_macro_crate::FoundCrate;
use quote::quote;
use quote::ToTokens;
+use syn::punctuated::Punctuated;
+use syn::token::Comma;
use syn::FnArg;
+use syn::GenericParam;
use syn::Ident;
// Identifier to the `deno_core` crate.
@@ -71,7 +74,7 @@ pub fn op(attr: TokenStream, item: TokenStream) -> TokenStream {
let func = syn::parse::<syn::ItemFn>(item).expect("expected a function");
let name = &func.sig.ident;
let generics = &func.sig.generics;
- let type_params = &func.sig.generics.params;
+ let type_params = exclude_lifetime_params(&func.sig.generics.params);
let where_clause = &func.sig.generics.where_clause;
// Preserve the original func as op_foo::call()
@@ -152,7 +155,7 @@ fn codegen_v8_async(
};
let rust_i0 = if uses_opstate { 1 } else { 0 };
let (arg_decls, args_tail) = codegen_args(core, f, rust_i0, 1);
- let type_params = &f.sig.generics.params;
+ let type_params = exclude_lifetime_params(&f.sig.generics.params);
let result_wrapper = match is_result(&f.sig.output) {
true => quote! {},
@@ -234,7 +237,7 @@ fn codegen_v8_sync(
let (arg_decls, args_tail) = codegen_args(core, f, rust_i0, 0);
let ret = codegen_sync_ret(core, &f.sig.output);
- let type_params = &f.sig.generics.params;
+ let type_params = exclude_lifetime_params(&f.sig.generics.params);
quote! {
// SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime
@@ -379,9 +382,21 @@ fn is_rc_refcell_opstate(arg: &syn::FnArg) -> bool {
fn is_handle_scope(arg: &syn::FnArg) -> bool {
tokens(arg).ends_with(": & mut v8 :: HandleScope")
+ || tokens(arg).ends_with(": & mut v8 :: HandleScope < 'a >")
|| tokens(arg).ends_with(": & mut deno_core :: v8 :: HandleScope")
+ || tokens(arg).ends_with(": & mut deno_core :: v8 :: HandleScope < 'a >")
}
fn tokens(x: impl ToTokens) -> String {
x.to_token_stream().to_string()
}
+
+fn exclude_lifetime_params(
+ generic_params: &Punctuated<GenericParam, Comma>,
+) -> Punctuated<GenericParam, Comma> {
+ generic_params
+ .iter()
+ .filter(|t| !tokens(t).starts_with('\''))
+ .cloned()
+ .collect::<Punctuated<GenericParam, Comma>>()
+}