Skip to content

Commit 7c8fea7

Browse files
committed
Merge pull request #416 from dotty-staging/pickler-modular
Populate addresses of symbols, types and trees after pickler
2 parents 63d1f86 + e47483a commit 7c8fea7

File tree

4 files changed

+43
-11
lines changed

4 files changed

+43
-11
lines changed

src/dotty/tools/dotc/CompilationUnit.scala

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package dotty.tools
22
package dotc
33

4+
import dotty.tools.dotc.core.Types.Type
5+
import dotty.tools.dotc.core.pickling.{TastyBuffer, TastyPickler}
46
import util.SourceFile
57
import ast.{tpd, untpd}
8+
import TastyBuffer._
9+
import dotty.tools.dotc.core.Symbols._
610

711
class CompilationUnit(val source: SourceFile) {
812

@@ -13,6 +17,25 @@ class CompilationUnit(val source: SourceFile) {
1317
var tpdTree: tpd.Tree = tpd.EmptyTree
1418

1519
def isJava = source.file.name.endsWith(".java")
16-
17-
var pickled: Array[Byte] = Array()
20+
21+
/**
22+
* Pickler used to create TASTY sections.
23+
* Sections: Header, ASTs and Positions are populated by `pickler` phase.
24+
* Subsequent phases can add new sections.
25+
*/
26+
lazy val pickler: TastyPickler = new TastyPickler()
27+
28+
/**
29+
* Addresses in TASTY file of trees, stored by pickling.
30+
* Note that trees are checked for reference equality,
31+
* so one can reliably use this function only dirrectly after `pickler`
32+
*/
33+
var addrOfTree: tpd.Tree => Option[Addr] = (_ => None)
34+
35+
/**
36+
* Addresses in TASTY file of symbols, stored by pickling.
37+
* Note that trees are checked for reference equality,
38+
* so one can reliably use this function only dirrectly after `pickler`
39+
*/
40+
var addrOfSym: Symbol => Option[Addr] = (_ => None)
1841
}

src/dotty/tools/dotc/core/pickling/TreePickler.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ class TreePickler(pickler: TastyPickler) {
2626
op
2727
fillRef(lengthAddr, currentAddr, relative = true)
2828
}
29-
29+
30+
def addrOfSym(sym: Symbol): Option[Addr] = {
31+
symRefs.get(sym)
32+
}
33+
3034
private var makeSymbolicRefsTo: Symbol = NoSymbol
3135

3236
/** All references to members of class `sym` are pickled
@@ -531,8 +535,12 @@ class TreePickler(pickler: TastyPickler) {
531535
withLength { pickleType(ann.symbol.typeRef); pickleTree(ann.tree) }
532536
}
533537

538+
def updateMapWithDeltas[T](mp: collection.mutable.Map[T, Addr]) =
539+
for (key <- mp.keysIterator.toBuffer[T]) mp(key) = adjusted(mp(key))
540+
534541
trees.foreach(tree => if (!tree.isEmpty) pickleTree(tree))
535542
assert(forwardSymRefs.isEmpty, i"unresolved symbols: ${forwardSymRefs.keySet.toList}%, %")
536543
compactify()
537-
}
544+
updateMapWithDeltas(symRefs)
545+
}
538546
}

src/dotty/tools/dotc/transform/NormalizeFlags.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import Flags._, Symbols._
1515
* or alias type definition or a deferred val or def.
1616
*/
1717
class NormalizeFlags extends MiniPhaseTransform with SymTransformer { thisTransformer =>
18-
override def phaseName = "elimLocals"
18+
override def phaseName = "normalizeFlags"
1919

2020
def transformSym(ref: SymDenotation)(implicit ctx: Context) = {
2121
var newFlags = ref.flags &~ Local

src/dotty/tools/dotc/transform/Pickler.scala

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Periods._
1111
import Phases._
1212
import collection.mutable
1313

14-
/** This miniphase pickles trees */
14+
/** This phase pickles trees */
1515
class Pickler extends Phase {
1616
import ast.tpd._
1717

@@ -32,19 +32,20 @@ class Pickler extends Phase {
3232
pickling.println(i"unpickling in run ${ctx.runId}")
3333
if (ctx.settings.YtestPickler.value) beforePickling(unit) = tree.show
3434

35-
val pickler = new TastyPickler
35+
val pickler = unit.pickler
3636
val treePkl = new TreePickler(pickler)
3737
treePkl.pickle(tree :: Nil)
38+
unit.addrOfTree = treePkl.buf.addrOfTree
39+
unit.addrOfSym = treePkl.addrOfSym
3840
if (tree.pos.exists)
3941
new PositionPickler(pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil, tree.pos)
4042

41-
unit.pickled = pickler.assembleParts()
4243
def rawBytes = // not needed right now, but useful to print raw format.
43-
unit.pickled.iterator.grouped(10).toList.zipWithIndex.map {
44+
unit.pickler.assembleParts().iterator.grouped(10).toList.zipWithIndex.map {
4445
case (row, i) => s"${i}0: ${row.mkString(" ")}"
4546
}
4647
// println(i"rawBytes = \n$rawBytes%\n%") // DEBUG
47-
if (pickling ne noPrinter) new TastyPrinter(unit.pickled).printContents()
48+
if (pickling ne noPrinter) new TastyPrinter(pickler.assembleParts()).printContents()
4849
}
4950
}
5051

@@ -60,7 +61,7 @@ class Pickler extends Phase {
6061
ctx.definitions.init
6162
val unpicklers =
6263
for (unit <- units) yield {
63-
val unpickler = new DottyUnpickler(unit.pickled)
64+
val unpickler = new DottyUnpickler(unit.pickler.assembleParts())
6465
unpickler.enter(roots = Set())
6566
unpickler
6667
}

0 commit comments

Comments
 (0)