aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorCYBAI <cyb.ai.815@gmail.com>2018-12-26 16:29:30 +0800
committerCYBAI <cyb.ai.815@gmail.com>2018-12-26 18:05:43 +0800
commit115b73f636ee8f97e74e514523b10ffa9aed7369 (patch)
treeebcb61b076f60bcc7caf2177790a3e8e48547d00 /components/script/dom
parent4ba0ab7bd01482649ce9beff905d35c7471f3e1b (diff)
downloadservo-115b73f636ee8f97e74e514523b10ffa9aed7369.tar.gz
servo-115b73f636ee8f97e74e514523b10ffa9aed7369.zip
Use `IndexMap` for WebIDL Record
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/mozmap.rs12
-rw-r--r--components/script/dom/bindings/trace.rs16
2 files changed, 22 insertions, 6 deletions
diff --git a/components/script/dom/bindings/mozmap.rs b/components/script/dom/bindings/mozmap.rs
index 9658d0c0d5e..db46debc58e 100644
--- a/components/script/dom/bindings/mozmap.rs
+++ b/components/script/dom/bindings/mozmap.rs
@@ -7,6 +7,7 @@
use crate::dom::bindings::conversions::jsid_to_string;
use crate::dom::bindings::error::report_pending_exception;
use crate::dom::bindings::str::DOMString;
+use indexmap::IndexMap;
use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible};
use js::jsapi::JSContext;
use js::jsapi::JS_NewPlainObject;
@@ -22,28 +23,27 @@ use js::rust::wrappers::JS_GetPropertyById;
use js::rust::HandleValue;
use js::rust::IdVector;
use js::rust::MutableHandleValue;
-use std::collections::HashMap;
use std::ops::Deref;
/// The `MozMap` (open-ended dictionary) type.
#[derive(Clone, JSTraceable)]
pub struct MozMap<T> {
- map: HashMap<DOMString, T>,
+ map: IndexMap<DOMString, T>,
}
impl<T> MozMap<T> {
/// Create an empty `MozMap`.
pub fn new() -> Self {
MozMap {
- map: HashMap::new(),
+ map: IndexMap::new(),
}
}
}
impl<T> Deref for MozMap<T> {
- type Target = HashMap<DOMString, T>;
+ type Target = IndexMap<DOMString, T>;
- fn deref(&self) -> &HashMap<DOMString, T> {
+ fn deref(&self) -> &IndexMap<DOMString, T> {
&self.map
}
}
@@ -82,7 +82,7 @@ where
));
}
- let mut map = HashMap::new();
+ let mut map = IndexMap::new();
for id in &*ids {
rooted!(in(cx) let id = *id);
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 4fecf083737..ae1a9e6e3b4 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -61,6 +61,7 @@ use html5ever::{LocalName, Namespace, Prefix, QualName};
use http::header::HeaderMap;
use hyper::Method;
use hyper::StatusCode;
+use indexmap::IndexMap;
use ipc_channel::ipc::{IpcReceiver, IpcSender};
use js::glue::{CallObjectTracer, CallValueTracer};
use js::jsapi::{GCTraceKindToAscii, Heap, JSObject, JSTracer, TraceKind};
@@ -356,6 +357,21 @@ unsafe impl<K: Ord + JSTraceable, V: JSTraceable> JSTraceable for BTreeMap<K, V>
}
}
+unsafe impl<K, V, S> JSTraceable for IndexMap<K, V, S>
+where
+ K: Hash + Eq + JSTraceable,
+ V: JSTraceable,
+ S: BuildHasher,
+{
+ #[inline]
+ unsafe fn trace(&self, trc: *mut JSTracer) {
+ for (k, v) in &*self {
+ k.trace(trc);
+ v.trace(trc);
+ }
+ }
+}
+
unsafe impl<A: JSTraceable, B: JSTraceable> JSTraceable for (A, B) {
#[inline]
unsafe fn trace(&self, trc: *mut JSTracer) {