@@ -13,6 +13,7 @@ import Symbols._
1313import Flags .Module
1414import reporting .ThrowingReporter
1515import collection .mutable
16+ import scala .concurrent .ExecutionContext .global
1617
1718object Pickler {
1819 val name : String = " pickler"
@@ -45,6 +46,42 @@ class Pickler extends Phase {
4546 clss.filterNot(companionModuleClasses.contains)
4647 }
4748
49+ class PickleCompleter :
50+ private var pickled : Array [Byte ] = null
51+
52+ def complete (pickler : TastyPickler , cls : ClassSymbol , tree : Tree )(using Context ): Unit =
53+ val treePkl = pickler.treePkl
54+ if tree.span.exists then
55+ new PositionPickler (pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil )
56+
57+ if ! ctx.settings.YdropComments .value then
58+ new CommentPickler (pickler, treePkl.buf.addrOfTree).pickleComment(tree)
59+
60+ val pickled = pickler.assembleParts()
61+
62+ def rawBytes = // not needed right now, but useful to print raw format.
63+ pickled.iterator.grouped(10 ).toList.zipWithIndex.map {
64+ case (row, i) => s " ${i}0: ${row.mkString(" " )}"
65+ }
66+
67+ synchronized {
68+ this .pickled = pickled
69+ // println(i"rawBytes = \n$rawBytes%\n%") // DEBUG
70+ if pickling ne noPrinter then
71+ pickling.synchronized {
72+ println(i " **** pickled info of $cls" )
73+ println(new TastyPrinter (pickled).printContents())
74+ }
75+ notifyAll()
76+ }
77+ end complete
78+
79+ def bytes : Array [Byte ] = synchronized {
80+ if pickled == null then wait()
81+ pickled
82+ }
83+ end PickleCompleter
84+
4885 override def run (using Context ): Unit = {
4986 val unit = ctx.compilationUnit
5087 pickling.println(i " unpickling in run ${ctx.runId}" )
@@ -55,35 +92,20 @@ class Pickler extends Phase {
5592 }
5693 {
5794 val pickler = new TastyPickler (cls)
58- if ( ctx.settings.YtestPickler .value) {
95+ if ctx.settings.YtestPickler .value then
5996 beforePickling(cls) = tree.show
6097 picklers(cls) = pickler
61- }
6298 val treePkl = pickler.treePkl
6399 treePkl.pickle(tree :: Nil )
64100 treePkl.compactify()
65101 pickler.addrOfTree = treePkl.buf.addrOfTree
66102 pickler.addrOfSym = treePkl.addrOfSym
67- if (tree.span.exists)
68- new PositionPickler (pickler, treePkl.buf.addrOfTree).picklePositions(tree :: Nil )
69-
70- if (! ctx.settings.YdropComments .value)
71- new CommentPickler (pickler, treePkl.buf.addrOfTree).pickleComment(tree)
72-
73- // other pickle sections go here.
74- val pickled = pickler.assembleParts()
75- unit.pickled += (cls -> pickled)
76-
77- def rawBytes = // not needed right now, but useful to print raw format.
78- pickled.iterator.grouped(10 ).toList.zipWithIndex.map {
79- case (row, i) => s " ${i}0: ${row.mkString(" " )}"
80- }
81-
82- // println(i"rawBytes = \n$rawBytes%\n%") // DEBUG
83- if (pickling ne noPrinter) {
84- println(i " **** pickled info of $cls" )
85- println(new TastyPrinter (pickled).printContents())
86- }
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))
87109 }
88110 }
89111
0 commit comments