summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2011-04-13 16:15:43 +0000
committerIulian Dragos <jaguarul@gmail.com>2011-04-13 16:15:43 +0000
commit9b5cb18dbd2d3e87def5da47ae76adb2e776487e (patch)
treeb43e9c909ceec9a21fbd7e0c4a3344d0209e6a9f
parent185d5b50fdcebb7ab5e4f871ca35c0ae1fad9dce (diff)
downloadscala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.tar.gz
scala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.tar.bz2
scala-9b5cb18dbd2d3e87def5da47ae76adb2e776487e.zip
Closes #4283. no review.
-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--test/files/jvm/ticket4283/AbstractFoo.java5
-rw-r--r--test/files/jvm/ticket4283/ScalaBipp.scala5
-rw-r--r--test/files/jvm/ticket4283/Test.scala4
6 files changed, 24 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))
diff --git a/test/files/jvm/ticket4283/AbstractFoo.java b/test/files/jvm/ticket4283/AbstractFoo.java
new file mode 100644
index 0000000000..74f3827fe3
--- /dev/null
+++ b/test/files/jvm/ticket4283/AbstractFoo.java
@@ -0,0 +1,5 @@
+package test;
+
+/* package private */ class AbstractFoo {
+ public int t;
+}
diff --git a/test/files/jvm/ticket4283/ScalaBipp.scala b/test/files/jvm/ticket4283/ScalaBipp.scala
new file mode 100644
index 0000000000..36dea9f4de
--- /dev/null
+++ b/test/files/jvm/ticket4283/ScalaBipp.scala
@@ -0,0 +1,5 @@
+package test
+
+class ScalaBipp extends AbstractFoo {
+ def make: Option[ScalaBipp] = Option(this)
+}
diff --git a/test/files/jvm/ticket4283/Test.scala b/test/files/jvm/ticket4283/Test.scala
new file mode 100644
index 0000000000..9bbfaab928
--- /dev/null
+++ b/test/files/jvm/ticket4283/Test.scala
@@ -0,0 +1,4 @@
+
+object Test extends App {
+ val x = (new test.ScalaBipp).make.get.t // java.lang.IllegalAccessError: tried to access class test.AbstractFoo from class other.IllegalAccess$
+}