Skip to content

Commit c2755f1

Browse files
committed
Use a Future to implement pickling completion
1 parent bad120f commit c2755f1

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

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

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import Symbols._
1313
import Flags.Module
1414
import reporting.ThrowingReporter
1515
import collection.mutable
16-
import scala.concurrent.ExecutionContext.global
16+
import scala.concurrent.{Future, Await, ExecutionContext}
17+
import scala.concurrent.duration.Duration
1718

1819
object Pickler {
1920
val name: String = "pickler"
@@ -100,12 +101,31 @@ class Pickler extends Phase {
100101
treePkl.compactify()
101102
pickler.addrOfTree = treePkl.buf.addrOfTree
102103
pickler.addrOfSym = treePkl.addrOfSym
103-
val completer = PickleCompleter()
104-
if ctx.settings.YtestPickler.value then
105-
completer.complete(pickler, cls, tree)
106-
else
107-
global.execute(() => completer.complete(pickler, cls, tree))
108-
unit.pickled += (cls -> (() => completer.bytes))
104+
val pickledF = Future {
105+
if tree.span.exists then
106+
new PositionPickler(pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil)
107+
108+
if !ctx.settings.YdropComments.value then
109+
new CommentPickler(pickler, treePkl.buf.addrOfTree).pickleComment(tree)
110+
111+
val pickled = pickler.assembleParts()
112+
113+
def rawBytes = // not needed right now, but useful to print raw format.
114+
pickled.iterator.grouped(10).toList.zipWithIndex.map {
115+
case (row, i) => s"${i}0: ${row.mkString(" ")}"
116+
}
117+
118+
// println(i"rawBytes = \n$rawBytes%\n%") // DEBUG
119+
if pickling ne noPrinter then
120+
pickling.synchronized {
121+
println(i"**** pickled info of $cls")
122+
println(new TastyPrinter(pickled).printContents())
123+
}
124+
pickled
125+
}(using ExecutionContext.global)
126+
def force(): Array[Byte] = Await.result(pickledF, Duration.Inf)
127+
if ctx.settings.YtestPickler.value then force()
128+
unit.pickled += (cls -> force)
109129
}
110130
}
111131

0 commit comments

Comments
 (0)