diff options
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r-- | src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala | 55 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/classfile/ClassfileParser.scala | 8 |
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)) } |