diff options
author | Martin Odersky <odersky@gmail.com> | 2011-09-27 07:12:18 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-09-27 07:12:18 +0000 |
commit | e3efea04c239fe9a61825c4ef93d2e300e488b80 (patch) | |
tree | ac21240e7af76d188b727d870b3506aec5849ece /src | |
parent | a90fbf59aee3ee36b23894fbf827f6d85ed6bdd2 (diff) | |
download | scala-e3efea04c239fe9a61825c4ef93d2e300e488b80.tar.gz scala-e3efea04c239fe9a61825c4ef93d2e300e488b80.tar.bz2 scala-e3efea04c239fe9a61825c4ef93d2e300e488b80.zip |
more fixes to reflection.
Diffstat (limited to 'src')
4 files changed, 12 insertions, 12 deletions
diff --git a/src/compiler/scala/reflect/internal/ClassfileConstants.scala b/src/compiler/scala/reflect/internal/ClassfileConstants.scala index 18eba416f5..3eb6c55848 100644 --- a/src/compiler/scala/reflect/internal/ClassfileConstants.scala +++ b/src/compiler/scala/reflect/internal/ClassfileConstants.scala @@ -321,7 +321,7 @@ object ClassfileConstants { final val impdep1 = 0xfe final val impdep2 = 0xff - def toScalaFlags(flags: Int, isClass: Boolean): Long = { + def toScalaFlags(flags: Int, isClass: Boolean = false, isField: Boolean = false): Long = { import Flags._ var res = 0l if ((flags & JAVA_ACC_PRIVATE) != 0) @@ -340,8 +340,9 @@ object ClassfileConstants { if ((flags & JAVA_ACC_STATIC) != 0) res = res | STATIC if (isClass && ((res & DEFERRED) != 0L)) - res = res & ~DEFERRED | ABSTRACT - + res = res & ~DEFERRED | ABSTRACT + if (isField && (res & FINAL) == 0L) + res = res | MUTABLE res | JAVA } } diff --git a/src/compiler/scala/reflect/runtime/JavaToScala.scala b/src/compiler/scala/reflect/runtime/JavaToScala.scala index f3d335d30e..3f2f2321b8 100644 --- a/src/compiler/scala/reflect/runtime/JavaToScala.scala +++ b/src/compiler/scala/reflect/runtime/JavaToScala.scala @@ -451,7 +451,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => */ private def jfieldAsScala(jfield: jField): Symbol = fieldCache.toScala(jfield) { val field = sOwner(jfield).newValue(NoPosition, newTermName(jfield.getName)) - .setFlag(toScalaFlags(jfield.getModifiers, isClass = false) | JAVA) + .setFlag(toScalaFlags(jfield.getModifiers, isField = true) | JAVA) .setInfo(typeToScala(jfield.getGenericType)) fieldCache enter (jfield, field) copyAnnotations(field, jfield) @@ -471,7 +471,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => private def jmethodAsScala(jmeth: jMethod): Symbol = methodCache.toScala(jmeth) { val clazz = sOwner(jmeth) val meth = clazz.newMethod(NoPosition, newTermName(jmeth.getName)) - .setFlag(toScalaFlags(jmeth.getModifiers, isClass = false) | JAVA) + .setFlag(toScalaFlags(jmeth.getModifiers) | JAVA) methodCache enter (jmeth, meth) val tparams = jmeth.getTypeParameters.toList map createTypeParameter val paramtpes = jmeth.getGenericParameterTypes.toList map typeToScala @@ -494,7 +494,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable => // [Martin] Note: I know there's a lot of duplication wrt jmethodAsScala, but don't think it's worth it to factor this out. val clazz = sOwner(jconstr) val constr = clazz.newMethod(NoPosition, nme.CONSTRUCTOR) - .setFlag(toScalaFlags(jconstr.getModifiers, isClass = false) | JAVA) + .setFlag(toScalaFlags(jconstr.getModifiers) | JAVA) constructorCache enter (jconstr, constr) val tparams = jconstr.getTypeParameters.toList map createTypeParameter val paramtpes = jconstr.getGenericParameterTypes.toList map typeToScala diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index a3c1ebf231..3697bbe120 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -494,7 +494,7 @@ abstract class ClassfileParser { def parseClass() { val jflags = in.nextChar val isAnnotation = hasAnnotation(jflags) - var sflags = toScalaFlags(jflags, true) + var sflags = toScalaFlags(jflags, isClass = true) var nameIdx = in.nextChar externalName = pool.getClassName(nameIdx) val c = if (externalName.toString.indexOf('$') < 0) pool.getClassSymbol(nameIdx) else clazz @@ -602,8 +602,7 @@ abstract class ClassfileParser { def parseField() { val jflags = in.nextChar - var sflags = toScalaFlags(jflags, false) - if ((sflags & FINAL) == 0L) sflags = sflags | MUTABLE + var sflags = toScalaFlags(jflags, isField = true) if ((sflags & PRIVATE) != 0L && !global.settings.XO.value) { in.skip(4); skipAttributes() } else { @@ -634,7 +633,7 @@ abstract class ClassfileParser { def parseMethod() { val jflags = in.nextChar.toInt - var sflags = toScalaFlags(jflags, false) + var sflags = toScalaFlags(jflags) if (isPrivate(jflags) && !global.settings.XO.value) { val name = pool.getName(in.nextChar) if (name == nme.CONSTRUCTOR) @@ -1076,7 +1075,7 @@ abstract class ClassfileParser { def enterClassAndModule(entry: InnerClassEntry, completer: global.loaders.SymbolLoader, jflags: Int) { val name = entry.originalName - var sflags = toScalaFlags(jflags, true) + var sflags = toScalaFlags(jflags, isClass = true) val innerClass = getOwner(jflags).newClass(NoPosition, name.toTypeName).setInfo(completer).setFlag(sflags) val innerModule = getOwner(jflags).newModule(NoPosition, name.toTermName).setInfo(completer).setFlag(sflags) diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala index 7b4b583a10..b4d3b09e47 100644 --- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala +++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala @@ -60,7 +60,7 @@ abstract class LiftCode extends Transform with TypingTransformers { try { printTypings = reifyDebug debugTrace("transformed = ") { - transform(localTyper.typedPos(tree.pos)(codify(tree))) + localTyper.typedPos(tree.pos)(codify(super.transform(tree))) } } finally printTypings = saved case ValDef(mods, name, tpt, rhs) if (freeMutableVars(sym)) => // box mutable variables that are accessed from a local closure |