diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-08 10:06:43 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:09:43 +0100 |
commit | 340dc52a567de022c56acb1533c5772d21405f2a (patch) | |
tree | ae5dc41d2de3879d27abffc6413c18b25019e61b /src/dotty/tools/dotc/core/pickling/NameBuffer.scala | |
parent | 61cb51acaedbe603add8c4af9e390a27f8b33f09 (diff) | |
download | dotty-340dc52a567de022c56acb1533c5772d21405f2a.tar.gz dotty-340dc52a567de022c56acb1533c5772d21405f2a.tar.bz2 dotty-340dc52a567de022c56acb1533c5772d21405f2a.zip |
First prototype of pickler.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/NameBuffer.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/NameBuffer.scala | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/NameBuffer.scala b/src/dotty/tools/dotc/core/pickling/NameBuffer.scala new file mode 100644 index 000000000..c9994ecb5 --- /dev/null +++ b/src/dotty/tools/dotc/core/pickling/NameBuffer.scala @@ -0,0 +1,74 @@ +package dotty.tools +package dotc +package core +package pickling + +import collection.mutable +import Names.{Name, chrs} +import Decorators._ +import TastyBuffer._ +import scala.io.Codec +import TastyName._ +import PickleFormat._ + +class NameBuffer extends TastyBuffer(100000) { + + private val nameRefs = new mutable.LinkedHashMap[TastyName, Ref] + + def nameIndex(name: TastyName): Ref = nameRefs.get(name) match { + case Some(ref) => + ref + case None => + val ref = new Ref(nameRefs.size) + nameRefs(name) = ref + ref + } + def nameIndex(name: Name): Ref = nameIndex(Simple(name.toTermName)) + def nameIndex(str: String): Ref = nameIndex(str.toTermName) + + private def withLength(op: => Unit): Unit = { + val lengthAddr = currentAddr + writeByte(0) + op + val length = currentAddr.index - lengthAddr.index - 1 + assert(length < 128) + putNat(lengthAddr, length, 1) + } + + def writeRef(ref: Ref) = writeNat(ref.index) + + def pickleName(name: TastyName): Unit = name match { + case Simple(name) => + val bytes = Codec.toUTF8(chrs, name.start, name.length) + writeByte(UTF8) + writeNat(bytes.length) + writeBytes(bytes, bytes.length) + case Qualified(qualified, selector) => + writeByte(QUALIFIED) + withLength { writeRef(qualified); writeRef(selector) } + case Signed(original, params, result) => + writeByte(SIGNED) + withLength { writeRef(original); writeRef(result); params.foreach(writeRef) } + case Expanded(original) => + writeByte(EXPANDED) + withLength { writeRef(original) } + case ModuleClass(module) => + writeByte(MODULECLASS) + withLength { writeRef(module) } + case SuperAccessor(accessed) => + writeByte(SUPERACCESSOR) + withLength { writeRef(accessed) } + case DefaultGetter(method, paramNumer) => + writeByte(DEFAULTGETTER) + withLength { writeRef(method); writeNat(paramNumer) } + } + + override def assemble(): Unit = { + var i = 0 + for ((name, ref) <- nameRefs) { + assert(ref.index == i) + i += 1 + pickleName(name) + } + } +} |