aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/NameBuffer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-08 10:06:43 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:09:43 +0100
commit340dc52a567de022c56acb1533c5772d21405f2a (patch)
treeae5dc41d2de3879d27abffc6413c18b25019e61b /src/dotty/tools/dotc/core/pickling/NameBuffer.scala
parent61cb51acaedbe603add8c4af9e390a27f8b33f09 (diff)
downloaddotty-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.scala74
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)
+ }
+ }
+}