summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2011-04-14 13:48:00 +0000
committerIulian Dragos <jaguarul@gmail.com>2011-04-14 13:48:00 +0000
commit8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217 (patch)
tree3afd758aba5d55c781d2d5495da3f151caf47b78 /src
parent0b18e29225e07a456416eb1cca0e38906b9bddc8 (diff)
downloadscala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.tar.gz
scala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.tar.bz2
scala-8707c9ecb3dfa8e3706c218ed8c780bbcb0b7217.zip
This time, fixed #4283. no review.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala5
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala5
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala4
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala2
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_)
}