diff options
author | bors-servo <metajack+bors@gmail.com> | 2014-10-24 18:09:27 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2014-10-24 18:09:27 -0600 |
commit | 0c12f630e6352fc2aa00b638d014b2505f68af1f (patch) | |
tree | 763a529029964b132f4f70e7d3b60838ec257fc3 /components/script/dom/servohtmlparser.rs | |
parent | 06f322a7dba52ab73a91dd5e9030723055d2ca63 (diff) | |
parent | f508a82582843cb0fdacdcd88be2f73d59529203 (diff) | |
download | servo-0c12f630e6352fc2aa00b638d014b2505f68af1f.tar.gz servo-0c12f630e6352fc2aa00b638d014b2505f68af1f.zip |
auto merge of #3797 : kmcallister/servo/domrefcell, r=jdm
r? @mbrubeck, @jdm
Alternative to #3770 and #3716.
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r-- | components/script/dom/servohtmlparser.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index 6b81ab512c5..88f0c9c8275 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -15,6 +15,8 @@ use dom::node::TrustedNodeAddress; use dom::document::{Document, DocumentHelpers}; use parse::html::JSMessage; +use servo_util::task_state; + use std::default::Default; use url::Url; use js::jsapi::JSTracer; @@ -91,15 +93,23 @@ impl tree_builder::Tracer<TrustedNodeAddress> for Tracer { impl JSTraceable for ServoHTMLParser { fn trace(&self, trc: *mut JSTracer) { + self.reflector_.trace(trc); + let tracer = Tracer { trc: trc, }; let tracer = &tracer as &tree_builder::Tracer<TrustedNodeAddress>; - self.reflector_.trace(trc); - let tokenizer = self.tokenizer.borrow(); - let tree_builder = tokenizer.sink(); - tree_builder.trace_handles(tracer); - tree_builder.sink().trace(trc); + unsafe { + // Assertion: If the parser is mutably borrowed, we're in the + // parsing code paths. + debug_assert!(task_state::get().contains(task_state::InHTMLParser) + || !self.tokenizer.is_mutably_borrowed()); + + let tokenizer = self.tokenizer.borrow_for_gc_trace(); + let tree_builder = tokenizer.sink(); + tree_builder.trace_handles(tracer); + tree_builder.sink().trace(trc); + } } } |