From 5bdf6bb1d3aad3bf758f99bec777eed8d41bc923 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Wed, 14 Oct 2015 18:15:44 -0700 Subject: [PATCH] Fix remaining MutHeap methods not to expose JS. --- components/script/dom/attr.rs | 2 +- components/script/dom/bindings/js.rs | 26 ++++++++++++---------- components/script/dom/node.rs | 2 +- components/script/dom/nodeiterator.rs | 16 +++++++------- components/script/dom/nodelist.rs | 3 +-- components/script/dom/storageevent.rs | 2 +- components/script/dom/treewalker.rs | 32 +++++++++++++-------------- 7 files changed, 42 insertions(+), 41 deletions(-) diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index e4241f713ad..8f545dac744 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -180,7 +180,7 @@ impl Attr { name: name, namespace: namespace, prefix: prefix, - owner: MutNullableHeap::new(owner.map(JS::from_ref)), + owner: MutNullableHeap::new(owner), } } diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 31f6b8c4100..da33b3e1fe6 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -211,22 +211,26 @@ pub struct MutHeap { val: UnsafeCell, } -impl MutHeap { +impl MutHeap> { /// Create a new `MutHeap`. - pub fn new(initial: T) -> MutHeap { + pub fn new(initial: &T) -> MutHeap> { MutHeap { - val: UnsafeCell::new(initial), + val: UnsafeCell::new(JS::from_ref(initial)), } } /// Set this `MutHeap` to the given value. - pub fn set(&self, val: T) { - unsafe { *self.val.get() = val; } + pub fn set(&self, val: &T) { + unsafe { + *self.val.get() = JS::from_ref(val); + } } /// Set the value in this `MutHeap`. - pub fn get(&self) -> T { - unsafe { ptr::read(self.val.get()) } + pub fn get(&self) -> Root { + unsafe { + ptr::read(self.val.get()).root() + } } } @@ -247,16 +251,14 @@ pub struct MutNullableHeap { ptr: UnsafeCell> } -impl MutNullableHeap { +impl MutNullableHeap> { /// Create a new `MutNullableHeap`. - pub fn new(initial: Option) -> MutNullableHeap { + pub fn new(initial: Option<&T>) -> MutNullableHeap> { MutNullableHeap { - ptr: UnsafeCell::new(initial) + ptr: UnsafeCell::new(initial.map(JS::from_ref)) } } -} -impl MutNullableHeap> { /// Retrieve a copy of the current inner value. If it is `None`, it is /// initialized with the result of `cb` first. pub fn or_init(&self, cb: F) -> Root diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 35f00ef0a37..daacdd09fa0 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1367,7 +1367,7 @@ impl Node { last_child: Default::default(), next_sibling: Default::default(), prev_sibling: Default::default(), - owner_doc: MutNullableHeap::new(doc.map(JS::from_ref)), + owner_doc: MutNullableHeap::new(doc), child_list: Default::default(), children_count: Cell::new(0u32), flags: Cell::new(flags), diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index 34ec3f6c658..c7152231776 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -36,7 +36,7 @@ impl NodeIterator { NodeIterator { reflector_: Reflector::new(), root_node: JS::from_ref(root_node), - reference_node: MutHeap::new(JS::from_ref(root_node)), + reference_node: MutHeap::new(root_node), pointer_before_reference_node: Cell::new(true), what_to_show: what_to_show, filter: filter @@ -87,7 +87,7 @@ impl NodeIteratorMethods for NodeIterator { // https://dom.spec.whatwg.org/#dom-nodeiterator-referencenode fn ReferenceNode(&self) -> Root { - self.reference_node.get().root() + self.reference_node.get() } // https://dom.spec.whatwg.org/#dom-nodeiterator-pointerbeforereferencenode @@ -99,7 +99,7 @@ impl NodeIteratorMethods for NodeIterator { fn NextNode(&self) -> Fallible>> { // https://dom.spec.whatwg.org/#concept-NodeIterator-traverse // Step 1. - let node = self.reference_node.get().root(); + let node = self.reference_node.get(); // Step 2. let mut before_node = self.pointer_before_reference_node.get(); @@ -114,7 +114,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { // Step 4. - self.reference_node.set(JS::from_ref(node.r())); + self.reference_node.set(node.r()); self.pointer_before_reference_node.set(before_node); return Ok(Some(node)); @@ -129,7 +129,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { // Step 4. - self.reference_node.set(JS::from_ref(following_node.r())); + self.reference_node.set(following_node.r()); self.pointer_before_reference_node.set(before_node); return Ok(Some(following_node)); @@ -143,7 +143,7 @@ impl NodeIteratorMethods for NodeIterator { fn PreviousNode(&self) -> Fallible>> { // https://dom.spec.whatwg.org/#concept-NodeIterator-traverse // Step 1. - let node = self.reference_node.get().root(); + let node = self.reference_node.get(); // Step 2. let mut before_node = self.pointer_before_reference_node.get(); @@ -158,7 +158,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { // Step 4. - self.reference_node.set(JS::from_ref(node.r())); + self.reference_node.set(node.r()); self.pointer_before_reference_node.set(before_node); return Ok(Some(node)); @@ -174,7 +174,7 @@ impl NodeIteratorMethods for NodeIterator { // Step 3-3. if result == NodeFilterConstants::FILTER_ACCEPT { // Step 4. - self.reference_node.set(JS::from_ref(preceding_node.r())); + self.reference_node.set(preceding_node.r()); self.pointer_before_reference_node.set(before_node); return Ok(Some(preceding_node)); diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index f86c1204a1c..4510624b4c4 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -103,8 +103,7 @@ impl ChildrenList { let last_visited = node.GetFirstChild(); ChildrenList { node: JS::from_ref(node), - last_visited: - MutNullableHeap::new(last_visited.as_ref().map(JS::from_rooted)), + last_visited: MutNullableHeap::new(last_visited.as_ref().map(Root::r)), last_index: Cell::new(0u32), } } diff --git a/components/script/dom/storageevent.rs b/components/script/dom/storageevent.rs index 76e697b2861..d9f1f60e395 100644 --- a/components/script/dom/storageevent.rs +++ b/components/script/dom/storageevent.rs @@ -37,7 +37,7 @@ impl StorageEvent { oldValue: oldValue, newValue: newValue, url: url, - storageArea: MutNullableHeap::new(storageArea.map(JS::from_ref)) + storageArea: MutNullableHeap::new(storageArea) } } diff --git a/components/script/dom/treewalker.rs b/components/script/dom/treewalker.rs index eb30ab5ff4b..7f4646a1618 100644 --- a/components/script/dom/treewalker.rs +++ b/components/script/dom/treewalker.rs @@ -35,7 +35,7 @@ impl TreeWalker { TreeWalker { reflector_: Reflector::new(), root_node: JS::from_ref(root_node), - current_node: MutHeap::new(JS::from_ref(root_node)), + current_node: MutHeap::new(root_node), what_to_show: what_to_show, filter: filter } @@ -85,18 +85,18 @@ impl TreeWalkerMethods for TreeWalker { // https://dom.spec.whatwg.org/#dom-treewalker-currentnode fn CurrentNode(&self) -> Root { - self.current_node.get().root() + self.current_node.get() } // https://dom.spec.whatwg.org/#dom-treewalker-currentnode fn SetCurrentNode(&self, node: &Node) { - self.current_node.set(JS::from_ref(node)); + self.current_node.set(node); } // https://dom.spec.whatwg.org/#dom-treewalker-parentnode fn ParentNode(&self) -> Fallible>> { // "1. Let node be the value of the currentNode attribute." - let mut node = self.current_node.get().root(); + let mut node = self.current_node.get(); // "2. While node is not null and is not root, run these substeps:" while !self.is_root_node(node.r()) { // "1. Let node be node's parent." @@ -106,7 +106,7 @@ impl TreeWalkerMethods for TreeWalker { // "2. If node is not null and filtering node returns FILTER_ACCEPT, // then set the currentNode attribute to node, return node." if NodeFilterConstants::FILTER_ACCEPT == try!(self.accept_node(node.r())) { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) } }, @@ -148,7 +148,7 @@ impl TreeWalkerMethods for TreeWalker { // https://dom.spec.whatwg.org/#dom-treewalker-previousnode fn PreviousNode(&self) -> Fallible>> { // "1. Let node be the value of the currentNode attribute." - let mut node = self.current_node.get().root(); + let mut node = self.current_node.get(); // "2. While node is not root, run these substeps:" while !self.is_root_node(node.r()) { // "1. Let sibling be the previous sibling of node." @@ -170,7 +170,7 @@ impl TreeWalkerMethods for TreeWalker { _ if node.GetFirstChild().is_some() => node = node.GetLastChild().unwrap(), NodeFilterConstants::FILTER_ACCEPT => { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) }, _ => break @@ -194,7 +194,7 @@ impl TreeWalkerMethods for TreeWalker { // "5. Filter node and if the return value is FILTER_ACCEPT, then // set the currentNode attribute to node and return node." if NodeFilterConstants::FILTER_ACCEPT == try!(self.accept_node(node.r())) { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) } } @@ -205,7 +205,7 @@ impl TreeWalkerMethods for TreeWalker { // https://dom.spec.whatwg.org/#dom-treewalker-nextnode fn NextNode(&self) -> Fallible>> { // "1. Let node be the value of the currentNode attribute." - let mut node = self.current_node.get().root(); + let mut node = self.current_node.get(); // "2. Let result be FILTER_ACCEPT." let mut result = NodeFilterConstants::FILTER_ACCEPT; // "3. Run these substeps:" @@ -225,7 +225,7 @@ impl TreeWalkerMethods for TreeWalker { // "3. If result is FILTER_ACCEPT, then // set the currentNode attribute to node and return node." if NodeFilterConstants::FILTER_ACCEPT == result { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) } } @@ -243,7 +243,7 @@ impl TreeWalkerMethods for TreeWalker { // "4. If result is FILTER_ACCEPT, then // set the currentNode attribute to node and return node." if NodeFilterConstants::FILTER_ACCEPT == result { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) } } @@ -267,7 +267,7 @@ impl TreeWalker { { // "To **traverse children** of type *type*, run these steps:" // "1. Let node be the value of the currentNode attribute." - let cur = self.current_node.get().root(); + let cur = self.current_node.get(); // "2. Set node to node's first child if type is first, and node's last child if type is last." // "3. If node is null, return null." @@ -284,7 +284,7 @@ impl TreeWalker { // "2. If result is FILTER_ACCEPT, then set the currentNode // attribute to node and return node." NodeFilterConstants::FILTER_ACCEPT => { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(Root::from_ref(node.r()))) }, // "3. If result is FILTER_SKIP, run these subsubsteps:" @@ -342,7 +342,7 @@ impl TreeWalker { { // "To **traverse siblings** of type *type* run these steps:" // "1. Let node be the value of the currentNode attribute." - let mut node = self.current_node.get().root(); + let mut node = self.current_node.get(); // "2. If node is root, return null." if self.is_root_node(node.r()) { return Ok(None) @@ -361,7 +361,7 @@ impl TreeWalker { // "3. If result is FILTER_ACCEPT, then set the currentNode // attribute to node and return node." if NodeFilterConstants::FILTER_ACCEPT == result { - self.current_node.set(JS::from_rooted(&node)); + self.current_node.set(&node); return Ok(Some(node)) } @@ -447,7 +447,7 @@ impl TreeWalker { } fn is_current_node(&self, node: &Node) -> bool { - JS::from_ref(node) == self.current_node.get() + node == &*self.current_node.get() } }