diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-23 13:51:37 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:09 +0100 |
commit | 8fea2ef8368dc1bf82bb8064dd17368c38bb2347 (patch) | |
tree | 60b605f49adc839880fee922a08aca6d659dd074 /src/dotty/tools/dotc/core/pickling/TreeBuffer.scala | |
parent | 4115edaa883f753b675373cbee4997e0cfb889e5 (diff) | |
download | dotty-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.scala | 21 |
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. } |