Skip to content

Commit afa8a48

Browse files
committed
WIP
1 parent 199da83 commit afa8a48

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

src/reflect/scala/reflect/internal/util/ChromeTrace.scala

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import java.lang.management.ManagementFactory
55
import java.nio.file.{Files, Path}
66
import java.util.concurrent.TimeUnit
77

8+
import scala.collection.mutable
9+
810
object ChromeTrace {
911

1012
private object EventType {
@@ -27,24 +29,26 @@ object ChromeTrace {
2729
final class ChromeTrace(f: Path) extends Closeable {
2830
import ChromeTrace.EventType
2931
private val traceWriter = Files.newBufferedWriter(f)
32+
private val context = mutable.ArrayStack[JsonContext](TopContext)
33+
3034
objStart()
3135
fld("traceEvents")
36+
context.push(ValueContext)
3237
arrStart()
3338
traceWriter.write("\n")
3439

35-
private val pid = ManagementFactory.getRuntimeMXBean().getName()
40+
private val pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("@.*", "")
3641

3742
override def close(): Unit = {
38-
traceWriter.append("\n")
3943
arrEnd()
4044
objEnd()
45+
context.pop()
4146
traceWriter.close()
4247
}
4348

4449
def traceDurationEvent(name: String, startNanos: Long, durationNanos: Long, tid: String = this.tid()): Unit = {
4550
val durationMicros = nanosToMicros(durationNanos)
4651
val startMicros = nanosToMicros(startNanos)
47-
commaIfFirst()
4852
objStart()
4953
str("cat", "scalac")
5054
str("name", name)
@@ -58,7 +62,6 @@ final class ChromeTrace(f: Path) extends Closeable {
5862
}
5963

6064
def traceCounterEvent(name: String, counterName: String, count: Long): Unit = {
61-
commaIfFirst()
6265
objStart()
6366
str("cat", "scalac")
6467
str("name", name)
@@ -78,7 +81,6 @@ final class ChromeTrace(f: Path) extends Closeable {
7881
def traceDurationEventEnd(name: String, colour: String = ""): Unit = traceAsyncEvent(EventType.Finished, name, colour)
7982

8083
private def traceAsyncEvent(eventType: String, name: String, colour: String): Unit = {
81-
commaIfFirst()
8284
objStart()
8385
str("cat", "scalac")
8486
str("name", name)
@@ -99,14 +101,15 @@ final class ChromeTrace(f: Path) extends Closeable {
99101

100102
private def microTime(): Long = nanosToMicros(System.nanoTime())
101103

102-
private def commaIfFirst(): Unit = {
103-
if (firstEvent) firstEvent = false else traceWriter.write(",")
104-
}
105-
106-
private var firstEvent = true
104+
sealed abstract class JsonContext
105+
case class ArrayContext(var first: Boolean) extends JsonContext
106+
case class ObjectContext(var first: Boolean) extends JsonContext
107+
case object ValueContext extends JsonContext
108+
case object TopContext extends JsonContext
107109

108110
private def str(name: String, value: String): Unit = {
109111
fld(name)
112+
traceWriter.write("\"")
110113
traceWriter.write(value) // This assumes no escaping is needed
111114
traceWriter.write("\"")
112115
}
@@ -115,15 +118,40 @@ final class ChromeTrace(f: Path) extends Closeable {
115118
traceWriter.write(String.valueOf(value))
116119
traceWriter.write("")
117120
}
118-
private def objStart(): Unit = traceWriter.write("{")
119-
private def objEnd(): Unit = traceWriter.write("}")
120-
private def arrStart(): Unit = traceWriter.write("[")
121-
private def arrEnd(): Unit = traceWriter.write("]")
121+
private def objStart(): Unit = {
122+
context.top match {
123+
case ac @ ArrayContext(first) =>
124+
if (first) ac.first = false
125+
else traceWriter.write(",")
126+
case _ =>
127+
}
128+
context.push(ObjectContext(true))
129+
traceWriter.write("{")
130+
}
131+
private def objEnd(): Unit = {
132+
traceWriter.write("}")
133+
context.pop()
134+
}
135+
private def arrStart(): Unit = {
136+
traceWriter.write("[")
137+
context.push(ArrayContext(true))
138+
}
139+
private def arrEnd(): Unit = {
140+
traceWriter.write("]")
141+
context.pop()
142+
}
122143

123144
private def fld(name: String) = {
145+
context.top match {
146+
case oc @ ObjectContext(first) =>
147+
if (first) oc.first = false
148+
else traceWriter.write(",")
149+
case context =>
150+
throw new IllegalStateException("Wrong context: " + context)
151+
}
124152
traceWriter.write("\"")
125153
traceWriter.write(name)
126154
traceWriter.write("\"")
127-
traceWriter.write(": ")
155+
traceWriter.write(":")
128156
}
129157
}

0 commit comments

Comments
 (0)