Merge pull request #6421 from phausler/dictionary_bridge_perf

Add a fast-path case for enumeration of keys and objects for bridged Dictionaries
diff --git a/stdlib/public/core/HashedCollections.swift.gyb b/stdlib/public/core/HashedCollections.swift.gyb
index 4fdb970..703535f 100644
--- a/stdlib/public/core/HashedCollections.swift.gyb
+++ b/stdlib/public/core/HashedCollections.swift.gyb
@@ -3563,6 +3563,23 @@
   ) {
     bridgedAllKeysAndValues(objects, keys)
   }
+
+  @objc(enumerateKeysAndObjectsWithOptions:usingBlock:)
+  internal func enumerateKeysAndObjects(options: Int, 
+    using block: @convention(block) (Unmanaged<AnyObject>, Unmanaged<AnyObject>,
+     UnsafeMutablePointer<UInt8>) -> Void) {
+    bridgeEverything()
+    let capacity = nativeBuffer.capacity
+    var stop: UInt8 = 0
+    for position in 0..<capacity {
+      if bridgedBuffer.isInitializedEntry(at: position) {
+        block(Unmanaged.passUnretained(bridgedBuffer.key(at: position)), 
+          Unmanaged.passUnretained(bridgedBuffer.value(at: position)), 
+          &stop)
+      }
+      if stop != 0 { return }
+    }
+  }
 %end
 
   /// Returns the pointer to the stored property, which contains bridged