Skip to content

Commit f3a3599

Browse files
committed
Add debug asserts and fix some violations
1 parent ddacf03 commit f3a3599

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

src/liballoc/btree/map.rs

+5
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ impl<K, Q: ?Sized> super::Recover<Q> for BTreeMap<K, ()>
246246
}
247247

248248
fn replace(&mut self, key: K) -> Option<K> {
249+
if self.root.is_shared_root() {
250+
self.root = node::Root::new_leaf();
251+
}
249252
match search::search_tree::<marker::Mut, K, (), K>(self.root.as_mut(), &key) {
250253
Found(handle) => Some(mem::replace(handle.into_kv_mut().0, key)),
251254
GoDown(handle) => {
@@ -889,6 +892,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
889892
/// ```
890893
#[stable(feature = "rust1", since = "1.0.0")]
891894
pub fn entry(&mut self, key: K) -> Entry<K, V> {
895+
// FIXME(@porglezomp) Avoid allocating if we don't insert
892896
if self.root.is_shared_root() {
893897
self.root = node::Root::new_leaf();
894898
}
@@ -1026,6 +1030,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
10261030
let total_num = self.len();
10271031

10281032
let mut right = Self::new();
1033+
right.root = node::Root::new_leaf();
10291034
for _ in 0..(self.root.as_ref().height()) {
10301035
right.root.push_level();
10311036
}

src/liballoc/btree/node.rs

+11
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ impl<K, V> Root<K, V> {
195195
}
196196

197197
pub fn shared_empty_root() -> Self {
198+
// Ensuring that the shared node hasn't been corrupted by any mutations
199+
debug_assert!(EMPTY_ROOT_NODE.parent == ptr::null());
200+
debug_assert!(EMPTY_ROOT_NODE.parent_idx == 0);
201+
debug_assert!(EMPTY_ROOT_NODE.len == 0);
198202
Root {
199203
node: unsafe {
200204
BoxedNode::from_ptr(NonNull::new_unchecked(
@@ -246,6 +250,7 @@ impl<K, V> Root<K, V> {
246250
/// new node the root. This increases the height by 1 and is the opposite of `pop_level`.
247251
pub fn push_level(&mut self)
248252
-> NodeRef<marker::Mut, K, V, marker::Internal> {
253+
debug_assert!(!self.is_shared_root());
249254
let mut new_node = Box::new(unsafe { InternalNode::new() });
250255
new_node.edges[0] = unsafe { BoxedNode::from_ptr(self.node.as_ptr()) };
251256

@@ -474,6 +479,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
474479
marker::Edge
475480
>
476481
> {
482+
debug_assert!(!self.is_shared_root());
477483
let node = self.node;
478484
let ret = self.ascend().ok();
479485
Global.dealloc(node.as_opaque(), Layout::new::<LeafNode<K, V>>());
@@ -631,6 +637,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
631637
pub fn push(&mut self, key: K, val: V) {
632638
// Necessary for correctness, but this is an internal module
633639
debug_assert!(self.len() < CAPACITY);
640+
debug_assert!(!self.is_shared_root());
634641

635642
let idx = self.len();
636643

@@ -646,6 +653,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
646653
pub fn push_front(&mut self, key: K, val: V) {
647654
// Necessary for correctness, but this is an internal module
648655
debug_assert!(self.len() < CAPACITY);
656+
debug_assert!(!self.is_shared_root());
649657

650658
unsafe {
651659
slice_insert(self.keys_mut(), 0, key);
@@ -959,6 +967,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge
959967
fn insert_fit(&mut self, key: K, val: V) -> *mut V {
960968
// Necessary for correctness, but in a private module
961969
debug_assert!(self.node.len() < CAPACITY);
970+
debug_assert!(!self.node.is_shared_root());
962971

963972
unsafe {
964973
slice_insert(self.node.keys_mut(), self.idx, key);
@@ -1136,6 +1145,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
11361145
/// allocated node.
11371146
pub fn split(mut self)
11381147
-> (NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, K, V, Root<K, V>) {
1148+
debug_assert!(!self.node.is_shared_root());
11391149
unsafe {
11401150
let mut new_node = Box::new(LeafNode::new());
11411151

@@ -1173,6 +1183,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
11731183
/// now adjacent key/value pairs to the left and right of this handle.
11741184
pub fn remove(mut self)
11751185
-> (Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge>, K, V) {
1186+
debug_assert!(!self.node.is_shared_root());
11761187
unsafe {
11771188
let k = slice_remove(self.node.keys_mut(), self.idx);
11781189
let v = slice_remove(self.node.vals_mut(), self.idx);

0 commit comments

Comments
 (0)