diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-03-18 18:30:04 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-18 18:30:04 -0400 |
commit | 3c9771deb2d615c47a2570023039c6a71f1c774b (patch) | |
tree | 759ce45a956798ddae58108286eafee29414d913 /core/ops.rs | |
parent | a5ad3a44b5476909f12ae90501d8c7c451669be6 (diff) |
Reland "perf(core): preserve ops between snapshots (#18080)" (#18272)
Relanding 4b6305f4f25fc76f974bbdcc9cdb139d5ab8f5f4
Diffstat (limited to 'core/ops.rs')
-rw-r--r-- | core/ops.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/core/ops.rs b/core/ops.rs index ca465c821..3a276082f 100644 --- a/core/ops.rs +++ b/core/ops.rs @@ -19,10 +19,13 @@ use std::cell::RefCell; use std::ops::Deref; use std::ops::DerefMut; use std::pin::Pin; +use std::ptr::NonNull; use std::rc::Rc; use std::rc::Weak; use std::task::Context; use std::task::Poll; +use v8::fast_api::CFunctionInfo; +use v8::fast_api::CTypeInfo; /// Wrapper around a Future, which causes that Future to be polled immediately. /// @@ -155,11 +158,45 @@ pub struct OpCtx { pub id: OpId, pub state: Rc<RefCell<OpState>>, pub decl: Rc<OpDecl>, + pub fast_fn_c_info: Option<NonNull<v8::fast_api::CFunctionInfo>>, pub runtime_state: Weak<RefCell<JsRuntimeState>>, // Index of the current realm into `JsRuntimeState::known_realms`. pub realm_idx: RealmIdx, } +impl OpCtx { + pub fn new( + id: OpId, + realm_idx: RealmIdx, + decl: Rc<OpDecl>, + state: Rc<RefCell<OpState>>, + runtime_state: Weak<RefCell<JsRuntimeState>>, + ) -> Self { + let mut fast_fn_c_info = None; + + if let Some(fast_fn) = &decl.fast_fn { + let args = CTypeInfo::new_from_slice(fast_fn.args()); + let ret = CTypeInfo::new(fast_fn.return_type()); + + // SAFETY: all arguments are coming from the trait and they have + // static lifetime + let c_fn = unsafe { + CFunctionInfo::new(args.as_ptr(), fast_fn.args().len(), ret.as_ptr()) + }; + fast_fn_c_info = Some(c_fn); + } + + OpCtx { + id, + state, + runtime_state, + decl, + realm_idx, + fast_fn_c_info, + } + } +} + /// Maintains the resources and ops inside a JS runtime. pub struct OpState { pub resource_table: ResourceTable, |