script: Handle null contexts better during JS runtime shutdown. (#34769)

* script: Handle null contexts better during JS runtime shutdown.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>

* lock file

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

---------

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Co-authored-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
Josh Matthews 2024-12-26 03:23:27 -05:00 committed by GitHub
parent 981616f918
commit 4a6d2f8ff0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 41 additions and 30 deletions

View file

@ -93,8 +93,9 @@ impl Drop for CallbackObject {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let cx = Runtime::get();
RemoveRawValueRoot(cx, self.permanent_js_root.get_unsafe());
if let Some(cx) = Runtime::get() {
RemoveRawValueRoot(cx.as_ptr(), self.permanent_js_root.get_unsafe());
}
}
}
}

View file

@ -70,7 +70,9 @@ impl Clone for ServoJSPrincipals {
impl Drop for ServoJSPrincipals {
#[inline]
fn drop(&mut self) {
unsafe { JS_DropPrincipals(Runtime::get(), self.as_raw()) };
if let Some(cx) = Runtime::get() {
unsafe { JS_DropPrincipals(cx.as_ptr(), self.as_raw()) };
}
}
}

View file

@ -117,9 +117,9 @@ impl AutoIncumbentScript {
pub fn new(global: &GlobalScope) -> Self {
// Step 2-3.
unsafe {
let cx = Runtime::get();
assert!(!cx.is_null());
HideScriptedCaller(cx);
let cx =
Runtime::get().expect("Creating a new incumbent script after runtime shutdown");
HideScriptedCaller(cx.as_ptr());
}
STACK.with(|stack| {
trace!("Prepare to run a callback with {:p}", global);
@ -156,9 +156,9 @@ impl Drop for AutoIncumbentScript {
});
unsafe {
// Step 1-2.
let cx = Runtime::get();
assert!(!cx.is_null());
UnhideScriptedCaller(cx);
if let Some(cx) = Runtime::get() {
UnhideScriptedCaller(cx.as_ptr());
}
}
}
}
@ -174,9 +174,12 @@ pub fn incumbent_global() -> Option<DomRoot<GlobalScope>> {
// there's nothing on the JS stack, which will cause us to check the
// incumbent script stack below.
unsafe {
let cx = Runtime::get();
assert!(!cx.is_null());
let global = GetScriptedCallerGlobal(cx);
let Some(cx) = Runtime::get() else {
// It's not meaningful to return a global object if the runtime
// no longer exists.
return None;
};
let global = GetScriptedCallerGlobal(cx.as_ptr());
if !global.is_null() {
return Some(GlobalScope::from_object(global));
}