From 64686b0cbfce3afa875196301d598fbd156f7a0a Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 15 Mar 2018 10:17:43 -0400 Subject: [PATCH] servo: Merge #20305 - Don't access the reflector when dropping a Promise (fixes #18651) (from servo:OMAE-WA-MOU-SHINDEIRU); r=jdm The reflector may be dead already. Source-Repo: https://github.com/servo/servo Source-Revision: 46a8e7184b949d3c03d3a66aa3a9d6fdf7156254 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : d8aa00ee41ad538aa1de0d556096c8b1d1238754 --- servo/components/script/dom/promise.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/servo/components/script/dom/promise.rs b/servo/components/script/dom/promise.rs index 20485618c18e..ef5eb1906d52 100644 --- a/servo/components/script/dom/promise.rs +++ b/servo/components/script/dom/promise.rs @@ -19,13 +19,13 @@ use dom::globalscope::GlobalScope; use dom::promisenativehandler::PromiseNativeHandler; use dom_struct::dom_struct; use js::conversions::ToJSValConvertible; -use js::jsapi::{CallOriginalPromiseResolve, CallOriginalPromiseReject}; -use js::jsapi::{JSAutoCompartment, CallArgs, JS_GetFunctionObject, JS_NewFunction}; -use js::jsapi::{JSContext, HandleValue, HandleObject, IsPromiseObject, GetFunctionNativeReserved}; -use js::jsapi::{JS_ClearPendingException, JSObject, AddRawValueRoot, RemoveRawValueRoot, PromiseState}; -use js::jsapi::{MutableHandleObject, NewPromiseObject, ResolvePromise, RejectPromise, GetPromiseState}; -use js::jsapi::{SetFunctionNativeReserved, NewFunctionWithReserved, AddPromiseReactions}; -use js::jsapi::Heap; +use js::jsapi::{AddPromiseReactions, AddRawValueRoot, CallArgs, CallOriginalPromiseReject}; +use js::jsapi::{CallOriginalPromiseResolve, GetFunctionNativeReserved, GetPromiseState}; +use js::jsapi::{HandleObject, HandleValue, Heap, IsPromiseObject, JS_ClearPendingException}; +use js::jsapi::{JSAutoCompartment, JSContext, JSObject, JS_GetContext, JS_GetFunctionObject}; +use js::jsapi::{JS_GetObjectRuntime, JS_NewFunction, MutableHandleObject}; +use js::jsapi::{NewFunctionWithReserved, NewPromiseObject, PromiseState, RejectPromise}; +use js::jsapi::{RemoveRawValueRoot, ResolvePromise, SetFunctionNativeReserved}; use js::jsval::{JSVal, UndefinedValue, ObjectValue, Int32Value}; use std::ptr; use std::rc::Rc; @@ -61,8 +61,13 @@ impl PromiseHelper for Rc { impl Drop for Promise { #[allow(unsafe_code)] fn drop(&mut self) { - let cx = self.global().get_cx(); unsafe { + let object = self.permanent_js_root.get().to_object(); + assert!(!object.is_null()); + let runtime = JS_GetObjectRuntime(object); + assert!(!runtime.is_null()); + let cx = JS_GetContext(runtime); + assert!(!cx.is_null()); RemoveRawValueRoot(cx, self.permanent_js_root.get_unsafe()); } }