From 40ea4c4946e913174c1c45486311c667d1bdcf7c Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Thu, 7 Jun 2018 12:52:57 -0500 Subject: Fixed panic due to GC while parsing --- components/script/script_thread.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'components/script/script_thread.rs') diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index a28bdfbb5bf..d8318e60494 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -104,6 +104,7 @@ use servo_atoms::Atom; use servo_config::opts; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use std::cell::Cell; +use std::cell::RefCell; use std::collections::{hash_map, HashMap, HashSet}; use std::default::Default; use std::ops::Deref; @@ -387,6 +388,14 @@ impl<'a> Iterator for DocumentsIter<'a> { } } +// We borrow the incomplete parser contexts mutably during parsing, +// which is fine except that parsing can trigger evaluation, +// which can trigger GC, and so we can end up tracing the script +// thread during parsing. For this reason, we don't trace the +// incomplete parser contexts during GC. +type IncompleteParserContexts = Vec<(PipelineId, ParserContext)>; +unsafe_no_jsmanaged_fields!(RefCell); + #[derive(JSTraceable)] // ScriptThread instances are rooted on creation, so this is okay #[allow(unrooted_must_root)] @@ -399,7 +408,7 @@ pub struct ScriptThread { /// A list of data pertaining to loads that have not yet received a network response incomplete_loads: DomRefCell>, /// A vector containing parser contexts which have not yet been fully processed - incomplete_parser_contexts: DomRefCell>, + incomplete_parser_contexts: RefCell, /// A map to store service worker registrations for a given origin registration_map: DomRefCell>>, /// A job queue for Service Workers keyed by their scope url @@ -825,7 +834,7 @@ impl ScriptThread { documents: DomRefCell::new(Documents::new()), window_proxies: DomRefCell::new(HashMap::new()), incomplete_loads: DomRefCell::new(vec!()), - incomplete_parser_contexts: DomRefCell::new(vec!()), + incomplete_parser_contexts: RefCell::new(vec!()), registration_map: DomRefCell::new(HashMap::new()), job_queue_map: Rc::new(JobQueue::new()), -- cgit v1.2.3