Skip to content

Commit cc648bf

Browse files
authored
Merge pull request scala#6653 from retronym/topic/names-names-names
Make ClassfileParser more efficient, lazy, and less cycle prone. [ci: last-only]
2 parents 221cd1b + 4686e30 commit cc648bf

24 files changed

+679
-350
lines changed

project/VersionUtil.scala

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import Keys._
55
import java.util.{Date, Locale, Properties, TimeZone}
66
import java.io.{File, FileInputStream}
77
import java.text.SimpleDateFormat
8+
import java.time.Instant
9+
import java.time.format.DateTimeFormatter
10+
import java.time.temporal.{TemporalAccessor, TemporalQueries, TemporalQuery}
811

912
import scala.collection.JavaConverters._
1013
import BuildSettings.autoImport._
@@ -71,8 +74,21 @@ object VersionUtil {
7174
val db = new FileRepositoryBuilder().findGitDir.build
7275
val head = db.resolve("HEAD")
7376
if (head eq null) {
74-
log.info("No git HEAD commit found -- Using current date and 'unknown' SHA")
75-
(new Date, "unknown")
77+
import scala.sys.process._
78+
try {
79+
// Workaround lack of git worktree support in JGit https://bugs.eclipse.org/bugs/show_bug.cgi?id=477475
80+
val sha = List("git", "rev-parse", "HEAD").!!.trim
81+
val commitDateIso = List("git", "log", "-1", "--format=%cI", "HEAD").!!.trim
82+
val date = java.util.Date.from(DateTimeFormatter.ISO_DATE_TIME.parse(commitDateIso, new TemporalQuery[Instant] {
83+
override def queryFrom(temporal: TemporalAccessor): Instant = Instant.from(temporal)
84+
}))
85+
(date, sha.substring(0, 7))
86+
} catch {
87+
case ex: Exception =>
88+
ex.printStackTrace()
89+
log.info("No git HEAD commit found -- Using current date and 'unknown' SHA")
90+
(new Date, "unknown")
91+
}
7692
} else {
7793
val commit = new RevWalk(db).parseCommit(head)
7894
(new Date(commit.getCommitTime.toLong * 1000L), commit.getName.substring(0, 7))

src/compiler/scala/tools/nsc/Global.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,9 @@ class Global(var currentSettings: Settings, reporter0: LegacyReporter)
15501550

15511551
reporting.summarizeErrors()
15521552

1553+
// val allNamesArray: Array[String] = allNames().map(_.toString).toArray.sorted
1554+
// allNamesArray.foreach(println(_))
1555+
15531556
if (traceSymbolActivity)
15541557
units map (_.body) foreach (traceSymbols recordSymbolsInTree _)
15551558

@@ -1577,6 +1580,8 @@ class Global(var currentSettings: Settings, reporter0: LegacyReporter)
15771580

15781581
// Clear any sets or maps created via perRunCaches.
15791582
perRunCaches.clearAll()
1583+
if (settings.verbose)
1584+
println("Name table size after compilation: " + nameTableSize + " chars")
15801585
}
15811586

15821587
/** Compile list of abstract files. */

src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
package scala.tools.nsc
1414
package symtab
1515

16-
import classfile.ClassfileParser
16+
import classfile.{ClassfileParser, ReusableDataReader}
1717
import java.io.IOException
1818
import scala.reflect.internal.MissingRequirementError
1919
import scala.reflect.io.{AbstractFile, NoAbstractFile}
2020
import scala.tools.nsc.util.{ClassPath, ClassRepresentation}
21-
import scala.reflect.internal.util.StatisticsStatics
21+
import scala.reflect.internal.util.{ReusableInstance, StatisticsStatics}
2222

2323
/** This class ...
2424
*
@@ -294,11 +294,11 @@ abstract class SymbolLoaders {
294294
}
295295
}
296296
}
297-
297+
private val classFileDataReader: ReusableInstance[ReusableDataReader] = new ReusableInstance[ReusableDataReader](() => new ReusableDataReader())
298298
class ClassfileLoader(val classfile: AbstractFile, clazz: ClassSymbol, module: ModuleSymbol) extends SymbolLoader with FlagAssigningCompleter {
299299
private object classfileParser extends {
300300
val symbolTable: SymbolLoaders.this.symbolTable.type = SymbolLoaders.this.symbolTable
301-
} with ClassfileParser {
301+
} with ClassfileParser(classFileDataReader) {
302302
override protected def lookupMemberAtTyperPhaseIfPossible(sym: Symbol, name: Name): Symbol =
303303
SymbolLoaders.this.lookupMemberAtTyperPhaseIfPossible(sym, name)
304304
/*

src/compiler/scala/tools/nsc/symtab/classfile/AbstractFileReader.scala

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ package scala.tools.nsc
1414
package symtab
1515
package classfile
1616

17-
import java.lang.Float.intBitsToFloat
17+
import java.io.{ByteArrayInputStream, DataInputStream}
1818
import java.lang.Double.longBitsToDouble
19+
import java.lang.Float.intBitsToFloat
20+
import java.util
1921

2022
import scala.tools.nsc.io.AbstractFile
2123

@@ -25,11 +27,13 @@ import scala.tools.nsc.io.AbstractFile
2527
* @author Philippe Altherr
2628
* @version 1.0, 23/03/2004
2729
*/
28-
class AbstractFileReader(val file: AbstractFile) {
30+
final class AbstractFileReader(buf0: Array[Byte]) extends DataReader {
31+
private[this] var buf = buf0
2932

30-
/** the buffer containing the file
31-
*/
32-
val buf: Array[Byte] = file.toByteArray
33+
@deprecated("Use other constructor", "2.13.0")
34+
def this(file: AbstractFile) {
35+
this(file.toByteArray)
36+
}
3337

3438
/** the current input pointer
3539
*/
@@ -62,17 +66,25 @@ class AbstractFileReader(val file: AbstractFile) {
6266
((nextByte & 0xff) << 24) + ((nextByte & 0xff) << 16) +
6367
((nextByte & 0xff) << 8) + (nextByte & 0xff)
6468

69+
/** extract a byte at position bp from buf
70+
*/
71+
def getByte(mybp: Int): Byte =
72+
buf(mybp)
73+
74+
def getBytes(mybp: Int, bytes: Array[Byte]): Unit = {
75+
System.arraycopy(buf, mybp, bytes, 0, bytes.length)
76+
}
6577

6678
/** extract a character at position bp from buf
6779
*/
6880
def getChar(mybp: Int): Char =
69-
(((buf(mybp) & 0xff) << 8) + (buf(mybp+1) & 0xff)).toChar
81+
(((getByte(mybp) & 0xff) << 8) + (getByte(mybp+1) & 0xff)).toChar
7082

7183
/** extract an integer at position bp from buf
7284
*/
7385
def getInt(mybp: Int): Int =
74-
((buf(mybp ) & 0xff) << 24) + ((buf(mybp+1) & 0xff) << 16) +
75-
((buf(mybp+2) & 0xff) << 8) + (buf(mybp+3) & 0xff)
86+
((getByte(mybp) & 0xff) << 24) + ((getByte(mybp + 1) & 0xff) << 16) +
87+
((getByte(mybp + 2) & 0xff) << 8) + (getByte(mybp + 3) & 0xff)
7688

7789
/** extract a long integer at position bp from buf
7890
*/
@@ -87,8 +99,11 @@ class AbstractFileReader(val file: AbstractFile) {
8799
*/
88100
def getDouble(mybp: Int): Double = longBitsToDouble(getLong(mybp))
89101

102+
def getUTF(mybp: Int, len: Int): String = {
103+
new DataInputStream(new ByteArrayInputStream(buf, mybp, len)).readUTF
104+
}
105+
90106
/** skip next 'n' bytes
91107
*/
92108
def skip(n: Int): Unit = { bp += n }
93-
94109
}

0 commit comments

Comments
 (0)