diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 37f147c4693..ddf16b9c2ab 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -41,6 +41,7 @@ use script_traits::ScriptControlChan; use std::collections::hashmap::HashMap; use collections::hash::Hash; use style::PropertyDeclarationBlock; +use std::comm::{Receiver, Sender}; use string_cache::{Atom, Namespace}; impl JSTraceable for JS { @@ -238,3 +239,16 @@ impl<'a> JSTraceable for &'a str { } } +impl JSTraceable for Sender { + #[inline] + fn trace(&self, _: *mut JSTracer) { + // Do nothing + } +} + +impl JSTraceable for Receiver { + #[inline] + fn trace(&self, _: *mut JSTracer) { + // Do nothing + } +} diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index d043bde2b62..cd873c39930 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -9,7 +9,6 @@ use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast}; use dom::bindings::global; use dom::bindings::js::{JSRef, Temporary, RootCollection}; -use dom::bindings::trace::Untraceable; use dom::bindings::utils::{Reflectable, Reflector}; use dom::eventtarget::{EventTarget, EventTargetHelpers}; use dom::eventtarget::WorkerGlobalScopeTypeId; @@ -40,10 +39,10 @@ use url::Url; #[must_root] pub struct DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope, - receiver: Untraceable>, + receiver: Receiver, /// Sender to the parent thread. parent_sender: ScriptChan, - worker: Untraceable, + worker: TrustedWorkerAddress, } impl DedicatedWorkerGlobalScope { @@ -59,9 +58,9 @@ impl DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope::new_inherited( DedicatedGlobalScope, worker_url, cx, resource_task, own_sender), - receiver: Untraceable::new(receiver), + receiver: receiver, parent_sender: parent_sender, - worker: Untraceable::new(worker), + worker: worker, } } @@ -120,7 +119,7 @@ impl DedicatedWorkerGlobalScope { let target: JSRef = EventTargetCast::from_ref(*global); loop { - match global.receiver.deref().recv_opt() { + match global.receiver.recv_opt() { Ok(DOMMessage(data, nbytes)) => { let mut message = UndefinedValue(); unsafe { @@ -160,7 +159,7 @@ impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalSc } let ScriptChan(ref sender) = self.parent_sender; - sender.send(WorkerPostMessage(*self.worker, data, nbytes)); + sender.send(WorkerPostMessage(self.worker, data, nbytes)); } fn GetOnmessage(self) -> Option { @@ -181,7 +180,7 @@ trait PrivateDedicatedWorkerGlobalScopeHelpers { impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> { fn delayed_release_worker(self) { let ScriptChan(ref sender) = self.parent_sender; - sender.send(WorkerRelease(*self.worker)); + sender.send(WorkerRelease(self.worker)); } } diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 04bac9e2c9a..4941a1c6a35 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -9,6 +9,7 @@ use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::error::{Fallible, Syntax}; use dom::bindings::global::{GlobalRef, GlobalField}; use dom::bindings::js::{JS, JSRef, Temporary}; +use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::eventtarget::{EventTarget, EventTargetHelpers, WorkerTypeId}; @@ -18,7 +19,7 @@ use script_task::{ScriptChan, DOMMessage}; use servo_util::str::DOMString; use js::glue::JS_STRUCTURED_CLONE_VERSION; -use js::jsapi::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot}; +use js::jsapi::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot, JSTracer}; use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone}; use js::jsval::{JSVal, UndefinedValue}; use url::UrlParser; @@ -28,6 +29,7 @@ use std::cell::Cell; use std::ptr; pub struct TrustedWorkerAddress(pub *const c_void); +untraceable!(TrustedWorkerAddress) #[jstraceable] #[must_root]