diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2011-04-13 16:15:43 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2011-04-13 16:15:43 +0000 |
commit | 9b5cb18dbd2d3e87def5da47ae76adb2e776487e (patch) | |
tree | b43e9c909ceec9a21fbd7e0c4a3344d0209e6a9f /src/compiler | |
parent | 185d5b50fdcebb7ab5e4f871ca35c0ae1fad9dce (diff) | |
download | scala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.tar.gz scala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.tar.bz2 scala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.zip |
Closes #4283. no review.
Diffstat (limited to 'src/compiler')
3 files changed, 10 insertions, 4 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..7a906da007 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 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)) |