aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-10 12:39:15 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:09:43 +0100
commit1c5f3b75f7e70e8608d6be442087857bd4a6b2cc (patch)
tree26a197f56bfbd0a0ffa819cf68a730abd88a6260 /src/dotty/tools/dotc/core/pickling/TreeBuffer.scala
parent41922c14bf1a45a3dcf7afca7719e0be84c2c29a (diff)
downloaddotty-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.scala54
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")
}