diff options
Diffstat (limited to 'ops/lib.rs')
-rw-r--r-- | ops/lib.rs | 21 |
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>>() +} |