Use IndexMap for WebIDL Record

This commit is contained in:
CYBAI 2018-12-26 16:29:30 +08:00
parent 4ba0ab7bd0
commit 115b73f636
4 changed files with 27 additions and 9 deletions

7
Cargo.lock generated
View file

@ -1587,7 +1587,7 @@ dependencies = [
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
"http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "1.0.1" version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -3246,6 +3246,7 @@ dependencies = [
"hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)",
"indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
"jstraceable_derive 0.0.1", "jstraceable_derive 0.0.1",
@ -4950,7 +4951,7 @@ dependencies = [
"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
"checksum image 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44665b4395d1844c96e7dc8ed5754782a1cdfd9ef458a80bbe45702681450504" "checksum image 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44665b4395d1844c96e7dc8ed5754782a1cdfd9ef458a80bbe45702681450504"
"checksum immeta 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7371aa3c98fad60de2d9b517e2e1ed45593c32b0c77249310fa507749a2a318b" "checksum immeta 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7371aa3c98fad60de2d9b517e2e1ed45593c32b0c77249310fa507749a2a318b"
"checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d"
"checksum inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6f53b811ee8e2057ccf9643ca6b4277de90efaf5e61e55fd5254576926bb4245" "checksum inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6f53b811ee8e2057ccf9643ca6b4277de90efaf5e61e55fd5254576926bb4245"
"checksum influent 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f06f65fa332019cbf57b927cd5a5da53cfce506109f38312fd597745a8a48c0" "checksum influent 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f06f65fa332019cbf57b927cd5a5da53cfce506109f38312fd597745a8a48c0"
"checksum io-surface 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9a33981dff54baaff80f4decb487a65d148a3c00facc97820d0f09128f74dd" "checksum io-surface 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9a33981dff54baaff80f4decb487a65d148a3c00facc97820d0f09128f74dd"

View file

@ -61,6 +61,7 @@ http = "0.1"
hyper = "0.12" hyper = "0.12"
hyper_serde = "0.9" hyper_serde = "0.9"
image = "0.20" image = "0.20"
indexmap = "1.0.2"
ipc-channel = "0.11" ipc-channel = "0.11"
itertools = "0.7.6" itertools = "0.7.6"
jstraceable_derive = {path = "../jstraceable_derive"} jstraceable_derive = {path = "../jstraceable_derive"}

View file

@ -7,6 +7,7 @@
use crate::dom::bindings::conversions::jsid_to_string; use crate::dom::bindings::conversions::jsid_to_string;
use crate::dom::bindings::error::report_pending_exception; use crate::dom::bindings::error::report_pending_exception;
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use indexmap::IndexMap;
use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible};
use js::jsapi::JSContext; use js::jsapi::JSContext;
use js::jsapi::JS_NewPlainObject; use js::jsapi::JS_NewPlainObject;
@ -22,28 +23,27 @@ use js::rust::wrappers::JS_GetPropertyById;
use js::rust::HandleValue; use js::rust::HandleValue;
use js::rust::IdVector; use js::rust::IdVector;
use js::rust::MutableHandleValue; use js::rust::MutableHandleValue;
use std::collections::HashMap;
use std::ops::Deref; use std::ops::Deref;
/// The `MozMap` (open-ended dictionary) type. /// The `MozMap` (open-ended dictionary) type.
#[derive(Clone, JSTraceable)] #[derive(Clone, JSTraceable)]
pub struct MozMap<T> { pub struct MozMap<T> {
map: HashMap<DOMString, T>, map: IndexMap<DOMString, T>,
} }
impl<T> MozMap<T> { impl<T> MozMap<T> {
/// Create an empty `MozMap`. /// Create an empty `MozMap`.
pub fn new() -> Self { pub fn new() -> Self {
MozMap { MozMap {
map: HashMap::new(), map: IndexMap::new(),
} }
} }
} }
impl<T> Deref for MozMap<T> { 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 &self.map
} }
} }
@ -82,7 +82,7 @@ where
)); ));
} }
let mut map = HashMap::new(); let mut map = IndexMap::new();
for id in &*ids { for id in &*ids {
rooted!(in(cx) let id = *id); rooted!(in(cx) let id = *id);

View file

@ -61,6 +61,7 @@ use html5ever::{LocalName, Namespace, Prefix, QualName};
use http::header::HeaderMap; use http::header::HeaderMap;
use hyper::Method; use hyper::Method;
use hyper::StatusCode; use hyper::StatusCode;
use indexmap::IndexMap;
use ipc_channel::ipc::{IpcReceiver, IpcSender}; use ipc_channel::ipc::{IpcReceiver, IpcSender};
use js::glue::{CallObjectTracer, CallValueTracer}; use js::glue::{CallObjectTracer, CallValueTracer};
use js::jsapi::{GCTraceKindToAscii, Heap, JSObject, JSTracer, TraceKind}; 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) { unsafe impl<A: JSTraceable, B: JSTraceable> JSTraceable for (A, B) {
#[inline] #[inline]
unsafe fn trace(&self, trc: *mut JSTracer) { unsafe fn trace(&self, trc: *mut JSTracer) {