diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-10 12:39:15 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:09:43 +0100 |
commit | 1c5f3b75f7e70e8608d6be442087857bd4a6b2cc (patch) | |
tree | 26a197f56bfbd0a0ffa819cf68a730abd88a6260 /src/dotty/tools/dotc/core/pickling/TreeBuffer.scala | |
parent | 41922c14bf1a45a3dcf7afca7719e0be84c2c29a (diff) | |
download | dotty-1c5f3b75f7e70e8608d6be442087857bd4a6b2cc.tar.gz dotty-1c5f3b75f7e70e8608d6be442087857bd4a6b2cc.tar.bz2 dotty-1c5f3b75f7e70e8608d6be442087857bd4a6b2cc.zip |
Add TASTY readers and printers for TASTy info.
So far printing is the only reader, ie. deserializer.
Numerous bugfixes to make first tests work.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/TreeBuffer.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/TreeBuffer.scala | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala index 73b944b92..a09b50119 100644 --- a/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala +++ b/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala @@ -16,7 +16,7 @@ class TreeBuffer extends TastyBuffer(1000000) { private var delta: Array[Int] = _ private var numOffsets = 0 - private def offset(i: Int): Addr = new Addr(offsets(i)) + private def offset(i: Int): Addr = Addr(offsets(i)) private def keepOffset(relative: Boolean): Unit = { if (numOffsets == offsets.length) { @@ -37,18 +37,20 @@ class TreeBuffer extends TastyBuffer(1000000) { def writeRef(target: Addr) = { keepOffset(relative = false) - writeNat(target.index) + fillAddr(reserveAddr(), target) } def fillRef(at: Addr, target: Addr, relative: Boolean) = { val addr = if (relative) target.relativeTo(at) else target fillAddr(at, addr) } - - def adjusted(x: Addr): Addr = { - val idx = bestFit(offsets, numOffsets, x.index - 1) - if (idx < 0) x else x - delta(idx) + + def deltaAt(at: Addr): Int = { + val idx = bestFit(offsets, numOffsets, at.index - 1) + if (idx < 0) 0 else delta(idx) } + + def adjusted(x: Addr): Addr = x - deltaAt(x) private def computeDeltas() = { delta = new Array[Int](numOffsets) @@ -65,20 +67,23 @@ class TreeBuffer extends TastyBuffer(1000000) { } } - private def adjustedOffset(at: Addr, isRelative: Boolean): Addr = { + private def adjustedOffset(i: Int): Addr = { + val at = offset(i) val original = getAddr(at) - if (isRelative) { - val start = skipNat(at).index - adjusted(original + start) - start + if (isRelative(i)) { + val start = skipNat(at) + val len1 = original + delta(i) - deltaAt(original + start.index) + val len2 = adjusted(original + start.index) - adjusted(start).index + assert(len1 == len2, + s"adjusting offset #$i: $at, original = $original, len1 = $len1, len2 = $len2") + len1 } else adjusted(original) } private def adjustOffsets(): Unit = { for (i <- 0 until numOffsets) { - val off = offset(i) - val original = getAddr(off) - val corrected = adjustedOffset(off, isRelative(i)) - fillAddr(off, corrected) + val corrected = adjustedOffset(i) + fillAddr(offset(i), corrected) } } @@ -87,7 +92,7 @@ class TreeBuffer extends TastyBuffer(1000000) { var lastDelta = 0 var i = 0 while (i < numOffsets) { - val corrected = adjustedOffset(offset(i), isRelative(i)) + val corrected = adjustedOffset(i) lastDelta += AddrWidth - TastyBuffer.natSize(corrected.index) delta1(i) = lastDelta i += 1 @@ -104,16 +109,19 @@ class TreeBuffer extends TastyBuffer(1000000) { var start = 0 var i = 0 var wasted = 0 + def shift(end: Int) = + Array.copy(bytes, start, bytes, start - lastDelta, end - start) while (i < numOffsets) { val next = offsets(i) - Array.copy(bytes, start, bytes, start - lastDelta, next - start) + shift(next) start = next + delta(i) - lastDelta - val pastZeroes = skipZeroes(new Addr(next)).index + val pastZeroes = skipZeroes(Addr(next)).index assert(pastZeroes >= start, s"something's wrong: eliminated non-zero") wasted += (pastZeroes - start) lastDelta = delta(i) i += 1 } + shift(length) length -= lastDelta wasted } @@ -121,12 +129,16 @@ class TreeBuffer extends TastyBuffer(1000000) { override def assemble(): Unit = { val origLength = length computeDeltas() - adjustOffsets() - if (false) { + //println(s"offsets: ${offsets.take(numOffsets).deep}") + //println(s"deltas: ${delta.take(numOffsets).deep}") + if (true) { var saved = 0 - do saved = adjustDeltas() - while (saved > 0 && length / saved < 100) + do { + saved = adjustDeltas() + println(s"adjusting deltas, saved = $saved") + } while (saved > 0 && length / saved < 100) } + adjustOffsets() val wasted = compress() println(s"original length: $origLength, compressed to: $length, wasted: $wasted") } |