@@ -13,6 +13,7 @@ import Symbols._
13
13
import Flags .Module
14
14
import reporting .ThrowingReporter
15
15
import collection .mutable
16
+ import scala .concurrent .ExecutionContext .global
16
17
17
18
object Pickler {
18
19
val name : String = " pickler"
@@ -45,6 +46,42 @@ class Pickler extends Phase {
45
46
clss.filterNot(companionModuleClasses.contains)
46
47
}
47
48
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
+
48
85
override def run (using Context ): Unit = {
49
86
val unit = ctx.compilationUnit
50
87
pickling.println(i " unpickling in run ${ctx.runId}" )
@@ -55,35 +92,20 @@ class Pickler extends Phase {
55
92
}
56
93
{
57
94
val pickler = new TastyPickler (cls)
58
- if ( ctx.settings.YtestPickler .value) {
95
+ if ctx.settings.YtestPickler .value then
59
96
beforePickling(cls) = tree.show
60
97
picklers(cls) = pickler
61
- }
62
98
val treePkl = pickler.treePkl
63
99
treePkl.pickle(tree :: Nil )
64
100
treePkl.compactify()
65
101
pickler.addrOfTree = treePkl.buf.addrOfTree
66
102
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))
87
109
}
88
110
}
89
111
0 commit comments