aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servohtmlparser.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-10-24 18:09:27 -0600
committerbors-servo <metajack+bors@gmail.com>2014-10-24 18:09:27 -0600
commit0c12f630e6352fc2aa00b638d014b2505f68af1f (patch)
tree763a529029964b132f4f70e7d3b60838ec257fc3 /components/script/dom/servohtmlparser.rs
parent06f322a7dba52ab73a91dd5e9030723055d2ca63 (diff)
parentf508a82582843cb0fdacdcd88be2f73d59529203 (diff)
downloadservo-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.rs20
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);
+ }
}
}