aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala55
-rw-r--r--src/dotty/tools/dotc/core/classfile/ClassfileParser.scala8
2 files changed, 29 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
index b04ea99ac..dd29fa49d 100644
--- a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
+++ b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala
@@ -329,15 +329,11 @@ object ClassfileConstants {
final val impdep1 = 0xfe
final val impdep2 = 0xff
+ import Flags._
abstract class FlagTranslation {
- import Flags._
- private var isAnnotation = false
- private var isClass = false
- private def initFields(flags: Int) = {
- isAnnotation = (flags & JAVA_ACC_ANNOTATION) != 0
- isClass = false
- }
+ protected def baseFlags(jflags: Int) = EmptyFlags
+ protected def isClass: Boolean = false
private def translateFlag(jflag: Int): FlagSet = (jflag: @switch) match {
case JAVA_ACC_PRIVATE => Private
@@ -345,8 +341,8 @@ object ClassfileConstants {
case JAVA_ACC_FINAL => Final
case JAVA_ACC_SYNTHETIC => Synthetic
case JAVA_ACC_STATIC => JavaStatic
- case JAVA_ACC_ABSTRACT => if (isAnnotation) EmptyFlags else if (isClass) Abstract else Deferred
- case JAVA_ACC_INTERFACE => if (isAnnotation) EmptyFlags else PureInterfaceCreationFlags | JavaDefined
+ case JAVA_ACC_ABSTRACT => if (isClass) Abstract else Deferred
+ case JAVA_ACC_INTERFACE => PureInterfaceCreationFlags | JavaDefined
case _ => EmptyFlags
}
@@ -354,30 +350,29 @@ object ClassfileConstants {
if (jflag == 0) base else base | translateFlag(jflag)
private def translateFlags(jflags: Int, baseFlags: FlagSet): FlagSet = {
+ val nflags =
+ if ((jflags & JAVA_ACC_ANNOTATION) == 0) jflags
+ else jflags & ~(JAVA_ACC_ABSTRACT | JAVA_ACC_INTERFACE) // annotations are neither abstract nor interfaces
var res: FlagSet = baseFlags | JavaDefined
- res = addFlag(res, jflags & JAVA_ACC_PRIVATE)
- res = addFlag(res, jflags & JAVA_ACC_PROTECTED)
- res = addFlag(res, jflags & JAVA_ACC_FINAL)
- res = addFlag(res, jflags & JAVA_ACC_SYNTHETIC)
- res = addFlag(res, jflags & JAVA_ACC_STATIC)
- res = addFlag(res, jflags & JAVA_ACC_ABSTRACT)
- res = addFlag(res, jflags & JAVA_ACC_INTERFACE)
+ res = addFlag(res, nflags & JAVA_ACC_PRIVATE)
+ res = addFlag(res, nflags & JAVA_ACC_PROTECTED)
+ res = addFlag(res, nflags & JAVA_ACC_FINAL)
+ res = addFlag(res, nflags & JAVA_ACC_SYNTHETIC)
+ res = addFlag(res, nflags & JAVA_ACC_STATIC)
+ res = addFlag(res, nflags & JAVA_ACC_ABSTRACT)
+ res = addFlag(res, nflags & JAVA_ACC_INTERFACE)
res
}
- def classFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- isClass = true
- translateFlags(jflags, EmptyFlags)
- }
- def fieldFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags)
- }
- def methodFlags(jflags: Int): FlagSet = {
- initFields(jflags)
- translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags)
- }
+ def flags(jflags: Int): FlagSet = translateFlags(jflags, baseFlags(jflags))
+ }
+ val classTranslation = new FlagTranslation {
+ override def isClass = true
+ }
+ val fieldTranslation = new FlagTranslation {
+ override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags
+ }
+ val methodTranslation = new FlagTranslation {
+ override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags
}
- object FlagTranslation extends FlagTranslation { }
}
diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
index ee5453a8e..d53f545d3 100644
--- a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
+++ b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala
@@ -89,7 +89,7 @@ class ClassfileParser(
def parseClass()(implicit ctx: Context): Option[Embedded] = {
val jflags = in.nextChar
val isAnnotation = hasAnnotation(jflags)
- val sflags = FlagTranslation.classFlags(jflags)
+ val sflags = classTranslation.flags(jflags)
val nameIdx = in.nextChar
currentClassName = pool.getClassName(nameIdx)
@@ -163,8 +163,8 @@ class ClassfileParser(
val start = indexCoord(in.bp)
val jflags = in.nextChar
val sflags =
- if (method) Flags.Method | FlagTranslation.methodFlags(jflags)
- else FlagTranslation.fieldFlags(jflags)
+ if (method) Flags.Method | methodTranslation.flags(jflags)
+ else fieldTranslation.flags(jflags)
val name = pool.getName(in.nextChar)
if (!(sflags is Flags.Private) || name == nme.CONSTRUCTOR || ctx.settings.optimise.value) {
val member = ctx.newSymbol(
@@ -632,7 +632,7 @@ class ClassfileParser(
getOwner(jflags),
entry.originalName,
new ClassfileLoader(file),
- FlagTranslation.classFlags(jflags),
+ classTranslation.flags(jflags),
getScope(jflags))
}