From 5882c4a9340b7d691d53a9432ba67c85b3e2bd83 Mon Sep 17 00:00:00 2001 From: Arshia Ghafoori Date: Wed, 28 Feb 2024 14:43:27 +0330 Subject: [PATCH] Fix misuse of mozjs_sys::Handle --- runtime/src/event_loop/microtasks.rs | 7 +++++-- runtime/src/event_loop/mod.rs | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/runtime/src/event_loop/microtasks.rs b/runtime/src/event_loop/microtasks.rs index f85c4e25..c2589040 100644 --- a/runtime/src/event_loop/microtasks.rs +++ b/runtime/src/event_loop/microtasks.rs @@ -10,7 +10,7 @@ use std::ffi::c_void; use mozjs::glue::JobQueueTraps; use mozjs::jsapi::{CurrentGlobalOrNull, Handle, JobQueueIsEmpty, JobQueueMayNotBeEmpty, JSContext, JSFunction, JSObject}; -use ion::{Context, ErrorReport, Function, Object, TracedHeap}; +use ion::{Context, ErrorReport, Function, Local, Object, TracedHeap}; use crate::ContextExt; @@ -85,7 +85,10 @@ unsafe extern "C" fn enqueue_promise_job( let event_loop = unsafe { &mut cx.get_private().event_loop }; let microtasks = event_loop.microtasks.as_mut().unwrap(); if !job.is_null() { - microtasks.enqueue(cx, Microtask::Promise(TracedHeap::new(job.get()))) + microtasks.enqueue( + cx, + Microtask::Promise(TracedHeap::from_local(unsafe { &Local::from_raw_handle(job) })), + ) } else { microtasks.enqueue(cx, Microtask::None) }; diff --git a/runtime/src/event_loop/mod.rs b/runtime/src/event_loop/mod.rs index 4d0125af..b1b3143a 100644 --- a/runtime/src/event_loop/mod.rs +++ b/runtime/src/event_loop/mod.rs @@ -12,7 +12,7 @@ use std::task::Poll; use futures::future::poll_fn; use mozjs::jsapi::{Handle, JSContext, JSObject, PromiseRejectionHandlingState}; -use ion::{Context, ErrorReport, Promise, TracedHeap}; +use ion::{Context, ErrorReport, Local, Promise, TracedHeap}; use ion::format::{Config, format_value}; use crate::ContextExt; @@ -90,8 +90,9 @@ pub(crate) unsafe extern "C" fn promise_rejection_tracker_callback( ) { let cx = unsafe { &Context::new_unchecked(cx) }; let unhandled = &mut unsafe { cx.get_private() }.event_loop.unhandled_rejections; + let promise = unsafe { Local::from_raw_handle(promise) }; match state { - PromiseRejectionHandlingState::Unhandled => unhandled.push_back(TracedHeap::new(promise.get())), + PromiseRejectionHandlingState::Unhandled => unhandled.push_back(TracedHeap::from_local(&promise)), PromiseRejectionHandlingState::Handled => { let idx = unhandled.iter().position(|unhandled| unhandled.get() == promise.get()); if let Some(idx) = idx {