aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-23 13:51:37 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:09 +0100
commit8fea2ef8368dc1bf82bb8064dd17368c38bb2347 (patch)
tree60b605f49adc839880fee922a08aca6d659dd074 /src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
parent4115edaa883f753b675373cbee4997e0cfb889e5 (diff)
downloaddotty-8fea2ef8368dc1bf82bb8064dd17368c38bb2347.tar.gz
dotty-8fea2ef8368dc1bf82bb8064dd17368c38bb2347.tar.bz2
dotty-8fea2ef8368dc1bf82bb8064dd17368c38bb2347.zip
Record pickled trees in a hashmap
The idea is that we want to use the mapping from tree to Addr in other sections, most immeditaely for positions, but it could be others as well.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/TreeBuffer.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/TreeBuffer.scala21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
index 287e2f334..c1eae5014 100644
--- a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
+++ b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
@@ -6,6 +6,7 @@ package pickling
import util.Util.{bestFit, dble}
import TastyBuffer.{Addr, AddrWidth}
import config.Printers.pickling
+import ast.tpd.Tree
class TreeBuffer extends TastyBuffer(1000000) {
@@ -16,6 +17,13 @@ class TreeBuffer extends TastyBuffer(1000000) {
private var isRelative = new Array[Boolean](initialOffsetSize)
private var delta: Array[Int] = _
private var numOffsets = 0
+
+ private[pickling] val pickledTrees = new java.util.IdentityHashMap[Tree, Any] // Value type is really Addr, but that's not compatible with null
+
+ def addrOfTree(tree: Tree): Option[Addr] = pickledTrees.get(tree) match {
+ case null => None
+ case n => Some(n.asInstanceOf[Addr])
+ }
private def offset(i: Int): Addr = Addr(offsets(i))
@@ -74,7 +82,7 @@ class TreeBuffer extends TastyBuffer(1000000) {
}
}
- /** The absoluate or relative adjusted address at index `i` of `offsets` array*/
+ /** The absolute or relative adjusted address at index `i` of `offsets` array*/
private def adjustedOffset(i: Int): Addr = {
val at = offset(i)
val original = getAddr(at)
@@ -140,13 +148,21 @@ class TreeBuffer extends TastyBuffer(1000000) {
wasted
}
+ def adjustPickledTrees(): Unit = {
+ val it = pickledTrees.keySet.iterator
+ while (it.hasNext) {
+ val tree = it.next
+ pickledTrees.put(tree, adjusted(pickledTrees.get(tree).asInstanceOf[Addr]))
+ }
+ }
+
/** Final assembly, involving the following steps:
* - compute deltas
* - adjust deltas until additional savings are < 1% of total
* - adjust offsets according to the adjusted deltas
* - shrink buffer, skipping zeroes.
*/
- override def assemble(): Unit = {
+ def compactify(): Unit = {
val origLength = length
computeDeltas()
//println(s"offsets: ${offsets.take(numOffsets).deep}")
@@ -157,6 +173,7 @@ class TreeBuffer extends TastyBuffer(1000000) {
pickling.println(s"adjusting deltas, saved = $saved")
} while (saved > 0 && length / saved < 100)
adjustOffsets()
+ adjustPickledTrees()
val wasted = compress()
pickling.println(s"original length: $origLength, compressed to: $length, wasted: $wasted") // DEBUG, for now.
}