mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Resolved potential GC borrow hazards in ModuleTree::append_handler, ModuleTree::append_dynamic_module_handler, and ModuleTree::fetch_module_descendants' (#33942)
* GC borrow hazard ModuleTree fix Signed-off-by: L Ashwin B <lashwinib@gmail.com> * Prevent `stretch` from producing a negative size (#33951) Signed-off-by: Oriol Brufau <obrufau@igalia.com> * reverted debug_assert back to assert Signed-off-by: L Ashwin B <lashwinib@gmail.com> * added can_gc arguments to the function calls Signed-off-by: L Ashwin B <lashwinib@gmail.com> --------- Signed-off-by: L Ashwin B <lashwinib@gmail.com> Signed-off-by: Oriol Brufau <obrufau@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
324f42abd7
commit
076b37e6aa
1 changed files with 35 additions and 33 deletions
|
@ -363,15 +363,14 @@ impl ModuleTree {
|
||||||
let comp = InRealm::Entered(&realm);
|
let comp = InRealm::Entered(&realm);
|
||||||
let _ais = AutoIncumbentScript::new(&owner.global());
|
let _ais = AutoIncumbentScript::new(&owner.global());
|
||||||
|
|
||||||
let mut promise = self.promise.borrow_mut();
|
if let Some(promise) = self.promise.borrow().as_ref() {
|
||||||
match promise.as_ref() {
|
promise.append_native_handler(&handler, comp, can_gc);
|
||||||
Some(promise) => promise.append_native_handler(&handler, comp, can_gc),
|
return;
|
||||||
None => {
|
|
||||||
let new_promise = Promise::new_in_current_realm(comp, can_gc);
|
|
||||||
new_promise.append_native_handler(&handler, comp, can_gc);
|
|
||||||
*promise = Some(new_promise);
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let new_promise = Promise::new_in_current_realm(comp, can_gc);
|
||||||
|
new_promise.append_native_handler(&handler, comp, can_gc);
|
||||||
|
*self.promise.borrow_mut() = Some(new_promise);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn append_dynamic_module_handler(
|
fn append_dynamic_module_handler(
|
||||||
|
@ -400,15 +399,14 @@ impl ModuleTree {
|
||||||
let comp = InRealm::Entered(&realm);
|
let comp = InRealm::Entered(&realm);
|
||||||
let _ais = AutoIncumbentScript::new(&owner.global());
|
let _ais = AutoIncumbentScript::new(&owner.global());
|
||||||
|
|
||||||
let mut promise = self.promise.borrow_mut();
|
if let Some(promise) = self.promise.borrow().as_ref() {
|
||||||
match promise.as_ref() {
|
promise.append_native_handler(&handler, comp, can_gc);
|
||||||
Some(promise) => promise.append_native_handler(&handler, comp, can_gc),
|
return;
|
||||||
None => {
|
|
||||||
let new_promise = Promise::new_in_current_realm(comp, can_gc);
|
|
||||||
new_promise.append_native_handler(&handler, comp, can_gc);
|
|
||||||
*promise = Some(new_promise);
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let new_promise = Promise::new_in_current_realm(comp, can_gc);
|
||||||
|
new_promise.append_native_handler(&handler, comp, can_gc);
|
||||||
|
*self.promise.borrow_mut() = Some(new_promise);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -745,23 +743,26 @@ impl ModuleTree {
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.extend(valid_specifier_urls.clone());
|
.extend(valid_specifier_urls.clone());
|
||||||
|
|
||||||
let mut urls = IndexSet::new();
|
let urls_to_fetch = {
|
||||||
let mut visited_urls = self.visited_urls.borrow_mut();
|
let mut urls = IndexSet::new();
|
||||||
|
let mut visited_urls = self.visited_urls.borrow_mut();
|
||||||
|
|
||||||
for parsed_url in valid_specifier_urls {
|
for parsed_url in &valid_specifier_urls {
|
||||||
// Step 5-3.
|
// Step 5-3.
|
||||||
if !visited_urls.contains(&parsed_url) {
|
if !visited_urls.contains(parsed_url) {
|
||||||
// Step 5-3-1.
|
// Step 5-3-1.
|
||||||
urls.insert(parsed_url.clone());
|
urls.insert(parsed_url.clone());
|
||||||
// Step 5-3-2.
|
// Step 5-3-2.
|
||||||
visited_urls.insert(parsed_url.clone());
|
visited_urls.insert(parsed_url.clone());
|
||||||
|
|
||||||
self.insert_incomplete_fetch_url(&parsed_url);
|
self.insert_incomplete_fetch_url(parsed_url);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
urls
|
||||||
|
};
|
||||||
|
|
||||||
// Step 3.
|
// Step 3.
|
||||||
if urls.is_empty() {
|
if urls_to_fetch.is_empty() {
|
||||||
debug!(
|
debug!(
|
||||||
"After checking with visited urls, module {} doesn't have dependencies to load.",
|
"After checking with visited urls, module {} doesn't have dependencies to load.",
|
||||||
&self.url
|
&self.url
|
||||||
|
@ -772,12 +773,13 @@ impl ModuleTree {
|
||||||
|
|
||||||
// Step 8.
|
// Step 8.
|
||||||
|
|
||||||
for url in urls {
|
let visited_urls = self.visited_urls.borrow().clone();
|
||||||
|
let options = options.descendant_fetch_options();
|
||||||
|
|
||||||
|
for url in urls_to_fetch {
|
||||||
// https://html.spec.whatwg.org/multipage/#internal-module-script-graph-fetching-procedure
|
// https://html.spec.whatwg.org/multipage/#internal-module-script-graph-fetching-procedure
|
||||||
// Step 1.
|
// Step 1.
|
||||||
assert!(visited_urls.get(&url).is_some());
|
assert!(self.visited_urls.borrow().contains(&url));
|
||||||
|
|
||||||
let options = options.descendant_fetch_options();
|
|
||||||
|
|
||||||
// Step 2.
|
// Step 2.
|
||||||
fetch_single_module_script(
|
fetch_single_module_script(
|
||||||
|
@ -785,7 +787,7 @@ impl ModuleTree {
|
||||||
url,
|
url,
|
||||||
visited_urls.clone(),
|
visited_urls.clone(),
|
||||||
destination,
|
destination,
|
||||||
options,
|
options.clone(),
|
||||||
Some(parent_identity.clone()),
|
Some(parent_identity.clone()),
|
||||||
false,
|
false,
|
||||||
None,
|
None,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue