Skip to content

Commit

Permalink
RootCollection: Start using RootedVec instead of SmallVec32.
Browse files Browse the repository at this point in the history
dom/bindings/js.rs: Alphabetize `use`.

dom/bindings/js.rs: moved `unsafe` block to a let binding.

dom/bindings/trace.rs: rename alternate constructor of RootedVec.

dom/bindings/trace.rs: `new()` is now using `new_with_destination_address()` internally.

dom/bindings/js.rs: alphabetize imports.
  • Loading branch information
Jag Talon committed Apr 6, 2015
1 parent f22d920 commit 6e013d3
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
14 changes: 9 additions & 5 deletions components/script/dom/bindings/js.rs
Expand Up @@ -50,18 +50,19 @@
//! `Option<Root<T>>` easy

use dom::bindings::trace::JSTraceable;
use dom::bindings::trace::RootedVec;
use dom::bindings::utils::{Reflector, Reflectable};
use dom::node::Node;
use js::jsapi::JSObject;
use js::jsval::JSVal;
use layout_interface::TrustedNodeAddress;
use script_task::STACK_ROOTS;

use util::smallvec::{SmallVec, SmallVec32};

use core::nonzero::NonZero;
use libc;
use std::cell::{Cell, UnsafeCell};
use std::default::Default;
use std::intrinsics::return_address;
use std::marker::PhantomData;
use std::mem;
use std::ops::Deref;
Expand Down Expand Up @@ -610,7 +611,7 @@ impl<T: Assignable<U>, U: Reflectable> TemporaryPushable<T> for Vec<JS<U>> {
/// See also [*Exact Stack Rooting - Storing a GCPointer on the CStack*]
/// (https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/GC/Exact_Stack_Rooting).
pub struct RootCollection {
roots: UnsafeCell<SmallVec32<*mut JSObject>>,
roots: UnsafeCell<RootedVec<*mut JSObject>>,
}

/// A pointer to a RootCollection, for use in global variables.
Expand All @@ -621,8 +622,12 @@ impl Copy for RootCollectionPtr {}
impl RootCollection {
/// Create an empty collection of roots
pub fn new() -> RootCollection {
let addr = unsafe {
return_address() as *const libc::c_void
};

RootCollection {
roots: UnsafeCell::new(SmallVec32::new()),
roots: UnsafeCell::new(RootedVec::new_with_destination_address(addr)),
}
}

Expand All @@ -632,7 +637,6 @@ impl RootCollection {
let roots = self.roots.get();
(*roots).push(untracked_js_ptr);
debug!(" rooting {:?}", untracked_js_ptr);
assert!(!(*roots).spilled());
}
}

Expand Down
13 changes: 11 additions & 2 deletions components/script/dom/bindings/trace.rs
Expand Up @@ -389,12 +389,21 @@ impl<T: VecRootableType> RootedVec<T> {
/// Create a vector of items of type T that is rooted for
/// the lifetime of this struct
pub fn new() -> RootedVec<T> {
let addr = unsafe {
return_address() as *const libc::c_void
};

RootedVec::new_with_destination_address(addr)
}

/// Create a vector of items of type T. This constructor is specific
/// for RootCollection.
pub fn new_with_destination_address(addr: *const libc::c_void) -> RootedVec<T> {
unsafe {
RootedCollectionSet::add::<T>(&*(return_address() as *const _));
RootedCollectionSet::add::<T>(&*(addr as *const _));
}
RootedVec::<T> { v: vec!() }
}

}

#[unsafe_destructor]
Expand Down

0 comments on commit 6e013d3

Please sign in to comment.