summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-09-27 07:12:18 +0000
committerMartin Odersky <odersky@gmail.com>2011-09-27 07:12:18 +0000
commite3efea04c239fe9a61825c4ef93d2e300e488b80 (patch)
treeac21240e7af76d188b727d870b3506aec5849ece
parenta90fbf59aee3ee36b23894fbf827f6d85ed6bdd2 (diff)
downloadscala-e3efea04c239fe9a61825c4ef93d2e300e488b80.tar.gz
scala-e3efea04c239fe9a61825c4ef93d2e300e488b80.tar.bz2
scala-e3efea04c239fe9a61825c4ef93d2e300e488b80.zip
more fixes to reflection.
-rw-r--r--src/compiler/scala/reflect/internal/ClassfileConstants.scala7
-rw-r--r--src/compiler/scala/reflect/runtime/JavaToScala.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala9
-rw-r--r--src/compiler/scala/tools/nsc/transform/LiftCode.scala2
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