diff options
author | Dmitry Petrashko <dark@d-d.me> | 2015-05-27 18:17:36 +0200 |
---|---|---|
committer | Dmitry Petrashko <dark@d-d.me> | 2015-05-27 18:17:36 +0200 |
commit | 6ec4b0a7753ffadaf85e4ffee0ad8bd1749cde01 (patch) | |
tree | d0d2d4280ec1eac3978cd80a83751deee534bf1d /src | |
parent | b2634a85acbaad6125a675009db8dd73837e1f58 (diff) | |
parent | 397dfd6d564b032e5f1d52dda015ffb4238a595f (diff) | |
download | dotty-6ec4b0a7753ffadaf85e4ffee0ad8bd1749cde01.tar.gz dotty-6ec4b0a7753ffadaf85e4ffee0ad8bd1749cde01.tar.bz2 dotty-6ec4b0a7753ffadaf85e4ffee0ad8bd1749cde01.zip |
Merge pull request #607 from dotty-staging/fix/datarace-flags
Fix/datarace flags
Diffstat (limited to 'src')
-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)) } |