From 1d6f5f7f33f9e4be29553cb7ef1e6f054a64dc6b Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 27 Mar 2017 21:47:07 +0200 Subject: Streamline pickling and unpickling of names --- compiler/src/dotty/tools/dotc/core/NameExtractors.scala | 10 ++++++++-- .../src/dotty/tools/dotc/core/tasty/NameBuffer.scala | 16 ++++------------ .../src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala | 16 ++++++---------- 3 files changed, 18 insertions(+), 24 deletions(-) (limited to 'compiler') diff --git a/compiler/src/dotty/tools/dotc/core/NameExtractors.scala b/compiler/src/dotty/tools/dotc/core/NameExtractors.scala index eaac30bf5..f84ee565d 100644 --- a/compiler/src/dotty/tools/dotc/core/NameExtractors.scala +++ b/compiler/src/dotty/tools/dotc/core/NameExtractors.scala @@ -7,9 +7,12 @@ import StdNames._ import util.DotClass import tasty.TastyFormat._ import Decorators._ +import collection.mutable object NameExtractors { + private val extractors = new mutable.HashMap[Int, ClassifiedNameExtractor] + abstract class NameInfo extends DotClass { def tag: Int def mkString(underlying: TermName): String @@ -41,6 +44,7 @@ object NameExtractors { case DerivedTermName(underlying, `info`) => Some(underlying) case _ => None } + extractors(tag) = this } class PrefixNameExtractor(tag: Int, prefix: String, infoString: String) extends ClassifiedNameExtractor(tag, infoString) { @@ -73,8 +77,8 @@ object NameExtractors { } object AnyQualifiedName { - def unapply(name: DerivedTermName): Option[(TermName, QualifiedNameExtractor # QualInfo)] = name match { - case DerivedTermName(qual, info: QualifiedNameExtractor # QualInfo) => + def unapply(name: DerivedTermName): Option[(TermName, QualifiedInfo)] = name match { + case DerivedTermName(qual, info: QualifiedInfo) => Some((name.underlying, info)) case _ => None } @@ -143,6 +147,8 @@ object NameExtractors { def definesNewName(tag: Int) = tag <= TraitSetterName.tag + def extractorOfTag(tag: Int) = extractors(tag) + val separatorToQualified: Map[String, QualifiedNameExtractor] = Map("." -> QualifiedName, "$" -> FlattenedName, diff --git a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala index a09a21964..df43eabb2 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/NameBuffer.scala @@ -58,26 +58,18 @@ class NameBuffer extends TastyBuffer(10000) { else Codec.toUTF8(chrs, name.start, name.length) writeNat(bytes.length) writeBytes(bytes, bytes.length) - case QualifiedName(qualified, selector) => - withLength { writeNameRef(qualified); writeNameRef(selector) } - case FlattenedName(qualified, selector) => - withLength { writeNameRef(qualified); writeNameRef(selector) } - case ExpandedName(prefix, original) => - withLength { writeNameRef(prefix); writeNameRef(original) } + case AnyQualifiedName(prefix, info) => + withLength { writeNameRef(prefix); writeNameRef(info.name) } case SignedName(original, Signature(params, result)) => withLength( { writeNameRef(original); writeNameRef(result); params.foreach(writeNameRef) }, if ((params.length + 2) * maxIndexWidth <= maxNumInByte) 1 else 2) - case ModuleClassName(module) => - withLength { writeNameRef(module) } - case SuperAccessorName(accessed) => - withLength { writeNameRef(accessed) } case DefaultGetterName(method, paramNumber) => withLength { writeNameRef(method); writeNat(paramNumber) } - case ShadowedName(original) => - withLength { writeNameRef(original) } case VariantName(original, sign) => withLength { writeNameRef(original); writeNat(sign + 1) } + case DerivedTermName(original, info) => + withLength { writeNameRef(original) } } } diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala index d20e890c2..7ebf3a2ea 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala @@ -55,6 +55,10 @@ class TastyUnpickler(reader: TastyReader) { FlattenedName(readName(), readName().asSimpleName) case EXPANDED => ExpandedName(readName(), readName().asSimpleName) + case DEFAULTGETTER => + DefaultGetterName(readName(), readNat()) + case VARIANT => + VariantName(readName(), readNat() - 1) case SIGNED => val original = readName() val result = readName().toTypeName @@ -62,16 +66,8 @@ class TastyUnpickler(reader: TastyReader) { var sig = Signature(params, result) if (sig == Signature.NotAMethod) sig = Signature.NotAMethod SignedName(original, sig) - case OBJECTCLASS => - ModuleClassName(readName()) - case SUPERACCESSOR => - SuperAccessorName(readName()) - case DEFAULTGETTER => - DefaultGetterName(readName(), readNat()) - case SHADOWED => - ShadowedName(readName()) - case VARIANT => - VariantName(readName(), readNat() - 1) + case _ => + extractorOfTag(tag)(readName()) } assert(currentAddr == end, s"bad name $result $start $currentAddr $end") result -- cgit v1.2.3