Skip to content

Commit 6a728eb

Browse files
committed
Make ClassfileConstants thread-safe.
1 parent 0c4ca21 commit 6a728eb

File tree

2 files changed

+29
-34
lines changed

2 files changed

+29
-34
lines changed

src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -329,55 +329,50 @@ object ClassfileConstants {
329329
final val impdep1 = 0xfe
330330
final val impdep2 = 0xff
331331

332+
import Flags._
332333
abstract class FlagTranslation {
333-
import Flags._
334334

335-
private var isAnnotation = false
336-
private var isClass = false
337-
private def initFields(flags: Int) = {
338-
isAnnotation = (flags & JAVA_ACC_ANNOTATION) != 0
339-
isClass = false
340-
}
335+
protected def baseFlags(jflags: Int) = EmptyFlags
336+
protected def isClass: Boolean = false
341337

342338
private def translateFlag(jflag: Int): FlagSet = (jflag: @switch) match {
343339
case JAVA_ACC_PRIVATE => Private
344340
case JAVA_ACC_PROTECTED => Protected
345341
case JAVA_ACC_FINAL => Final
346342
case JAVA_ACC_SYNTHETIC => Synthetic
347343
case JAVA_ACC_STATIC => JavaStatic
348-
case JAVA_ACC_ABSTRACT => if (isAnnotation) EmptyFlags else if (isClass) Abstract else Deferred
349-
case JAVA_ACC_INTERFACE => if (isAnnotation) EmptyFlags else PureInterfaceCreationFlags | JavaDefined
344+
case JAVA_ACC_ABSTRACT => if (isClass) Abstract else Deferred
345+
case JAVA_ACC_INTERFACE => PureInterfaceCreationFlags | JavaDefined
350346
case _ => EmptyFlags
351347
}
352348

353349
private def addFlag(base: FlagSet, jflag: Int): FlagSet =
354350
if (jflag == 0) base else base | translateFlag(jflag)
355351

356352
private def translateFlags(jflags: Int, baseFlags: FlagSet): FlagSet = {
353+
val nflags =
354+
if ((jflags & JAVA_ACC_ANNOTATION) == 0) jflags
355+
else jflags & ~(JAVA_ACC_ABSTRACT | JAVA_ACC_INTERFACE) // annotations are neither abstract nor interfaces
357356
var res: FlagSet = baseFlags | JavaDefined
358-
res = addFlag(res, jflags & JAVA_ACC_PRIVATE)
359-
res = addFlag(res, jflags & JAVA_ACC_PROTECTED)
360-
res = addFlag(res, jflags & JAVA_ACC_FINAL)
361-
res = addFlag(res, jflags & JAVA_ACC_SYNTHETIC)
362-
res = addFlag(res, jflags & JAVA_ACC_STATIC)
363-
res = addFlag(res, jflags & JAVA_ACC_ABSTRACT)
364-
res = addFlag(res, jflags & JAVA_ACC_INTERFACE)
357+
res = addFlag(res, nflags & JAVA_ACC_PRIVATE)
358+
res = addFlag(res, nflags & JAVA_ACC_PROTECTED)
359+
res = addFlag(res, nflags & JAVA_ACC_FINAL)
360+
res = addFlag(res, nflags & JAVA_ACC_SYNTHETIC)
361+
res = addFlag(res, nflags & JAVA_ACC_STATIC)
362+
res = addFlag(res, nflags & JAVA_ACC_ABSTRACT)
363+
res = addFlag(res, nflags & JAVA_ACC_INTERFACE)
365364
res
366365
}
367366

368-
def classFlags(jflags: Int): FlagSet = {
369-
initFields(jflags)
370-
isClass = true
371-
translateFlags(jflags, EmptyFlags)
372-
}
373-
def fieldFlags(jflags: Int): FlagSet = {
374-
initFields(jflags)
375-
translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags)
376-
}
377-
def methodFlags(jflags: Int): FlagSet = {
378-
initFields(jflags)
379-
translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags)
380-
}
367+
def flags(jflags: Int): FlagSet = translateFlags(jflags, baseFlags(jflags))
368+
}
369+
val classTranslation = new FlagTranslation {
370+
override def isClass = true
371+
}
372+
val fieldTranslation = new FlagTranslation {
373+
override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags
374+
}
375+
val methodTranslation = new FlagTranslation {
376+
override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags
381377
}
382-
object FlagTranslation extends FlagTranslation { }
383378
}

src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class ClassfileParser(
8989
def parseClass()(implicit ctx: Context): Option[Embedded] = {
9090
val jflags = in.nextChar
9191
val isAnnotation = hasAnnotation(jflags)
92-
val sflags = FlagTranslation.classFlags(jflags)
92+
val sflags = classTranslation.flags(jflags)
9393
val nameIdx = in.nextChar
9494
currentClassName = pool.getClassName(nameIdx)
9595

@@ -163,8 +163,8 @@ class ClassfileParser(
163163
val start = indexCoord(in.bp)
164164
val jflags = in.nextChar
165165
val sflags =
166-
if (method) Flags.Method | FlagTranslation.methodFlags(jflags)
167-
else FlagTranslation.fieldFlags(jflags)
166+
if (method) Flags.Method | methodTranslation.flags(jflags)
167+
else fieldTranslation.flags(jflags)
168168
val name = pool.getName(in.nextChar)
169169
if (!(sflags is Flags.Private) || name == nme.CONSTRUCTOR || ctx.settings.optimise.value) {
170170
val member = ctx.newSymbol(
@@ -632,7 +632,7 @@ class ClassfileParser(
632632
getOwner(jflags),
633633
entry.originalName,
634634
new ClassfileLoader(file),
635-
FlagTranslation.classFlags(jflags),
635+
classTranslation.flags(jflags),
636636
getScope(jflags))
637637
}
638638

0 commit comments

Comments
 (0)