aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/core/tasty/TastyBuffer.scala')
-rw-r--r--src/dotty/tools/dotc/core/tasty/TastyBuffer.scala188
1 files changed, 0 insertions, 188 deletions
diff --git a/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala b/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
deleted file mode 100644
index 13bc95028..000000000
--- a/src/dotty/tools/dotc/core/tasty/TastyBuffer.scala
+++ /dev/null
@@ -1,188 +0,0 @@
-package dotty.tools
-package dotc
-package core
-package tasty
-
-import util.Util.dble
-
-object TastyBuffer {
-
- /** The number of digits of the natural number `nat`, written in base 128 format. */
- def natSize(nat: Int): Int =
- if (nat < 128) 1 else natSize(nat >>> 7) + 1
-
- /** An address pointing to an index in a Tasty buffer's byte array */
- case class Addr(index: Int) extends AnyVal {
- def - (delta: Int): Addr = Addr(this.index - delta)
- def + (delta: Int): Addr = Addr(this.index + delta)
-
- def relativeTo(base: Addr): Addr = this - base.index - AddrWidth
- }
-
- val NoAddr = Addr(-1)
-
- /** The maximal number of address bytes.
- * Since addresses are written as base-128 natural numbers,
- * the value of 4 gives a maximal array size of 256M.
- */
- final val AddrWidth = 4
-}
-import TastyBuffer._
-
-/** A byte array buffer that can be filled with bytes or natural numbers in TASTY format,
- * and that supports reading and patching addresses represented as natural numbers.
- */
-class TastyBuffer(initialSize: Int) {
-
- /** The current byte array, will be expanded as needed */
- var bytes = new Array[Byte](initialSize)
-
- /** The number of bytes written */
- var length = 0
-
- // -- Output routines --------------------------------------------
-
- /** Write a byte of data. */
- def writeByte(b: Int): Unit = {
- if (length >= bytes.length)
- bytes = dble(bytes)
- bytes(length) = b.toByte
- length += 1
- }
-
- /** Write the first `n` bytes of `data`. */
- def writeBytes(data: Array[Byte], n: Int): Unit = {
- while (bytes.length < length + n) bytes = dble(bytes)
- Array.copy(data, 0, bytes, length, n)
- length += n
- }
-
- /** Write a natural number in big endian format, base 128.
- * All but the last digits have bit 0x80 set.
- */
- def writeNat(x: Int): Unit =
- writeLongNat(x.toLong & 0x00000000FFFFFFFFL)
-
- /** Write a natural number in 2's complement big endian format, base 128.
- * All but the last digits have bit 0x80 set.
- */
- def writeInt(x: Int): Unit =
- writeLongInt(x)
-
- /**
- * Like writeNat, but for longs. Note that the
- * binary representation of LongNat is identical to Nat
- * if the long value is in the range Int.MIN_VALUE to
- * Int.MAX_VALUE.
- */
- def writeLongNat(x: Long): Unit = {
- def writePrefix(x: Long): Unit = {
- val y = x >>> 7
- if (y != 0L) writePrefix(y)
- writeByte((x & 0x7f).toInt)
- }
- val y = x >>> 7
- if (y != 0L) writePrefix(y)
- writeByte(((x & 0x7f) | 0x80).toInt)
- }
-
- /** Like writeInt, but for longs */
- def writeLongInt(x: Long): Unit = {
- def writePrefix(x: Long): Unit = {
- val y = x >> 7
- if (y != 0L - ((x >> 6) & 1)) writePrefix(y)
- writeByte((x & 0x7f).toInt)
- }
- val y = x >> 7
- if (y != 0L - ((x >> 6) & 1)) writePrefix(y)
- writeByte(((x & 0x7f) | 0x80).toInt)
- }
-
- /** Write an uncompressed Long stored in 8 bytes in big endian format */
- def writeUncompressedLong(x: Long): Unit = {
- var y = x
- val bytes = new Array[Byte](8)
- for (i <- 7 to 0 by -1) {
- bytes(i) = (y & 0xff).toByte
- y = y >>> 8
- }
- writeBytes(bytes, 8)
- }
-
- // -- Address handling --------------------------------------------
-
- /** Write natural number `x` right-adjusted in a field of `width` bytes
- * starting with address `at`.
- */
- def putNat(at: Addr, x: Int, width: Int): Unit = {
- var y = x
- var w = width
- if(at.index + w >= bytes.length)
- bytes = dble(bytes)
- var digit = y & 0x7f | 0x80
- while (w > 0) {
- w -= 1
- bytes(at.index + w) = digit.toByte
- y >>>= 7
- digit = y & 0x7f
- }
- assert(y == 0, s"number $x too large to fit in $width bytes")
- }
-
- /** The byte at given address */
- def getByte(at: Addr): Int = bytes(at.index)
-
- /** The natural number at address `at` */
- def getNat(at: Addr): Int = getLongNat(at).toInt
-
- /** The long natural number at address `at` */
- def getLongNat(at: Addr): Long = {
- var b = 0L
- var x = 0L
- var idx = at.index
- do {
- b = bytes(idx)
- x = (x << 7) | (b & 0x7f)
- idx += 1
- } while ((b & 0x80) == 0)
- x
- }
-
- /** The address (represented as a natural number) at address `at` */
- def getAddr(at: Addr) = Addr(getNat(at))
-
- /** The smallest address equal to or following `at` which points to a non-zero byte */
- final def skipZeroes(at: Addr): Addr =
- if (getByte(at) != 0) at else skipZeroes(at + 1)
-
- /** The address after the natural number found at address `at`. */
- final def skipNat(at: Addr): Addr = {
- val next = at + 1
- if ((getByte(at) & 0x80) != 0) next else skipNat(next)
- }
-
- /** The address referring to the end of data written so far */
- def currentAddr: Addr = Addr(length)
-
- /** Reserve `AddrWidth` bytes to write an address into */
- def reserveAddr(): Addr = {
- val result = currentAddr
- length += AddrWidth
- result
- }
-
- /** Fill reserved space at address `at` with address `target` */
- def fillAddr(at: Addr, target: Addr) =
- putNat(at, target.index, AddrWidth)
-
- /** Write address without leading zeroes */
- def writeAddr(addr: Addr): Unit = writeNat(addr.index)
-
- // -- Finalization --------------------------------------------
-
- /** Hook to be overridden in subclasses.
- * Perform all actions necessary to assemble the final byte array.
- * After `assemble` no more output actions to this buffer are permitted.
- */
- def assemble(): Unit = ()
-}