aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/trace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom/bindings/trace.rs')
-rw-r--r--src/components/script/dom/bindings/trace.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/components/script/dom/bindings/trace.rs b/src/components/script/dom/bindings/trace.rs
new file mode 100644
index 00000000000..6565bf8c2d9
--- /dev/null
+++ b/src/components/script/dom/bindings/trace.rs
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::bindings::js::JS;
+use dom::bindings::utils::{Reflectable, trace_reflector, Reflector};
+
+use js::jsapi::JSTracer;
+
+use std::cast;
+use extra::serialize::{Encodable, Encoder};
+
+// IMPORTANT: We rely on the fact that we never attempt to encode DOM objects using
+// any encoder but JSTracer. Since we derive trace hooks automatically,
+// we are unfortunately required to use generic types everywhere and
+// unsafely cast to the concrete JSTracer we actually require.
+
+impl<T: Reflectable+Encodable<S>, S: Encoder> Encodable<S> for JS<T> {
+ fn encode(&self, s: &mut S) {
+ let s: &mut JSTracer = unsafe { cast::transmute(s) };
+ trace_reflector(s, "", self.reflector());
+ }
+}
+
+impl<S: Encoder> Encodable<S> for Reflector {
+ fn encode(&self, _s: &mut S) {
+ }
+}