style: Temporarily use OrderMap on Gecko.

This will allow us to discard std hash map as a source of crashes.
This commit is contained in:
Emilio Cobos Álvarez 2018-01-31 15:13:15 +01:00
parent a2c2d34753
commit 4d9ce6b880
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
3 changed files with 30 additions and 14 deletions

View file

@ -9,19 +9,26 @@
use fnv; use fnv;
// #[cfg(feature = "gecko")]
// pub use hashglobe::hash_map::HashMap;
// #[cfg(feature = "gecko")]
// pub use hashglobe::hash_set::HashSet;
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub use hashglobe::hash_map::HashMap; pub use hashglobe::order::HashMap;
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub use hashglobe::hash_set::HashSet; pub use hashglobe::order::HashSet;
#[cfg(feature = "servo")] #[cfg(feature = "servo")]
pub use hashglobe::fake::{HashMap, HashSet}; pub use hashglobe::fake::{HashMap, HashSet};
/// Appropriate reexports of hash_map types /// Appropriate reexports of hash_map types
pub mod map { pub mod map {
// #[cfg(feature = "gecko")]
// pub use hashglobe::hash_map::{Entry, Iter};
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub use hashglobe::hash_map::{Entry, Iter}; pub use hashglobe::order::{Entry, MapIter as Iter};
#[cfg(feature = "servo")] #[cfg(feature = "servo")]
pub use std::collections::hash_map::{Entry, Iter}; pub use std::collections::hash_map::{Entry, Iter};
} }

View file

@ -273,7 +273,7 @@ impl InvalidationMap {
for class in compound_visitor.classes { for class in compound_visitor.classes {
self.class_to_selector self.class_to_selector
.entry(class, quirks_mode) .try_entry(class, quirks_mode)?
.or_insert_with(SmallVec::new) .or_insert_with(SmallVec::new)
.try_push(Dependency { .try_push(Dependency {
selector: selector.clone(), selector: selector.clone(),
@ -283,7 +283,7 @@ impl InvalidationMap {
for id in compound_visitor.ids { for id in compound_visitor.ids {
self.id_to_selector self.id_to_selector
.entry(id, quirks_mode) .try_entry(id, quirks_mode)?
.or_insert_with(SmallVec::new) .or_insert_with(SmallVec::new)
.try_push(Dependency { .try_push(Dependency {
selector: selector.clone(), selector: selector.clone(),

View file

@ -512,19 +512,12 @@ impl<V: 'static> MaybeCaseInsensitiveHashMap<Atom, V> {
MaybeCaseInsensitiveHashMap(PrecomputedHashMap::default()) MaybeCaseInsensitiveHashMap(PrecomputedHashMap::default())
} }
/// HashMap::entry
pub fn entry(&mut self, mut key: Atom, quirks_mode: QuirksMode) -> hash_map::Entry<Atom, V> {
if quirks_mode == QuirksMode::Quirks {
key = key.to_ascii_lowercase()
}
self.0.entry(key)
}
/// HashMap::try_entry /// HashMap::try_entry
#[cfg(not(feature = "gecko"))]
pub fn try_entry( pub fn try_entry(
&mut self, &mut self,
mut key: Atom, mut key: Atom,
quirks_mode: QuirksMode quirks_mode: QuirksMode,
) -> Result<hash_map::Entry<Atom, V>, FailedAllocationError> { ) -> Result<hash_map::Entry<Atom, V>, FailedAllocationError> {
if quirks_mode == QuirksMode::Quirks { if quirks_mode == QuirksMode::Quirks {
key = key.to_ascii_lowercase() key = key.to_ascii_lowercase()
@ -532,6 +525,22 @@ impl<V: 'static> MaybeCaseInsensitiveHashMap<Atom, V> {
self.0.try_entry(key) self.0.try_entry(key)
} }
/// HashMap::try_entry
///
/// FIXME(emilio): Remove the extra Entry parameter and unify when ordermap
/// 0.4 is released.
#[cfg(feature = "gecko")]
pub fn try_entry(
&mut self,
mut key: Atom,
quirks_mode: QuirksMode,
) -> Result<hash_map::Entry<Atom, V, BuildHasherDefault<PrecomputedHasher>>, FailedAllocationError> {
if quirks_mode == QuirksMode::Quirks {
key = key.to_ascii_lowercase()
}
self.0.try_entry(key)
}
/// HashMap::iter /// HashMap::iter
pub fn iter(&self) -> hash_map::Iter<Atom, V> { pub fn iter(&self) -> hash_map::Iter<Atom, V> {
self.0.iter() self.0.iter()