stdlib: disable HashMap views caching because it leads to memory leaks

due to reference cycles
This commit is contained in:
Svyatoslav Scherbina
2016-12-30 13:51:52 +07:00
committed by SvyatoslavScherbina
parent 5d8a28e5fc
commit d1892a35ba
@@ -13,9 +13,9 @@ class HashMap<K, V> private constructor(
override var size: Int = 0 override var size: Int = 0
private set private set
private var keysView: HashSet<K>? = null // private var keysView: HashSet<K>? = null
private var valuesView: HashMapValues<V>? = null // private var valuesView: HashMapValues<V>? = null
private var entriesView: HashMapEntrySet<K, V>? = null // private var entriesView: HashMapEntrySet<K, V>? = null
// ---------------------------- functions ---------------------------- // ---------------------------- functions ----------------------------
@@ -85,30 +85,45 @@ class HashMap<K, V> private constructor(
} }
override val keys: MutableSet<K> get() { override val keys: MutableSet<K> get() {
val cur = keysView return HashSet(this)
return if (cur == null) {
val new = HashSet(this) // Caching creates a reference cycle and thus leads to memory leaks;
keysView = new // TODO: fix and enable.
new
} else cur // val cur = keysView
// return if (cur == null) {
// val new = HashSet(this)
// keysView = new
// new
// } else cur
} }
override val values: MutableCollection<V> get() { override val values: MutableCollection<V> get() {
val cur = valuesView return HashMapValues(this)
return if (cur == null) {
val new = HashMapValues(this) // Caching creates a reference cycle and thus leads to memory leaks;
valuesView = new // TODO: fix and enable.
new
} else cur // val cur = valuesView
// return if (cur == null) {
// val new = HashMapValues(this)
// valuesView = new
// new
// } else cur
} }
override val entries: MutableSet<MutableMap.MutableEntry<K, V>> get() { override val entries: MutableSet<MutableMap.MutableEntry<K, V>> get() {
val cur = entriesView return HashMapEntrySet(this)
return if (cur == null) {
val new = HashMapEntrySet(this) // Caching creates a reference cycle and thus leads to memory leaks;
entriesView = new // TODO: fix and enable.
return new
} else cur // val cur = entriesView
// return if (cur == null) {
// val new = HashMapEntrySet(this)
// entriesView = new
// return new
// } else cur
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {