about summary refs log tree commit diff
path: root/src/librustc_data_structures
diff options
context:
space:
mode:
authorljedrz <ljedrz@gmail.com>2018-07-12 15:41:24 +0200
committerljedrz <ljedrz@gmail.com>2018-07-14 07:31:19 +0200
commit384d04d31d35ef80324645d06e1afcf3ad48f4ed (patch)
treea5713d23376be716f80a92549c30e5308f786810 /src/librustc_data_structures
parentd334027c58060449cc45b8e5cc37dd51ca077d30 (diff)
downloadrust-384d04d31d35ef80324645d06e1afcf3ad48f4ed.tar.gz
rust-384d04d31d35ef80324645d06e1afcf3ad48f4ed.zip
Reduce the number of clone()s needed in obligation_forest
Some can be avoided by using remove_entry instead of remove.
Diffstat (limited to 'src/librustc_data_structures')
-rw-r--r--src/librustc_data_structures/obligation_forest/mod.rs11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs
index df34891ff03..0d6cf260dcd 100644
--- a/src/librustc_data_structures/obligation_forest/mod.rs
+++ b/src/librustc_data_structures/obligation_forest/mod.rs
@@ -496,9 +496,14 @@ impl<O: ForestObligation> ObligationForest<O> {
                     }
                 }
                 NodeState::Done => {
-                    self.waiting_cache.remove(self.nodes[i].obligation.as_predicate());
-                    // FIXME(HashMap): why can't I get my key back?
-                    self.done_cache.insert(self.nodes[i].obligation.as_predicate().clone());
+                    // Avoid cloning the key (predicate) in case it exists in the waiting cache
+                    if let Some((predicate, _)) = self.waiting_cache
+                        .remove_entry(self.nodes[i].obligation.as_predicate())
+                    {
+                        self.done_cache.insert(predicate);
+                    } else {
+                        self.done_cache.insert(self.nodes[i].obligation.as_predicate().clone());
+                    }
                     node_rewrites[i] = nodes_len;
                     dead_nodes += 1;
                 }