diff options
-rw-r--r-- | core/bindings.rs | 6 | ||||
-rw-r--r-- | core/runtime.rs | 20 |
2 files changed, 17 insertions, 9 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index 47dadf422..acf79a36e 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -285,7 +285,7 @@ pub extern "C" fn promise_reject_callback(message: v8::PromiseRejectMessage) { let mut state = state_rc.borrow_mut(); let promise = message.get_promise(); - let promise_id = promise.get_identity_hash(); + let promise_global = v8::Global::new(scope, promise); match message.get_event() { v8::PromiseRejectEvent::PromiseRejectWithNoHandler => { @@ -293,10 +293,10 @@ pub extern "C" fn promise_reject_callback(message: v8::PromiseRejectMessage) { let error_global = v8::Global::new(scope, error); state .pending_promise_exceptions - .insert(promise_id, error_global); + .insert(promise_global, error_global); } v8::PromiseRejectEvent::PromiseHandlerAddedAfterReject => { - state.pending_promise_exceptions.remove(&promise_id); + state.pending_promise_exceptions.remove(&promise_global); } v8::PromiseRejectEvent::PromiseRejectAfterResolved => {} v8::PromiseRejectEvent::PromiseResolveAfterResolved => { diff --git a/core/runtime.rs b/core/runtime.rs index 9766f71fa..e6e69636f 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -103,7 +103,8 @@ pub(crate) struct JsRuntimeState { pub(crate) shared_ab: Option<v8::Global<v8::SharedArrayBuffer>>, pub(crate) js_recv_cb: Option<v8::Global<v8::Function>>, pub(crate) js_macrotask_cb: Option<v8::Global<v8::Function>>, - pub(crate) pending_promise_exceptions: HashMap<i32, v8::Global<v8::Value>>, + pub(crate) pending_promise_exceptions: + HashMap<v8::Global<v8::Promise>, v8::Global<v8::Value>>, pending_dyn_mod_evaluate: HashMap<ModuleLoadId, DynImportModEvaluate>, pending_mod_evaluate: Option<ModEvaluate>, pub(crate) js_error_create_fn: Box<JsErrorCreateFn>, @@ -803,9 +804,9 @@ impl JsRuntime { ); let promise = v8::Local::<v8::Promise>::try_from(value) .expect("Expected to get promise as module evaluation result"); - let promise_id = promise.get_identity_hash(); + let promise_global = v8::Global::new(scope, promise); let mut state = state_rc.borrow_mut(); - state.pending_promise_exceptions.remove(&promise_id); + state.pending_promise_exceptions.remove(&promise_global); let promise_global = v8::Global::new(scope, promise); let module_global = v8::Global::new(scope, module); @@ -885,9 +886,9 @@ impl JsRuntime { ); let promise = v8::Local::<v8::Promise>::try_from(value) .expect("Expected to get promise as module evaluation result"); - let promise_id = promise.get_identity_hash(); + let promise_global = v8::Global::new(scope, promise); let mut state = state_rc.borrow_mut(); - state.pending_promise_exceptions.remove(&promise_id); + state.pending_promise_exceptions.remove(&promise_global); let promise_global = v8::Global::new(scope, promise); assert!( state.pending_mod_evaluate.is_none(), @@ -1385,7 +1386,14 @@ impl JsRuntime { return Ok(()); } - let key = { *state.pending_promise_exceptions.keys().next().unwrap() }; + let key = { + state + .pending_promise_exceptions + .keys() + .next() + .unwrap() + .clone() + }; let handle = state.pending_promise_exceptions.remove(&key).unwrap(); drop(state); |