diff options
3 files changed, 37 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala index 833df01d83..0f610f2538 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala @@ -69,7 +69,7 @@ abstract class Pickler extends SubComponent { import scala.collection.mutable.LinkedHashMap private var entries = new Array[AnyRef](256) private var ep = 0 - private val index = new LinkedHashMap[AnyRef, Int] + private val index = new LinkedHashMap[AnyRef, (Int, Int)] /** Is symbol an existentially bound variable with a package as owner? * Such symbols should be treated as if they were local. @@ -108,13 +108,10 @@ abstract class Pickler extends SubComponent { entries = entries1 } entries(ep) = entry - // debug NoSuchElementException - index.saveTableStringIfResize(entry.hashCode()) - - index(entry) = ep + index(entry) = (ep, entry.hashCode()) // debug NoSuchElementException // debug NoSuchElementException if (index.get(entry) == None) { - println("could not add entry: "+ entry +"; "+ entry.hashCode()) + println("could not add entry: "+ entry) index.printHashTable(entry.hashCode()) } ep = ep + 1 @@ -469,10 +466,10 @@ abstract class Pickler extends SubComponent { */ private def writeRef(ref: AnyRef) { try { - writeNat(index(ref)) + writeNat(index(ref)._1) // debug NoSuchElementException } catch { case e: java.util.NoSuchElementException => - println("entry not found: "+ ref +"; "+ ref.hashCode()) + println("entry not found: "+ ref) index.printHashTable(ref.hashCode()) throw e } diff --git a/src/library/scala/collection/mutable/HashTable.scala b/src/library/scala/collection/mutable/HashTable.scala index 1cd4698b01..ce00ac6c8a 100644 --- a/src/library/scala/collection/mutable/HashTable.scala +++ b/src/library/scala/collection/mutable/HashTable.scala @@ -131,7 +131,7 @@ trait HashTable[A] extends AnyRef { private def newThreshold(size: Int) = ((size.toLong * loadFactor)/loadFactorDenum).toInt - private def resize(newSize: Int) = { + /* debug NoSuchElementException private*/ protected def resize(newSize: Int) = { val oldTable = table table = new Array(newSize) var i = oldTable.length - 1 diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala index 5c4132f72b..f2cdf99c5b 100644 --- a/src/library/scala/collection/mutable/LinkedHashMap.scala +++ b/src/library/scala/collection/mutable/LinkedHashMap.scala @@ -69,16 +69,30 @@ class LinkedHashMap[A, B] extends Map[A, B] override def elements = ordered.reverse.elements map {e => (e.key, e.value)} // debug NoSuchElementException in Pickler - var savedTableString = "" - def saveTableStringIfResize(hcode: Int) { - savedTableString = - if (tableSize + 1 > threshold) tableString(hcode) - else "" + var previousTables: List[(String, Int)] = Nil + + override protected def resize(newSize: Int) { + previousTables = (tableString(table), table.length) :: previousTables + super.resize(newSize) + // check consistency + for (i <- 0 until table.length) { + var e = table(i) + while (e != null) { + if (index(e.key.hashCode()) != i) { + println("INCONSISTENT entry at "+ i +" after resize. before:") + println("index before: "+ indx(e.key.hashCode(), previousTables.head._2)) + println(previousTables.head._1) + println("AFTER:") + println("index after: "+ index(e.key.hashCode())) + println(tableString(table)) + } + e = e.next + } + } } - def tableString(hcode: Int): String = { + def tableString(table: Array[HashEntry[A, Entry]]): String = { val sb = new StringBuilder - sb.append("index: "+ index(hcode) +"\n") for (i <- 0 until table.length) { sb.append(""+ i +": ") var e = table(i).asInstanceOf[Entry] @@ -91,14 +105,16 @@ class LinkedHashMap[A, B] extends Map[A, B] sb.toString } - def printHashTable(hcode: Int) { - if (savedTableString != "") { - println("BEFORE (add did a resize!)") - println(savedTableString) - println("AFTER") - } else { - println("TABLE after adding (no re-size was required)") + def indx(hash: Int, length: Int) = improve(hash) & (length - 1) + def printHashTable(notFoundHash: Int) { + println("Hash not found: "+ notFoundHash) + println("hashtables") + for (tb <- previousTables.reverse) { + println("with index: "+ indx(notFoundHash, tb._2)) + println(tb._1) + println(" ==> RESIZE, then:") } - println(tableString(hcode)) + println("with index: "+ index(notFoundHash)) + println(tableString(table)) } } |