diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2011-04-14 13:48:00 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2011-04-14 13:48:00 +0000 |
commit | 8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217 (patch) | |
tree | 3afd758aba5d55c781d2d5495da3f151caf47b78 /src | |
parent | 0b18e29225e07a456416eb1cca0e38906b9bddc8 (diff) | |
download | scala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.tar.gz scala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.tar.bz2 scala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.zip |
This time, fixed #4283. no review.
Diffstat (limited to 'src')
4 files changed, 11 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 249aefb10e..540c5f50dd 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -991,6 +991,7 @@ abstract class GenICode extends SubComponent { case Select(qualifier, selector) => val sym = tree.symbol generatedType = toTypeKind(sym.info) + val hostClass = qualifier.tpe.typeSymbol.orElse(sym.owner) if (sym.isModule) { if (settings.debug.value) @@ -999,11 +1000,11 @@ abstract class GenICode extends SubComponent { genLoadModule(ctx, sym, tree.pos) ctx } else if (sym.isStaticMember) { - ctx.bb.emit(LOAD_FIELD(sym, true), tree.pos) + ctx.bb.emit(LOAD_FIELD(sym, true) setHostClass hostClass, tree.pos) ctx } else { val ctx1 = genLoadQualifier(tree, ctx) - ctx1.bb.emit(LOAD_FIELD(sym, false), tree.pos) + ctx1.bb.emit(LOAD_FIELD(sym, false) setHostClass hostClass, tree.pos) ctx1 } diff --git a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala index a46de06d6f..ba33c425f2 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala @@ -171,6 +171,11 @@ trait Opcodes { self: ICodes => override def consumedTypes = if (isStatic) Nil else List(REFERENCE(field.owner)); override def producedTypes = List(toTypeKind(field.tpe)); + + // more precise information about how to load this field + // see #4283 + var hostClass: Symbol = field.owner + def setHostClass(cls: Symbol): this.type = { hostClass = cls; this } } case class LOAD_MODULE(module: Symbol) extends Instruction { diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 2305e22ed2..ac0cb97d45 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -1172,8 +1172,8 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid { case LOAD_LOCAL(local) => jcode.emitLOAD(indexOf(local), javaType(local.kind)) - case LOAD_FIELD(field, isStatic) => - var owner = javaName(field.owner) + case lf @ LOAD_FIELD(field, isStatic) => + var owner = javaName(lf.hostClass) if (settings.debug.value) log("LOAD_FIELD with owner: " + owner + " flags: " + Flags.flagsToString(field.owner.flags)) diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala index 9980db6ff5..ce76117cfd 100644 --- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala +++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala @@ -543,7 +543,7 @@ abstract class CleanUp extends Transform with ast.TreeDSL { typedWithPos(tree.pos) { if (isValueClass(tpe.typeSymbol)) { if (tpe.typeSymbol == UnitClass) - Select(REF(BoxedUnit_TYPE), BoxedUnit_TYPE) + REF(BoxedUnit_TYPE) else Select(REF(boxedModule(tpe.typeSymbol)), nme.TYPE_) } |