summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2009-05-20 08:24:29 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2009-05-20 08:24:29 +0000
commiteb96cbb7bcb487b3b1c8aacad61c6594ff695b51 (patch)
tree61dea0fc18e7b103d8be7894480cd143b2f34626 /src
parent92be0221eac42864fdb4e60310758f4cae98a819 (diff)
downloadscala-eb96cbb7bcb487b3b1c8aacad61c6594ff695b51.tar.gz
scala-eb96cbb7bcb487b3b1c8aacad61c6594ff695b51.tar.bz2
scala-eb96cbb7bcb487b3b1c8aacad61c6594ff695b51.zip
more debugging code for teh NoSuchElementException
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala13
-rw-r--r--src/library/scala/collection/mutable/HashTable.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashMap.scala46
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))
}
}