diff options
| author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-12-05 08:10:22 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-05 21:40:22 +0530 |
| commit | 55595ca1b74e07eb2365d5aec3861600e2266470 (patch) | |
| tree | 3d32d362e60b8c2b6fbf9e57f939afb8f52f42db /ops/lib.rs | |
| parent | 715f35d635bf5a4e972238e6ac8d290c0e096083 (diff) | |
fix(ops): disallow auto-borrowing OpState across potential await point (#16952)
Fixes https://github.com/denoland/deno/issues/16934
Example compiler error:
```
error: mutable opstate is not supported in async ops
--> core/ops_builtin.rs:122:1
|
122 | #[op]
| ^^^^^
|
= note: this error originates in the attribute macro `op` (in Nightly builds, run with -Z macro-backtrace for more info)
```
Diffstat (limited to 'ops/lib.rs')
| -rw-r--r-- | ops/lib.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/ops/lib.rs b/ops/lib.rs index 26fcb2a78..7fa800b14 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -193,7 +193,8 @@ fn codegen_v8_async( .inputs .iter() .map_while(|a| { - (if is_v8 { scope_arg(a) } else { None }).or_else(|| opstate_arg(a)) + (if is_v8 { scope_arg(a) } else { None }) + .or_else(|| rc_refcell_opstate_arg(a)) }) .collect::<Vec<_>>(); let rust_i0 = special_args.len(); @@ -291,6 +292,16 @@ fn opstate_arg(arg: &FnArg) -> Option<TokenStream2> { } } +fn rc_refcell_opstate_arg(arg: &FnArg) -> Option<TokenStream2> { + match arg { + arg if is_rc_refcell_opstate(arg) => Some(quote! { ctx.state.clone(), }), + arg if is_mut_ref_opstate(arg) => Some( + quote! { compile_error!("mutable opstate is not supported in async ops"), }, + ), + _ => None, + } +} + /// Generate the body of a v8 func for a sync op fn codegen_v8_sync( core: &TokenStream2, |
