about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-02-17 16:18:54 +0000
committerbors <bors@rust-lang.org>2016-02-17 16:18:54 +0000
commit2051a92134bae8b4c5fd3fdeab32c78b7bd74014 (patch)
treeccc3515b6500cb008e3e75353919db104537b6e4 /src/libstd
parentb54770c24578311ad6cc782fcf1d0dc8cb41e997 (diff)
parentf890772383c900f9a409a4105df13b6630ebb1f5 (diff)
downloadrust-2051a92134bae8b4c5fd3fdeab32c78b7bd74014.tar.gz
rust-2051a92134bae8b4c5fd3fdeab32c78b7bd74014.zip
Auto merge of #31718 - apasel422:issue-31711, r=bluss
This changes the performance of `drop` from linear to constant time for such `HashMap`s.

Closes #31711.

r? @bluss
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/collections/hash/table.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/libstd/collections/hash/table.rs b/src/libstd/collections/hash/table.rs
index 316c7595266..97cab94b67b 100644
--- a/src/libstd/collections/hash/table.rs
+++ b/src/libstd/collections/hash/table.rs
@@ -12,6 +12,7 @@ use alloc::heap::{allocate, deallocate, EMPTY};
 
 use cmp;
 use hash::{Hash, Hasher, BuildHasher};
+use intrinsics::needs_drop;
 use marker;
 use mem::{align_of, size_of};
 use mem;
@@ -1009,7 +1010,9 @@ impl<K, V> Drop for RawTable<K, V> {
         // dropping empty tables such as on resize.
         // Also avoid double drop of elements that have been already moved out.
         unsafe {
-            for _ in self.rev_move_buckets() {}
+            if needs_drop::<(K, V)>() { // avoid linear runtime for types that don't need drop
+                for _ in self.rev_move_buckets() {}
+            }
         }
 
         let hashes_size = self.capacity * size_of::<u64>();