From c8bd9615f43f7e33dcdd8056c9044fba7c4da2be Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 10:46:49 +0100 Subject: [PATCH 1/2] When calling constructors, retrieve the global object from the callee rather than the JSContext. --- .../script/dom/bindings/codegen/CodegenRust.py | 9 ++------- src/components/script/dom/bindings/utils.rs | 6 +++--- src/support/spidermonkey/rust-mozjs | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 7492723eca4..cb37bec5a8b 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4805,13 +4805,8 @@ class CGClassConstructHook(CGAbstractExternMethod): def generate_code(self): preamble = """ - //JSObject* obj = JS_GetGlobalForObject(cx, JSVAL_TO_OBJECT(JS_CALLEE(cx, vp))); - //XXXjdm Gecko obtains a GlobalObject from the global (maybe from the private value, - // or through unwrapping a slot or something). We'll punt and get the Window - // from the context for now. - let page = page_from_context(cx); - let frame = (*page).frame(); - let global = frame.get().get_ref().window.clone(); + let window = global_object_for_js_object(RUST_JSVAL_TO_OBJECT(JS_CALLEE(cx, &*vp))); + let global = JS::from_box(window); let obj = global.reflector().get_jsobject(); """ nativeName = MakeNativeName(self._ctor.identifier.name) diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index 22f10b65c47..adfcc3986c5 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -720,13 +720,13 @@ pub fn CreateDOMGlobal(cx: *JSContext, class: *JSClass) -> *JSObject { } /// Returns the global object of the realm that the given JS object was created in. -fn global_object_for_js_object(obj: *JSObject) -> *Box { +pub fn global_object_for_js_object(obj: *JSObject) -> *mut Box { unsafe { let global = GetGlobalForObjectCrossCompartment(obj); let clasp = JS_GetClass(global); assert!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)) != 0); // FIXME(jdm): Either don't hardcode or sanity assert prototype stuff. - match unwrap_object::<*Box>(global, PrototypeList::id::Window, 1) { + match unwrap_object::<*mut Box>(global, PrototypeList::id::Window, 1) { Ok(win) => win, Err(_) => fail!("found DOM global that doesn't unwrap to Window"), } @@ -745,7 +745,7 @@ fn cx_for_dom_reflector(obj: *JSObject) -> *JSContext { } /// Returns the global object of the realm that the given DOM object was created in. -pub fn global_object_for_dom_object(obj: &T) -> *Box { +pub fn global_object_for_dom_object(obj: &T) -> *mut Box { global_object_for_js_object(obj.reflector().get_jsobject()) } diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs index b04df09b61a..1730e6bf24f 160000 --- a/src/support/spidermonkey/rust-mozjs +++ b/src/support/spidermonkey/rust-mozjs @@ -1 +1 @@ -Subproject commit b04df09b61a68ed47e4829045804173fc849f370 +Subproject commit 1730e6bf24fdacb958061b8ee80d5289f7a7b496 From 99574f14d94dfabe96a96fdc010daf1707eb77d7 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 4 Mar 2014 11:41:46 +0100 Subject: [PATCH 2/2] Return a JS from global_object_for_{dom,js}_object. --- .../script/dom/bindings/codegen/CodegenRust.py | 3 +-- src/components/script/dom/bindings/utils.rs | 18 ++++++++---------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index cb37bec5a8b..41e86936385 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4805,8 +4805,7 @@ class CGClassConstructHook(CGAbstractExternMethod): def generate_code(self): preamble = """ - let window = global_object_for_js_object(RUST_JSVAL_TO_OBJECT(JS_CALLEE(cx, &*vp))); - let global = JS::from_box(window); + let global = global_object_for_js_object(RUST_JSVAL_TO_OBJECT(JS_CALLEE(cx, &*vp))); let obj = global.reflector().get_jsobject(); """ nativeName = MakeNativeName(self._ctor.identifier.name) diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index adfcc3986c5..b1787f1f071 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -720,32 +720,30 @@ pub fn CreateDOMGlobal(cx: *JSContext, class: *JSClass) -> *JSObject { } /// Returns the global object of the realm that the given JS object was created in. -pub fn global_object_for_js_object(obj: *JSObject) -> *mut Box { +pub fn global_object_for_js_object(obj: *JSObject) -> JS { unsafe { let global = GetGlobalForObjectCrossCompartment(obj); let clasp = JS_GetClass(global); assert!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)) != 0); // FIXME(jdm): Either don't hardcode or sanity assert prototype stuff. match unwrap_object::<*mut Box>(global, PrototypeList::id::Window, 1) { - Ok(win) => win, + Ok(win) => JS::from_box(win), Err(_) => fail!("found DOM global that doesn't unwrap to Window"), } } } fn cx_for_dom_reflector(obj: *JSObject) -> *JSContext { - unsafe { - let win = global_object_for_js_object(obj); - let js_info = (*win).data.page().js_info(); - match *js_info.get() { - Some(ref info) => info.js_context.borrow().ptr, - None => fail!("no JS context for DOM global") - } + let win = global_object_for_js_object(obj); + let js_info = win.get().page().js_info(); + match *js_info.get() { + Some(ref info) => info.js_context.borrow().ptr, + None => fail!("no JS context for DOM global") } } /// Returns the global object of the realm that the given DOM object was created in. -pub fn global_object_for_dom_object(obj: &T) -> *mut Box { +pub fn global_object_for_dom_object(obj: &T) -> JS { global_object_for_js_object(obj.reflector().get_jsobject()) }