diff options
author | bors-servo <release+servo@mozilla.com> | 2013-09-11 16:00:56 -0700 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2013-09-11 16:00:56 -0700 |
commit | 2372a841494dce56bc56467f2bcdb77ffa997cdd (patch) | |
tree | dceb9caf5af5db0a6cb3a7b64905bb8568394e03 /src/components/script | |
parent | 39252b25f792ae1b9c7e7d269083b18d29d9101a (diff) | |
parent | 636c30affeec0578a9ecb36adf9b6ec702d56bb9 (diff) | |
download | servo-2372a841494dce56bc56467f2bcdb77ffa997cdd.tar.gz servo-2372a841494dce56bc56467f2bcdb77ffa997cdd.zip |
auto merge of #908 : jdm/servo/gccrash, r=metajack
Diffstat (limited to 'src/components/script')
-rw-r--r-- | src/components/script/dom/bindings/codegen/Bindings.conf | 5 | ||||
-rw-r--r-- | src/components/script/dom/bindings/codegen/CodegenRust.py | 28 | ||||
-rw-r--r-- | src/components/script/dom/bindings/node.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/document.rs | 33 | ||||
-rw-r--r-- | src/components/script/dom/window.rs | 32 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 3 |
6 files changed, 65 insertions, 38 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 0ef1d9d502a..709509792e1 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -143,6 +143,7 @@ DOMInterfaces = { 'Document': { 'nativeType': 'AbstractDocument', 'pointerType': '', + 'customTrace': 'trace' }, 'DOMParser': { @@ -228,6 +229,7 @@ DOMInterfaces = { 'HTMLDocument': { 'nativeType': 'AbstractDocument', 'pointerType': '', + 'customTrace': 'trace' }, 'HTMLFormElement': { @@ -433,7 +435,8 @@ DOMInterfaces = { }], 'Window': { - 'createGlobal': True + 'createGlobal': True, + 'customTrace': 'trace' }, 'WindowProxy': { diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 0e01fcef059..44946cef991 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2221,13 +2221,13 @@ static Class_name: [u8, ..%i] = %s; static Class: DOMJSClass = DOMJSClass { base: JSClass { name: &Class_name as *u8 as *libc::c_char, flags: JSCLASS_IS_DOMJSCLASS | %s | (((%s) & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), //JSCLASS_HAS_RESERVED_SLOTS(%s), - addProperty: %s, /* addProperty */ - delProperty: crust::JS_PropertyStub, /* delProperty */ - getProperty: crust::JS_PropertyStub, /* getProperty */ - setProperty: crust::JS_StrictPropertyStub, /* setProperty */ - enumerate: crust::JS_EnumerateStub, - resolve: crust::JS_ResolveStub, - convert: crust::JS_ConvertStub, + addProperty: Some(%s), /* addProperty */ + delProperty: Some(crust::JS_PropertyStub), /* delProperty */ + getProperty: Some(crust::JS_PropertyStub), /* getProperty */ + setProperty: Some(crust::JS_StrictPropertyStub), /* setProperty */ + enumerate: Some(crust::JS_EnumerateStub), + resolve: Some(crust::JS_ResolveStub), + convert: Some(crust::JS_ConvertStub), finalize: Some(%s), /* finalize */ checkAccess: None, /* checkAccess */ call: None, /* call */ @@ -2269,13 +2269,13 @@ static PrototypeClassName__: [u8, ..%s] = %s; static PrototypeClass: JSClass = JSClass { name: &PrototypeClassName__ as *u8 as *libc::c_char, flags: (1 & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT, //JSCLASS_HAS_RESERVED_SLOTS(1) - addProperty: crust::JS_PropertyStub, /* addProperty */ - delProperty: crust::JS_PropertyStub, /* delProperty */ - getProperty: crust::JS_PropertyStub, /* getProperty */ - setProperty: crust::JS_StrictPropertyStub, /* setProperty */ - enumerate: crust::JS_EnumerateStub, - resolve: crust::JS_ResolveStub, - convert: crust::JS_ConvertStub, + addProperty: Some(crust::JS_PropertyStub), /* addProperty */ + delProperty: Some(crust::JS_PropertyStub), /* delProperty */ + getProperty: Some(crust::JS_PropertyStub), /* getProperty */ + setProperty: Some(crust::JS_StrictPropertyStub), /* setProperty */ + enumerate: Some(crust::JS_EnumerateStub), + resolve: Some(crust::JS_ResolveStub), + convert: Some(crust::JS_ConvertStub), finalize: None, /* finalize */ checkAccess: None, /* checkAccess */ call: None, /* call */ diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 05aff3793ca..a453d5d66c8 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -130,7 +130,7 @@ impl Traceable for Node<ScriptView> { } } } - error!("tracing %p?:", self.wrapper.get_wrapper()); + debug!("tracing %p?:", self.wrapper.get_wrapper()); trace_node(tracer, self.parent_node, "parent"); trace_node(tracer, self.first_child, "first child"); trace_node(tracer, self.last_child, "last child"); diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 51352b2faeb..4333ea5b934 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -5,6 +5,7 @@ use dom::bindings::codegen::DocumentBinding; use dom::bindings::utils::{DOMString, WrapperCache, ErrorResult, null_string, str}; use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box, DerivedWrapper}; +use dom::bindings::utils::Traceable; use dom::element::{Element}; use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId}; use dom::event::Event; @@ -18,13 +19,15 @@ use dom::window::Window; use dom::windowproxy::WindowProxy; use dom::htmltitleelement::HTMLTitleElement; use html::hubbub_html_parser::build_element_from_tag; -use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot, JSObject, JSContext, JSVal}; +use js::jsapi::{JSObject, JSContext, JSVal}; +use js::jsapi::{JSTRACE_OBJECT, JSTracer, JS_CallTracer}; use js::glue::RUST_OBJECT_TO_JSVAL; use servo_util::tree::TreeNodeRef; use std::cast; use std::ptr; use std::str::eq_slice; +use std::libc; pub trait WrappableDocument { fn init_wrapper(@mut self, cx: *JSContext); @@ -89,14 +92,6 @@ pub struct Document { impl Document { #[fixed_stack_segment] pub fn new(root: AbstractNode<ScriptView>, window: Option<@mut Window>, doctype: DocumentType) -> Document { - let compartment = unsafe {(*window.get_ref().page).js_info.get_ref().js_compartment }; - do root.with_base |base| { - assert!(base.wrapper.get_wrapper().is_not_null()); - let rootable = base.wrapper.get_rootable(); - unsafe { - JS_AddObjectRoot(compartment.cx.ptr, rootable); - } - } Document { root: root, wrapper: WrapperCache::new(), @@ -460,17 +455,23 @@ impl Document { window.content_changed() } } +} +impl Traceable for Document { #[fixed_stack_segment] - pub fn teardown(&self) { + fn trace(&self, tracer: *mut JSTracer) { unsafe { - let compartment = (*self.window.get_ref().page).js_info.get_ref().js_compartment; - do self.root.with_base |node| { - assert!(node.wrapper.get_wrapper().is_not_null()); - let rootable = node.wrapper.get_rootable(); - JS_RemoveObjectRoot(compartment.cx.ptr, rootable); + (*tracer).debugPrinter = ptr::null(); + (*tracer).debugPrintIndex = -1; + do "root".to_c_str().with_ref |name| { + (*tracer).debugPrintArg = name as *libc::c_void; + debug!("tracing root node"); + do self.root.with_base |node| { + JS_CallTracer(tracer as *JSTracer, + node.wrapper.wrapper, + JSTRACE_OBJECT as u32); + } } } } } - diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 00c4b63f539..e6164a96cb4 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::WindowBinding; -use dom::bindings::utils::{WrapperCache, DOMString, null_string}; +use dom::bindings::utils::{WrapperCache, DOMString, null_string, Traceable}; use dom::bindings::utils::{CacheableWrapper, BindingObject}; use dom::document::AbstractDocument; use dom::node::{AbstractNode, ScriptView}; @@ -14,8 +14,8 @@ use script_task::{ExitMsg, FireTimerMsg, Page, ScriptChan}; use servo_msg::compositor_msg::ScriptListener; use js::glue::*; -use js::jsapi::{JSObject, JSContext, JS_DefineProperty}; -use js::jsapi::{JSPropertyOp, JSStrictPropertyOp}; +use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JS_CallTracer}; +use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JSTracer, JSTRACE_OBJECT}; use js::{JSVAL_NULL, JSPROP_ENUMERATE}; use std::cast; @@ -25,6 +25,7 @@ use std::comm::SharedChan; use std::io; use std::ptr; use std::int; +use std::libc; use std::rt::rtio::RtioTimer; use std::rt::io::timer::Timer; use js::jsapi::JSVal; @@ -214,3 +215,28 @@ impl Window { } } +impl Traceable for Window { + #[fixed_stack_segment] + fn trace(&self, tracer: *mut JSTracer) { + debug!("tracing window"); + unsafe { + match (*self.page).frame { + Some(frame) => { + do frame.document.with_base |doc| { + (*tracer).debugPrinter = ptr::null(); + (*tracer).debugPrintIndex = -1; + do "document".to_c_str().with_ref |name| { + (*tracer).debugPrintArg = name as *libc::c_void; + debug!("tracing document"); + JS_CallTracer(tracer as *JSTracer, + doc.wrapper.wrapper, + JSTRACE_OBJECT as u32); + } + } + } + None => () + } + } + } +} + diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 9d45dc7d8dc..4025de24bb4 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -555,9 +555,6 @@ impl ScriptTask { fn handle_exit_msg(&mut self) { for page in self.page_tree.iter() { page.join_layout(); - do page.frame.unwrap().document.with_mut_base |doc| { - doc.teardown(); - } page.layout_chan.send(layout_interface::ExitMsg); } self.compositor.close(); |