Skip to content

Rollup of 17 pull requests #74407

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 72 commits into from
Closed
Changes from 3 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
c4b0265
Enable some timeouts in SGX platform
mzohreva Jun 12, 2020
d7dc64b
Handle spurious wakeups in wait_timeout_sgx
mzohreva Jun 12, 2020
c5d1fcd
Allow more ui tests for SGX
mzohreva Jun 12, 2020
3442d23
Improve wait_timeout_sgx, simplify usercalls::wait
mzohreva Jun 18, 2020
fde8d11
Don't pollute docs/suggestions with libstd deps
alexcrichton Jun 17, 2020
99c1513
Small cleanup for E0705 explanation
GuillaumeGomez Jun 27, 2020
582071c
Ignoring test case: [codegen] repr-transparent-aggregates-1.rs for aa…
Jul 1, 2020
c457b67
Remove unnecessary check in SGX wait usercall
mzohreva Jul 1, 2020
69d5fc1
Clean up E0710 explanation
GuillaumeGomez Jun 28, 2020
9b6b400
Remove some `ignore-stage1` annotations.
ehuss Jul 3, 2020
b0884c0
Move #[doc(alias)] check in rustc
GuillaumeGomez Jul 8, 2020
1466598
Address review comments
mzohreva Jul 11, 2020
382d5bb
Focus on the current file in the source file sidebar
GuillaumeGomez Jul 14, 2020
c3ee75d
rustdoc: glue tokens before highlighting
euclio Jun 27, 2020
0f4e4a0
rustdoc: Rename internal API fns to `into_string`
tesuji Jul 15, 2020
a5275ff
Don't run everybody_loops for rustdoc
jyn514 Jun 20, 2020
b3187aa
Don't run analysis pass in rustdoc
jyn514 Jun 20, 2020
1b8accb
Add an option not to report resolution errors for rustdoc
jyn514 Jun 20, 2020
14a8707
Add `rustdoc` tests from #72088
ecstatic-morse Jun 7, 2020
768d6a4
Don't ICE on errors in function returning impl trait
jyn514 Jul 3, 2020
a93bcc9
Recurse into function bodies, but don't typeck closures
jyn514 Jul 9, 2020
d010443
Add test case for #65863
jyn514 Jul 9, 2020
cf844d2
Don't make typeck_tables_of public
jyn514 Jul 10, 2020
0cbc1cd
Avoid unnecessary enum
jyn514 Jul 10, 2020
3576f5d
Address review comments about code style
jyn514 Jul 10, 2020
bbe4971
Don't crash on Vec<DoesNotExist>
jyn514 Jul 10, 2020
2f29e69
Mention `cargo check` in help message
jyn514 Jul 10, 2020
763d373
Use tcx as the only context for visitor
jyn514 Jul 10, 2020
0759a55
Remove unnecessary lifetime parameter
jyn514 Jul 10, 2020
2d0e8e2
--bless
jyn514 Jul 10, 2020
02a24c8
Don't ICE on infinitely recursive types
jyn514 Jul 11, 2020
4c88070
Use mem::replace instead of rewriting it
jyn514 Jul 11, 2020
b2ff0e7
Fix comment
jyn514 Jul 11, 2020
ac9157b
EMPTY_MAP -> EMPTY_SET
jyn514 Jul 12, 2020
6eec9fb
Address review comments
jyn514 Jul 12, 2020
e117b47
Catch errors for any new item, not just trait implementations
jyn514 Jul 15, 2020
281ca13
Use the default providers in rustc_interface instead of adding our own
jyn514 Jul 15, 2020
703f680
Don't panic if the lhs of a div by zero is not statically known
oli-obk Jul 10, 2020
85c25ae
Move usercall_wait_timeout to abi::usercalls::wait_timeout
mzohreva Jul 15, 2020
593c7fe
Fix typo in std::mem::transmute documentation
ColoredCarrot Jul 16, 2020
ca253ca
Clean up or comment every unwrap in BTreeMap's main code.
ssomers Jul 13, 2020
b82d332
Separate off BTreeMap support functions and loose their irrelevant bo…
ssomers Jul 14, 2020
631b2b9
Remove unused lazy_static
jyn514 Jul 16, 2020
9bc922e
Bump to 1.47
Mark-Simulacrum Jul 16, 2020
aba1242
apply bootstrap cfgs
Mark-Simulacrum Jul 16, 2020
52c65e0
Remove elements iterator clone and only keep first element instead
GuillaumeGomez Jul 16, 2020
9845075
Revert "Remove "important traits" feature"
Manishearth Jul 6, 2020
3cecd60
Revert "Remove spotlight usage"
Manishearth Jul 6, 2020
c90fb71
Move spotlight next to the return type
Manishearth Jul 6, 2020
734afb4
Make spotlight show on hover
Manishearth Jul 7, 2020
ae6c7e6
Review comments for JS
Manishearth Jul 15, 2020
0625b29
Add Ayu theme for spotlight
Manishearth Jul 15, 2020
a474b27
Remove !important on border-color and background-color
Manishearth Jul 15, 2020
c621a54
Don't position:relative on all pres
Manishearth Jul 16, 2020
5b287f6
Set shell for github actions CI
Mark-Simulacrum Jul 16, 2020
5d8c9c3
Rollup merge of #73269 - mzohreva:mz/sgx-wait-timeout, r=jethrogb
Manishearth Jul 16, 2020
901b9b9
Rollup merge of #73566 - jyn514:name-resolve-first, r=eddyb
Manishearth Jul 16, 2020
f669279
Rollup merge of #73771 - alexcrichton:ignore-unstable, r=estebank,Gui…
Manishearth Jul 16, 2020
d5d574e
Rollup merge of #73794 - GuillaumeGomez:cleanup-e0705, r=Dylan-DPC
Manishearth Jul 16, 2020
49dcefc
Rollup merge of #73807 - euclio:rustdoc-highlighting, r=ollie27,Guill…
Manishearth Jul 16, 2020
607fc3d
Rollup merge of #73835 - GuillaumeGomez:cleanup-e0710, r=Dylan-DPC
Manishearth Jul 16, 2020
240c4b3
Rollup merge of #73926 - joaopaulocarreiro:github_rust-6, r=nikomatsakis
Manishearth Jul 16, 2020
e253f79
Rollup merge of #73981 - ehuss:remove-ignore-stage1, r=nikomatsakis
Manishearth Jul 16, 2020
8a6ba1d
Rollup merge of #74148 - GuillaumeGomez:doc-alias-check, r=Manishearth
Manishearth Jul 16, 2020
0a4036c
Rollup merge of #74221 - oli-obk:const_prop_ice, r=wesleywiser
Manishearth Jul 16, 2020
0b6601d
Rollup merge of #74325 - GuillaumeGomez:focus-source-file-sidebar, r=…
Manishearth Jul 16, 2020
0e1964a
Rollup merge of #74359 - lzutao:rustdoc-tostring, r=GuillaumeGomez
Manishearth Jul 16, 2020
a7c66d9
Rollup merge of #74370 - Manishearth:re-spotlight, r=GuillaumeGomez
Manishearth Jul 16, 2020
2b5119f
Rollup merge of #74390 - ColoredCarrot:patch-1, r=lcnr
Manishearth Jul 16, 2020
1d1261a
Rollup merge of #74391 - ssomers:btree_refactor, r=Mark-Simulacrum
Manishearth Jul 16, 2020
56e40f6
Rollup merge of #74395 - Mark-Simulacrum:stage0-next, r=pietroalbini
Manishearth Jul 16, 2020
c7e85bb
Rollup merge of #74406 - Mark-Simulacrum:fix-windows-maybe, r=Mark-Si…
Manishearth Jul 16, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 83 additions & 92 deletions src/liballoc/collections/btree/map.rs
Original file line number Diff line number Diff line change
@@ -151,7 +151,7 @@ impl<K: Clone, V: Clone> Clone for BTreeMap<K, V> {
let mut out_tree = BTreeMap { root: Some(node::Root::new_leaf()), length: 0 };

{
let root = out_tree.root.as_mut().unwrap();
let root = out_tree.root.as_mut().unwrap(); // unwrap succeeds because we just wrapped
let mut out_node = match root.as_mut().force() {
Leaf(leaf) => leaf,
Internal(_) => unreachable!(),
@@ -171,14 +171,10 @@ impl<K: Clone, V: Clone> Clone for BTreeMap<K, V> {
}
Internal(internal) => {
let mut out_tree = clone_subtree(internal.first_edge().descend());
out_tree.ensure_root_is_owned();

{
// Ideally we'd use the return of ensure_root_is_owned
// instead of re-unwrapping here but unfortunately that
// borrows all of out_tree and we need access to the
// length below.
let mut out_node = out_tree.root.as_mut().unwrap().push_level();
let out_root = BTreeMap::ensure_is_owned(&mut out_tree.root);
let mut out_node = out_root.push_level();
let mut in_edge = internal.first_edge();
while let Ok(kv) = in_edge.right_kv() {
let (k, v) = kv.into_kv();
@@ -212,7 +208,7 @@ impl<K: Clone, V: Clone> Clone for BTreeMap<K, V> {
// Ord` constraint, which this method lacks.
BTreeMap { root: None, length: 0 }
} else {
clone_subtree(self.root.as_ref().unwrap().as_ref())
clone_subtree(self.root.as_ref().unwrap().as_ref()) // unwrap succeeds because not empty
}
}
}
@@ -243,8 +239,8 @@ where
}

fn replace(&mut self, key: K) -> Option<K> {
self.ensure_root_is_owned();
match search::search_tree::<marker::Mut<'_>, K, (), K>(self.root.as_mut()?.as_mut(), &key) {
let root = Self::ensure_is_owned(&mut self.root);
match search::search_tree::<marker::Mut<'_>, K, (), K>(root.as_mut(), &key) {
Found(handle) => Some(mem::replace(handle.into_kv_mut().0, key)),
GoDown(handle) => {
VacantEntry { key, handle, length: &mut self.length, _marker: PhantomData }
@@ -943,7 +939,6 @@ impl<K: Ord, V> BTreeMap<K, V> {

// Second, we build a tree from the sorted sequence in linear time.
self.from_sorted_iter(iter);
self.fix_right_edge();
}

/// Constructs a double-ended iterator over a sub-range of elements in the map.
@@ -1058,8 +1053,8 @@ impl<K: Ord, V> BTreeMap<K, V> {
#[stable(feature = "rust1", since = "1.0.0")]
pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
// FIXME(@porglezomp) Avoid allocating if we don't insert
self.ensure_root_is_owned();
match search::search_tree(self.root.as_mut().unwrap().as_mut(), &key) {
let root = Self::ensure_is_owned(&mut self.root);
match search::search_tree(root.as_mut(), &key) {
Found(handle) => {
Occupied(OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData })
}
@@ -1070,8 +1065,8 @@ impl<K: Ord, V> BTreeMap<K, V> {
}

fn from_sorted_iter<I: Iterator<Item = (K, V)>>(&mut self, iter: I) {
self.ensure_root_is_owned();
let mut cur_node = self.root.as_mut().unwrap().as_mut().last_leaf_edge().into_node();
let root = Self::ensure_is_owned(&mut self.root);
let mut cur_node = root.as_mut().last_leaf_edge().into_node();
// Iterate through all key-value pairs, pushing them into nodes at the right level.
for (key, value) in iter {
// Try to push key-value pair into the current leaf node.
@@ -1116,11 +1111,12 @@ impl<K: Ord, V> BTreeMap<K, V> {

self.length += 1;
}
Self::fix_right_edge(root)
}

fn fix_right_edge(&mut self) {
fn fix_right_edge(root: &mut node::Root<K, V>) {
// Handle underfull nodes, start from the top.
let mut cur_node = self.root.as_mut().unwrap().as_mut();
let mut cur_node = root.as_mut();
while let Internal(internal) = cur_node.force() {
// Check if right-most child is underfull.
let mut last_edge = internal.last_edge();
@@ -1179,16 +1175,17 @@ impl<K: Ord, V> BTreeMap<K, V> {
}

let total_num = self.len();
let left_root = self.root.as_mut().unwrap(); // unwrap succeeds because not empty

let mut right = Self::new();
let right_root = right.ensure_root_is_owned();
for _ in 0..(self.root.as_ref().unwrap().as_ref().height()) {
let right_root = Self::ensure_is_owned(&mut right.root);
for _ in 0..left_root.height() {
right_root.push_level();
}

{
let mut left_node = self.root.as_mut().unwrap().as_mut();
let mut right_node = right.root.as_mut().unwrap().as_mut();
let mut left_node = left_root.as_mut();
let mut right_node = right_root.as_mut();

loop {
let mut split_edge = match search::search_node(left_node, key) {
@@ -1214,12 +1211,10 @@ impl<K: Ord, V> BTreeMap<K, V> {
}
}

self.fix_right_border();
right.fix_left_border();
left_root.fix_right_border();
right_root.fix_left_border();

if self.root.as_ref().unwrap().as_ref().height()
< right.root.as_ref().unwrap().as_ref().height()
{
if left_root.height() < right_root.height() {
self.recalc_length();
right.length = total_num - self.len();
} else {
@@ -1301,69 +1296,6 @@ impl<K: Ord, V> BTreeMap<K, V> {

self.length = dfs(self.root.as_ref().unwrap().as_ref());
}

/// Removes empty levels on the top.
fn fix_top(&mut self) {
loop {
{
let node = self.root.as_ref().unwrap().as_ref();
if node.height() == 0 || node.len() > 0 {
break;
}
}
self.root.as_mut().unwrap().pop_level();
}
}

fn fix_right_border(&mut self) {
self.fix_top();

{
let mut cur_node = self.root.as_mut().unwrap().as_mut();

while let Internal(node) = cur_node.force() {
let mut last_kv = node.last_kv();

if last_kv.can_merge() {
cur_node = last_kv.merge().descend();
} else {
let right_len = last_kv.reborrow().right_edge().descend().len();
// `MINLEN + 1` to avoid readjust if merge happens on the next level.
if right_len < node::MIN_LEN + 1 {
last_kv.bulk_steal_left(node::MIN_LEN + 1 - right_len);
}
cur_node = last_kv.right_edge().descend();
}
}
}

self.fix_top();
}

/// The symmetric clone of `fix_right_border`.
fn fix_left_border(&mut self) {
self.fix_top();

{
let mut cur_node = self.root.as_mut().unwrap().as_mut();

while let Internal(node) = cur_node.force() {
let mut first_kv = node.first_kv();

if first_kv.can_merge() {
cur_node = first_kv.merge().descend();
} else {
let left_len = first_kv.reborrow().left_edge().descend().len();
if left_len < node::MIN_LEN + 1 {
first_kv.bulk_steal_right(node::MIN_LEN + 1 - left_len);
}
cur_node = first_kv.left_edge().descend();
}
}
}

self.fix_top();
}
}

#[stable(feature = "rust1", since = "1.0.0")]
@@ -2321,9 +2253,9 @@ impl<K, V> BTreeMap<K, V> {
}

/// If the root node is the empty (non-allocated) root node, allocate our
/// own node.
fn ensure_root_is_owned(&mut self) -> &mut node::Root<K, V> {
self.root.get_or_insert_with(node::Root::new_leaf)
/// own node. Is an associated function to avoid borrowing the entire BTreeMap.
fn ensure_is_owned(root: &mut Option<node::Root<K, V>>) -> &mut node::Root<K, V> {
root.get_or_insert_with(node::Root::new_leaf)
}
}

@@ -2825,6 +2757,65 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInter
}
}

impl<K, V> node::Root<K, V> {
/// Removes empty levels on the top, but keep an empty leaf if the entire tree is empty.
fn fix_top(&mut self) {
while self.height() > 0 && self.as_ref().len() == 0 {
self.pop_level();
}
}

fn fix_right_border(&mut self) {
self.fix_top();

{
let mut cur_node = self.as_mut();

while let Internal(node) = cur_node.force() {
let mut last_kv = node.last_kv();

if last_kv.can_merge() {
cur_node = last_kv.merge().descend();
} else {
let right_len = last_kv.reborrow().right_edge().descend().len();
// `MINLEN + 1` to avoid readjust if merge happens on the next level.
if right_len < node::MIN_LEN + 1 {
last_kv.bulk_steal_left(node::MIN_LEN + 1 - right_len);
}
cur_node = last_kv.right_edge().descend();
}
}
}

self.fix_top();
}

/// The symmetric clone of `fix_right_border`.
fn fix_left_border(&mut self) {
self.fix_top();

{
let mut cur_node = self.as_mut();

while let Internal(node) = cur_node.force() {
let mut first_kv = node.first_kv();

if first_kv.can_merge() {
cur_node = first_kv.merge().descend();
} else {
let left_len = first_kv.reborrow().left_edge().descend().len();
if left_len < node::MIN_LEN + 1 {
first_kv.bulk_steal_right(node::MIN_LEN + 1 - left_len);
}
cur_node = first_kv.left_edge().descend();
}
}
}

self.fix_top();
}
}

enum UnderflowResult<'a, K, V> {
AtRoot,
Merged(Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::Edge>, bool, usize),
5 changes: 5 additions & 0 deletions src/liballoc/collections/btree/node.rs
Original file line number Diff line number Diff line change
@@ -153,6 +153,11 @@ unsafe impl<K: Sync, V: Sync> Sync for Root<K, V> {}
unsafe impl<K: Send, V: Send> Send for Root<K, V> {}

impl<K, V> Root<K, V> {
/// Returns the number of levels below the root.
pub fn height(&self) -> usize {
self.height
}

/// Returns a new owned tree, with its own root node that is initially empty.
pub fn new_leaf() -> Self {
Root { node: BoxedNode::from_leaf(Box::new(unsafe { LeafNode::new() })), height: 0 }