aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-06-03 05:26:26 -0500
committerbors-servo <metajack+bors@gmail.com>2015-06-03 05:26:26 -0500
commit9edc296c46b05606c74920a42ba0effb5c953db0 (patch)
treeb078c94e429a3f5ce26f7fd4e4e0ec0c7ba9c1a6
parentbb95e07f8e75663706f9077138912c4e06c3eac9 (diff)
parent453679fd1f3ffaa3bb4e292b3c73bebc9bd3e31d (diff)
downloadservo-9edc296c46b05606c74920a42ba0effb5c953db0.tar.gz
servo-9edc296c46b05606c74920a42ba0effb5c953db0.zip
Auto merge of #6247 - jdm:tracefix, r=Ms2ger
This should allow the jQuery testsuite to complete. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6247) <!-- Reviewable:end -->
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py8
-rw-r--r--components/script/dom/bindings/utils.rs13
2 files changed, 18 insertions, 3 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 9f965a9c7e8..ebc5ec4e069 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -4166,9 +4166,13 @@ class CGClassTraceHook(CGAbstractClassHook):
args = [Argument('*mut JSTracer', 'trc'), Argument('*mut JSObject', 'obj')]
CGAbstractClassHook.__init__(self, descriptor, TRACE_HOOK_NAME, 'void',
args)
+ self.traceGlobal = descriptor.isGlobal()
def generate_code(self):
- return CGGeneric("(*this).trace(%s);" % self.args[0].name)
+ body = [CGGeneric("(*this).trace(%s);" % self.args[0].name)]
+ if self.traceGlobal:
+ body += [CGGeneric("trace_global(trc, obj);")]
+ return CGList(body, "\n")
class CGClassConstructHook(CGAbstractExternMethod):
"""
@@ -4770,7 +4774,7 @@ class CGBindingRoot(CGThing):
'dom::bindings::utils::{DOMJSClass, JSCLASS_DOM_GLOBAL}',
'dom::bindings::utils::{find_enum_string_index, get_array_index_from_id}',
'dom::bindings::utils::{get_property_on_prototype, get_proto_or_iface_array}',
- 'dom::bindings::utils::finalize_global',
+ 'dom::bindings::utils::{finalize_global, trace_global}',
'dom::bindings::utils::has_property_on_prototype',
'dom::bindings::utils::is_platform_object',
'dom::bindings::utils::{Reflectable}',
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index f53451352cc..e7db5ce70ee 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -10,6 +10,7 @@ use dom::bindings::conversions::{native_from_reflector_jsmanaged, is_dom_class};
use dom::bindings::error::{Error, ErrorResult, Fallible, throw_type_error};
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{Temporary, Root, Rootable};
+use dom::bindings::trace::trace_object;
use dom::browsercontext;
use dom::window;
use util::namespace;
@@ -26,7 +27,7 @@ use js::glue::{IsWrapper, RUST_JSID_IS_INT, RUST_JSID_TO_INT};
use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewFunction};
use js::jsapi::{JS_DefineProperties, JS_ForwardGetPropertyTo};
use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype, JS_GetStringCharsAndLength};
-use js::jsapi::JSHandleObject;
+use js::jsapi::{JSHandleObject, JSTracer};
use js::jsapi::JS_GetFunctionObject;
use js::jsapi::{JS_HasPropertyById, JS_GetPrototype};
use js::jsapi::{JS_GetProperty, JS_HasProperty, JS_SetProperty};
@@ -596,6 +597,16 @@ pub unsafe fn finalize_global(obj: *mut JSObject) {
Box::from_raw(get_proto_or_iface_array(obj) as *mut ProtoOrIfaceArray);
}
+/// Trace the resources held by reserved slots of a global object
+pub unsafe fn trace_global(tracer: *mut JSTracer, obj: *mut JSObject) {
+ let array = get_proto_or_iface_array(obj) as *mut ProtoOrIfaceArray;
+ for &proto in (*array).iter() {
+ if !proto.is_null() {
+ trace_object(tracer, "prototype", proto);
+ }
+ }
+}
+
/// Callback to outerize windows when wrapping.
pub unsafe extern fn wrap_for_same_compartment(cx: *mut JSContext, obj: *mut JSObject) -> *mut JSObject {
JS_ObjectToOuterObject(cx, obj)