From 9b5cb18dbd2d3e87def5da47ae76adb2e776487e Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Wed, 13 Apr 2011 16:15:43 +0000 Subject: Closes #4283. no review. --- src/compiler/scala/tools/nsc/backend/icode/GenICode.scala | 5 +++-- src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala | 5 +++++ src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src') 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)) -- cgit v1.2.3