aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-04-29 10:36:16 +0200
committerMartin Odersky <odersky@gmail.com>2015-05-02 19:23:08 +0200
commit60ab9f8f525d319aa5b6d5052018c6781da036eb (patch)
treefbc5096a1f7193a4970226a7ad6f03fbf7670a4b /src/dotty/tools/dotc/core/tasty/NameBuffer.scala
parentac46a0e4489bba4f76863cc1491bf2b8441ed1cb (diff)
downloaddotty-60ab9f8f525d319aa5b6d5052018c6781da036eb.tar.gz
dotty-60ab9f8f525d319aa5b6d5052018c6781da036eb.tar.bz2
dotty-60ab9f8f525d319aa5b6d5052018c6781da036eb.zip
Pickling modularization reorg
The pickling package got rather large and confusing with three separate tasks that each had their own conventions: read JVM classfiles, read Scala2 pickle info, read Tasty. The classes for each task are now in separate packages.
Diffstat (limited to 'src/dotty/tools/dotc/core/tasty/NameBuffer.scala')
-rw-r--r--src/dotty/tools/dotc/core/tasty/NameBuffer.scala93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/tasty/NameBuffer.scala b/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
new file mode 100644
index 000000000..69fd63805
--- /dev/null
+++ b/src/dotty/tools/dotc/core/tasty/NameBuffer.scala
@@ -0,0 +1,93 @@
+package dotty.tools
+package dotc
+package core
+package tasty
+
+import collection.mutable
+import Names.{Name, chrs}
+import Decorators._, NameOps._
+import TastyBuffer._
+import scala.io.Codec
+import TastyName._
+import TastyFormat._
+
+class NameBuffer extends TastyBuffer(10000) {
+
+ private val nameRefs = new mutable.LinkedHashMap[TastyName, NameRef]
+
+ def nameIndex(name: TastyName): NameRef = nameRefs.get(name) match {
+ case Some(ref) =>
+ ref
+ case None =>
+ val ref = NameRef(nameRefs.size)
+ nameRefs(name) = ref
+ ref
+ }
+ def nameIndex(name: Name): NameRef = {
+ val tname =
+ if (name.isShadowedName) Shadowed(nameIndex(name.revertShadowed))
+ else Simple(name.toTermName)
+ nameIndex(tname)
+ }
+
+ def nameIndex(str: String): NameRef = nameIndex(str.toTermName)
+
+ def fullNameIndex(name: Name): NameRef = {
+ val pos = name.lastIndexOf('.')
+ if (pos > 0)
+ nameIndex(Qualified(fullNameIndex(name.take(pos)), nameIndex(name.drop(pos + 1))))
+ else
+ nameIndex(name)
+ }
+
+ 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 writeNameRef(ref: NameRef) = writeNat(ref.index)
+
+ def pickleName(name: TastyName): Unit = name match {
+ case Simple(name) =>
+ val bytes =
+ if (name.length == 0) new Array[Byte](0)
+ else Codec.toUTF8(chrs, name.start, name.length)
+ writeByte(UTF8)
+ writeNat(bytes.length)
+ writeBytes(bytes, bytes.length)
+ case Qualified(qualified, selector) =>
+ writeByte(QUALIFIED)
+ withLength { writeNameRef(qualified); writeNameRef(selector) }
+ case Signed(original, params, result) =>
+ writeByte(SIGNED)
+ withLength { writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) }
+ case Expanded(prefix, original) =>
+ writeByte(EXPANDED)
+ withLength { writeNameRef(prefix); writeNameRef(original) }
+ case ModuleClass(module) =>
+ writeByte(OBJECTCLASS)
+ withLength { writeNameRef(module) }
+ case SuperAccessor(accessed) =>
+ writeByte(SUPERACCESSOR)
+ withLength { writeNameRef(accessed) }
+ case DefaultGetter(method, paramNumber) =>
+ writeByte(DEFAULTGETTER)
+ withLength { writeNameRef(method); writeNat(paramNumber) }
+ case Shadowed(original) =>
+ writeByte(SHADOWED)
+ withLength { writeNameRef(original) }
+ }
+
+ override def assemble(): Unit = {
+ var i = 0
+ for ((name, ref) <- nameRefs) {
+ assert(ref.index == i)
+ i += 1
+ pickleName(name)
+ }
+ }
+}