diff options
Diffstat (limited to 'ops/lib.rs')
-rw-r--r-- | ops/lib.rs | 122 |
1 files changed, 56 insertions, 66 deletions
diff --git a/ops/lib.rs b/ops/lib.rs index 44f783280..8cd85f4f3 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -118,7 +118,7 @@ pub fn op(attr: TokenStream, item: TokenStream) -> TokenStream { let (has_fallible_fast_call, fast_impl, fast_field) = codegen_fast_impl(&core, &func, name, is_async, must_be_fast); - let (v8_body, argc) = if is_async { + let v8_body = if is_async { codegen_v8_async(&core, &func, margs, asyncness, deferred) } else { codegen_v8_sync(&core, &func, margs, has_fallible_fast_call) @@ -154,7 +154,6 @@ pub fn op(attr: TokenStream, item: TokenStream) -> TokenStream { is_async: #is_async, is_unstable: #is_unstable, is_v8: #is_v8, - argc: #argc, } } @@ -182,7 +181,7 @@ fn codegen_v8_async( margs: MacroArgs, asyncness: bool, deferred: bool, -) -> (TokenStream2, usize) { +) -> TokenStream2 { let MacroArgs { is_v8, .. } = margs; let special_args = f .sig @@ -195,7 +194,7 @@ fn codegen_v8_async( let rust_i0 = special_args.len(); let args_head = special_args.into_iter().collect::<TokenStream2>(); - let (arg_decls, args_tail, argc) = codegen_args(core, f, rust_i0, 1); + let (arg_decls, args_tail) = codegen_args(core, f, rust_i0, 1); let type_params = exclude_lifetime_params(&f.sig.generics.params); let (pre_result, mut result_fut) = match asyncness { @@ -226,47 +225,44 @@ fn codegen_v8_async( false => quote! { let result = Ok(result); }, }; - ( - quote! { - use #core::futures::FutureExt; - // SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime - let ctx = unsafe { - &*(#core::v8::Local::<#core::v8::External>::cast(args.data()).value() - as *const #core::_ops::OpCtx) - }; - let op_id = ctx.id; - - let promise_id = args.get(0); - let promise_id = #core::v8::Local::<#core::v8::Integer>::try_from(promise_id) - .map(|l| l.value() as #core::PromiseId) - .map_err(#core::anyhow::Error::from); - // Fail if promise id invalid (not an int) - let promise_id: #core::PromiseId = match promise_id { - Ok(promise_id) => promise_id, - Err(err) => { - #core::_ops::throw_type_error(scope, format!("invalid promise id: {}", err)); - return; - } - }; + quote! { + use #core::futures::FutureExt; + // SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime + let ctx = unsafe { + &*(#core::v8::Local::<#core::v8::External>::cast(args.data()).value() + as *const #core::_ops::OpCtx) + }; + let op_id = ctx.id; + + let promise_id = args.get(0); + let promise_id = #core::v8::Local::<#core::v8::Integer>::try_from(promise_id) + .map(|l| l.value() as #core::PromiseId) + .map_err(#core::anyhow::Error::from); + // Fail if promise id invalid (not an int) + let promise_id: #core::PromiseId = match promise_id { + Ok(promise_id) => promise_id, + Err(err) => { + #core::_ops::throw_type_error(scope, format!("invalid promise id: {}", err)); + return; + } + }; - #arg_decls + #arg_decls - // Track async call & get copy of get_error_class_fn - let get_class = { - let state = ::std::cell::RefCell::borrow(&ctx.state); - state.tracker.track_async(op_id); - state.get_error_class_fn - }; + // Track async call & get copy of get_error_class_fn + let get_class = { + let state = ::std::cell::RefCell::borrow(&ctx.state); + state.tracker.track_async(op_id); + state.get_error_class_fn + }; - #pre_result - #core::_ops::queue_async_op(ctx, scope, #deferred, async move { - let result = #result_fut - #result_wrapper - (promise_id, op_id, #core::_ops::to_op_result(get_class, result)) - }); - }, - argc, - ) + #pre_result + #core::_ops::queue_async_op(ctx, scope, #deferred, async move { + let result = #result_fut + #result_wrapper + (promise_id, op_id, #core::_ops::to_op_result(get_class, result)) + }); + } } fn scope_arg(arg: &FnArg) -> Option<TokenStream2> { @@ -520,7 +516,7 @@ fn codegen_v8_sync( f: &syn::ItemFn, margs: MacroArgs, has_fallible_fast_call: bool, -) -> (TokenStream2, usize) { +) -> TokenStream2 { let MacroArgs { is_v8, .. } = margs; let special_args = f .sig @@ -532,7 +528,7 @@ fn codegen_v8_sync( .collect::<Vec<_>>(); let rust_i0 = special_args.len(); let args_head = special_args.into_iter().collect::<TokenStream2>(); - let (arg_decls, args_tail, argc) = codegen_args(core, f, rust_i0, 0); + let (arg_decls, args_tail) = codegen_args(core, f, rust_i0, 0); let ret = codegen_sync_ret(core, &f.sig.output); let type_params = exclude_lifetime_params(&f.sig.generics.params); @@ -551,27 +547,24 @@ fn codegen_v8_sync( quote! {} }; - ( - quote! { - // SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime - let ctx = unsafe { - &*(#core::v8::Local::<#core::v8::External>::cast(args.data()).value() - as *const #core::_ops::OpCtx) - }; + quote! { + // SAFETY: #core guarantees args.data() is a v8 External pointing to an OpCtx for the isolates lifetime + let ctx = unsafe { + &*(#core::v8::Local::<#core::v8::External>::cast(args.data()).value() + as *const #core::_ops::OpCtx) + }; - #fast_error_handler - #arg_decls + #fast_error_handler + #arg_decls - let result = Self::call::<#type_params>(#args_head #args_tail); + let result = Self::call::<#type_params>(#args_head #args_tail); - // use RefCell::borrow instead of state.borrow to avoid clash with std::borrow::Borrow - let op_state = ::std::cell::RefCell::borrow(&*ctx.state); - op_state.tracker.track_sync(ctx.id); + // use RefCell::borrow instead of state.borrow to avoid clash with std::borrow::Borrow + let op_state = ::std::cell::RefCell::borrow(&*ctx.state); + op_state.tracker.track_sync(ctx.id); - #ret - }, - argc, - ) + #ret + } } struct FastApiSyn { @@ -810,15 +803,12 @@ fn is_fast_scalar( } } -/// (full declarations, idents, v8 argument count) -type ArgumentDecl = (TokenStream2, TokenStream2, usize); - fn codegen_args( core: &TokenStream2, f: &syn::ItemFn, rust_i0: usize, // Index of first generic arg in rust v8_i0: usize, // Index of first generic arg in v8/js -) -> ArgumentDecl { +) -> (TokenStream2, TokenStream2) { let inputs = &f.sig.inputs.iter().skip(rust_i0).enumerate(); let ident_seq: TokenStream2 = inputs .clone() @@ -833,7 +823,7 @@ fn codegen_args( codegen_arg(core, arg, format!("arg_{i}").as_ref(), v8_i0 + i) }) .collect(); - (decls, ident_seq, inputs.len()) + (decls, ident_seq) } fn codegen_arg( |