From fbad1dc0b7b09c9fa4d03761734eee49d0145f3c Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 18 Mar 2015 21:53:11 +0100 Subject: Export pickler and pickled addresses so that other phases can pickle their info --- src/dotty/tools/dotc/CompilationUnit.scala | 6 +++++- src/dotty/tools/dotc/transform/Pickler.scala | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/CompilationUnit.scala b/src/dotty/tools/dotc/CompilationUnit.scala index 44f9b7e5a..c2cd9361c 100644 --- a/src/dotty/tools/dotc/CompilationUnit.scala +++ b/src/dotty/tools/dotc/CompilationUnit.scala @@ -1,8 +1,10 @@ package dotty.tools package dotc +import dotty.tools.dotc.core.pickling.{TastyBuffer, TastyPickler} import util.SourceFile import ast.{tpd, untpd} +import TastyBuffer._ class CompilationUnit(val source: SourceFile) { @@ -14,5 +16,7 @@ class CompilationUnit(val source: SourceFile) { def isJava = source.file.name.endsWith(".java") - var pickled: Array[Byte] = Array() + lazy val pickled: TastyPickler = new TastyPickler() + + var addrOfTree: tpd.Tree => Option[Addr] = (_ => None) } \ No newline at end of file diff --git a/src/dotty/tools/dotc/transform/Pickler.scala b/src/dotty/tools/dotc/transform/Pickler.scala index fb6b58e36..0d8acf38a 100644 --- a/src/dotty/tools/dotc/transform/Pickler.scala +++ b/src/dotty/tools/dotc/transform/Pickler.scala @@ -32,19 +32,19 @@ class Pickler extends Phase { pickling.println(i"unpickling in run ${ctx.runId}") if (ctx.settings.YtestPickler.value) beforePickling(unit) = tree.show - val pickler = new TastyPickler + val pickler = unit.pickled val treePkl = new TreePickler(pickler) treePkl.pickle(tree :: Nil) + unit.addrOfTree = treePkl.buf.addrOfTree if (tree.pos.exists) new PositionPickler(pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil, tree.pos) - unit.pickled = pickler.assembleParts() def rawBytes = // not needed right now, but useful to print raw format. - unit.pickled.iterator.grouped(10).toList.zipWithIndex.map { + unit.pickled.assembleParts().iterator.grouped(10).toList.zipWithIndex.map { case (row, i) => s"${i}0: ${row.mkString(" ")}" } // println(i"rawBytes = \n$rawBytes%\n%") // DEBUG - if (pickling ne noPrinter) new TastyPrinter(unit.pickled).printContents() + if (pickling ne noPrinter) new TastyPrinter(pickler.assembleParts()).printContents() } } @@ -60,7 +60,7 @@ class Pickler extends Phase { ctx.definitions.init val unpicklers = for (unit <- units) yield { - val unpickler = new DottyUnpickler(unit.pickled) + val unpickler = new DottyUnpickler(unit.pickled.assembleParts()) unpickler.enter(roots = Set()) unpickler } -- cgit v1.2.3 From 0d1396266c15c9bc88ea922a256a9c3709f33e7e Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 18 Mar 2015 23:07:35 +0100 Subject: Update address maps of symbols after compaction --- src/dotty/tools/dotc/core/pickling/TreePickler.scala | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala index f16cb50e6..4ffb3b1b9 100644 --- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala +++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala @@ -531,8 +531,16 @@ class TreePickler(pickler: TastyPickler) { withLength { pickleType(ann.symbol.typeRef); pickleTree(ann.tree) } } + def updateMapWithDeltas[T](mp: collection.mutable.Map[T, Addr]) = { + mp.map{ + case (key, addr) => (key, adjusted(addr)) + }.foreach(mp += _) + } + + trees.foreach(tree => if (!tree.isEmpty) pickleTree(tree)) assert(forwardSymRefs.isEmpty, i"unresolved symbols: ${forwardSymRefs.keySet.toList}%, %") compactify() - } + updateMapWithDeltas(symRefs) + } } -- cgit v1.2.3 From af6f37109e439d8accd66a30546e3d8cf626085b Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 18 Mar 2015 23:08:12 +0100 Subject: Populate addresses of symbols after pickler To allow other phases to generate their info. --- src/dotty/tools/dotc/CompilationUnit.scala | 4 ++++ src/dotty/tools/dotc/core/pickling/TreePickler.scala | 6 +++++- src/dotty/tools/dotc/transform/Pickler.scala | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/CompilationUnit.scala b/src/dotty/tools/dotc/CompilationUnit.scala index c2cd9361c..2f5f1202d 100644 --- a/src/dotty/tools/dotc/CompilationUnit.scala +++ b/src/dotty/tools/dotc/CompilationUnit.scala @@ -1,10 +1,12 @@ package dotty.tools package dotc +import dotty.tools.dotc.core.Types.Type import dotty.tools.dotc.core.pickling.{TastyBuffer, TastyPickler} import util.SourceFile import ast.{tpd, untpd} import TastyBuffer._ +import dotty.tools.dotc.core.Symbols._ class CompilationUnit(val source: SourceFile) { @@ -19,4 +21,6 @@ class CompilationUnit(val source: SourceFile) { lazy val pickled: TastyPickler = new TastyPickler() var addrOfTree: tpd.Tree => Option[Addr] = (_ => None) + + var addrOfSym: Symbol => Option[Addr] = (_ => None) } \ No newline at end of file diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala index 4ffb3b1b9..e23efd860 100644 --- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala +++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala @@ -26,7 +26,11 @@ class TreePickler(pickler: TastyPickler) { op fillRef(lengthAddr, currentAddr, relative = true) } - + + def addrOfSym(sym: Symbol): Option[Addr] = { + symRefs.get(sym) + } + private var makeSymbolicRefsTo: Symbol = NoSymbol /** All references to members of class `sym` are pickled diff --git a/src/dotty/tools/dotc/transform/Pickler.scala b/src/dotty/tools/dotc/transform/Pickler.scala index 0d8acf38a..953f69988 100644 --- a/src/dotty/tools/dotc/transform/Pickler.scala +++ b/src/dotty/tools/dotc/transform/Pickler.scala @@ -36,6 +36,7 @@ class Pickler extends Phase { val treePkl = new TreePickler(pickler) treePkl.pickle(tree :: Nil) unit.addrOfTree = treePkl.buf.addrOfTree + unit.addrOfSym = treePkl.addrOfSym if (tree.pos.exists) new PositionPickler(pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil, tree.pos) -- cgit v1.2.3 From 559701471e8c6e8a6bd18b141008dbf31c87ae9b Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 18 Mar 2015 23:27:03 +0100 Subject: Review of #394 --- src/dotty/tools/dotc/transform/NormalizeFlags.scala | 2 +- src/dotty/tools/dotc/transform/Pickler.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/transform/NormalizeFlags.scala b/src/dotty/tools/dotc/transform/NormalizeFlags.scala index fce2c3317..bdec800c7 100644 --- a/src/dotty/tools/dotc/transform/NormalizeFlags.scala +++ b/src/dotty/tools/dotc/transform/NormalizeFlags.scala @@ -15,7 +15,7 @@ import Flags._, Symbols._ * or alias type definition or a deferred val or def. */ class NormalizeFlags extends MiniPhaseTransform with SymTransformer { thisTransformer => - override def phaseName = "elimLocals" + override def phaseName = "normalizeFlags" def transformSym(ref: SymDenotation)(implicit ctx: Context) = { var newFlags = ref.flags &~ Local diff --git a/src/dotty/tools/dotc/transform/Pickler.scala b/src/dotty/tools/dotc/transform/Pickler.scala index 953f69988..c7a308f93 100644 --- a/src/dotty/tools/dotc/transform/Pickler.scala +++ b/src/dotty/tools/dotc/transform/Pickler.scala @@ -11,7 +11,7 @@ import Periods._ import Phases._ import collection.mutable -/** This miniphase pickles trees */ +/** This phase pickles trees */ class Pickler extends Phase { import ast.tpd._ -- cgit v1.2.3 From e47483aaf9469b4b29f747511a231ebf6e52aa94 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 25 Mar 2015 13:48:27 +0100 Subject: Address reviewer comments on #416 --- src/dotty/tools/dotc/CompilationUnit.scala | 19 +++++++++++++++++-- src/dotty/tools/dotc/core/pickling/TreePickler.scala | 8 ++------ src/dotty/tools/dotc/transform/Pickler.scala | 6 +++--- 3 files changed, 22 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/CompilationUnit.scala b/src/dotty/tools/dotc/CompilationUnit.scala index 2f5f1202d..de51a84cf 100644 --- a/src/dotty/tools/dotc/CompilationUnit.scala +++ b/src/dotty/tools/dotc/CompilationUnit.scala @@ -17,10 +17,25 @@ class CompilationUnit(val source: SourceFile) { var tpdTree: tpd.Tree = tpd.EmptyTree def isJava = source.file.name.endsWith(".java") - - lazy val pickled: TastyPickler = new TastyPickler() + /** + * Pickler used to create TASTY sections. + * Sections: Header, ASTs and Positions are populated by `pickler` phase. + * Subsequent phases can add new sections. + */ + lazy val pickler: TastyPickler = new TastyPickler() + + /** + * Addresses in TASTY file of trees, stored by pickling. + * Note that trees are checked for reference equality, + * so one can reliably use this function only dirrectly after `pickler` + */ var addrOfTree: tpd.Tree => Option[Addr] = (_ => None) + /** + * Addresses in TASTY file of symbols, stored by pickling. + * Note that trees are checked for reference equality, + * so one can reliably use this function only dirrectly after `pickler` + */ var addrOfSym: Symbol => Option[Addr] = (_ => None) } \ No newline at end of file diff --git a/src/dotty/tools/dotc/core/pickling/TreePickler.scala b/src/dotty/tools/dotc/core/pickling/TreePickler.scala index e23efd860..c5e07ffa9 100644 --- a/src/dotty/tools/dotc/core/pickling/TreePickler.scala +++ b/src/dotty/tools/dotc/core/pickling/TreePickler.scala @@ -535,12 +535,8 @@ class TreePickler(pickler: TastyPickler) { withLength { pickleType(ann.symbol.typeRef); pickleTree(ann.tree) } } - def updateMapWithDeltas[T](mp: collection.mutable.Map[T, Addr]) = { - mp.map{ - case (key, addr) => (key, adjusted(addr)) - }.foreach(mp += _) - } - + def updateMapWithDeltas[T](mp: collection.mutable.Map[T, Addr]) = + for (key <- mp.keysIterator.toBuffer[T]) mp(key) = adjusted(mp(key)) trees.foreach(tree => if (!tree.isEmpty) pickleTree(tree)) assert(forwardSymRefs.isEmpty, i"unresolved symbols: ${forwardSymRefs.keySet.toList}%, %") diff --git a/src/dotty/tools/dotc/transform/Pickler.scala b/src/dotty/tools/dotc/transform/Pickler.scala index c7a308f93..e238f21ef 100644 --- a/src/dotty/tools/dotc/transform/Pickler.scala +++ b/src/dotty/tools/dotc/transform/Pickler.scala @@ -32,7 +32,7 @@ class Pickler extends Phase { pickling.println(i"unpickling in run ${ctx.runId}") if (ctx.settings.YtestPickler.value) beforePickling(unit) = tree.show - val pickler = unit.pickled + val pickler = unit.pickler val treePkl = new TreePickler(pickler) treePkl.pickle(tree :: Nil) unit.addrOfTree = treePkl.buf.addrOfTree @@ -41,7 +41,7 @@ class Pickler extends Phase { new PositionPickler(pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil, tree.pos) def rawBytes = // not needed right now, but useful to print raw format. - unit.pickled.assembleParts().iterator.grouped(10).toList.zipWithIndex.map { + unit.pickler.assembleParts().iterator.grouped(10).toList.zipWithIndex.map { case (row, i) => s"${i}0: ${row.mkString(" ")}" } // println(i"rawBytes = \n$rawBytes%\n%") // DEBUG @@ -61,7 +61,7 @@ class Pickler extends Phase { ctx.definitions.init val unpicklers = for (unit <- units) yield { - val unpickler = new DottyUnpickler(unit.pickled.assembleParts()) + val unpickler = new DottyUnpickler(unit.pickler.assembleParts()) unpickler.enter(roots = Set()) unpickler } -- cgit v1.2.3