summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@gmail.com>2012-05-09 22:33:09 +0200
committerHubert Plociniczak <hubert.plociniczak@gmail.com>2012-05-14 13:50:51 +0200
commit18efdedfb97de7ca9f6f6ce385194d5a6902769d (patch)
tree7eb62207e8dbb1932445cf561fe4e4c04cd43de3
parent97046e6cbe8dfc5d5b672d1a490071b68cbdad9a (diff)
downloadscala-18efdedfb97de7ca9f6f6ce385194d5a6902769d.tar.gz
scala-18efdedfb97de7ca9f6f6ce385194d5a6902769d.tar.bz2
scala-18efdedfb97de7ca9f6f6ce385194d5a6902769d.zip
Better fix for SI-5676. Review by @paulp
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala7
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala6
-rw-r--r--test/files/run/t5676.check3
-rw-r--r--test/files/run/t5676.flags (renamed from test/pending/run/t5676.flags)0
-rw-r--r--test/files/run/t5676.scala24
-rw-r--r--test/pending/run/t5676.scala25
6 files changed, 35 insertions, 30 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
index aa8f469513..225afaf0fb 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
@@ -274,8 +274,10 @@ abstract class GenASM extends SubComponent with BytecodeWriters {
// we can exclude lateFINAL. Such symbols are eligible for inlining, but to
// avoid breaking proxy software which depends on subclassing, we do not
// emit ACC_FINAL.
+ // Nested objects won't receive ACC_FINAL in order to allow for their overloading.
+
val finalFlag = (
- ((sym.rawflags & (Flags.FINAL | Flags.MODULE)) != 0)
+ (sym.hasFlag(Flags.FINAL) || isTopLevelModule(sym))
&& !sym.enclClass.isInterface
&& !sym.isClassConstructor
&& !sym.isMutable // lazy vals and vars both
@@ -649,8 +651,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters {
val INNER_CLASSES_FLAGS =
(asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_PRIVATE | asm.Opcodes.ACC_PROTECTED |
- asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL |
- asm.Opcodes.ACC_INTERFACE | asm.Opcodes.ACC_ABSTRACT)
+ asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_INTERFACE | asm.Opcodes.ACC_ABSTRACT)
val PublicStatic = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC
val PublicStaticFinal = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 042e739abe..f303a8d3fa 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -191,7 +191,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
val MIN_SWITCH_DENSITY = 0.7
val INNER_CLASSES_FLAGS =
- (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT)
+ (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_INTERFACE | ACC_ABSTRACT)
val PublicStatic = ACC_PUBLIC | ACC_STATIC
val PublicStaticFinal = ACC_PUBLIC | ACC_STATIC | ACC_FINAL
@@ -1954,8 +1954,10 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
// we can exclude lateFINAL. Such symbols are eligible for inlining, but to
// avoid breaking proxy software which depends on subclassing, we do not
// emit ACC_FINAL.
+ // Nested objects won't receive ACC_FINAL in order to allow for their overloading.
+
val finalFlag = (
- ((sym.rawflags & (Flags.FINAL | Flags.MODULE)) != 0)
+ (sym.hasFlag(Flags.FINAL) || isTopLevelModule(sym))
&& !sym.enclClass.isInterface
&& !sym.isClassConstructor
&& !sym.isMutable // lazy vals and vars both
diff --git a/test/files/run/t5676.check b/test/files/run/t5676.check
new file mode 100644
index 0000000000..3b562d3046
--- /dev/null
+++ b/test/files/run/t5676.check
@@ -0,0 +1,3 @@
+ok
+false
+true
diff --git a/test/pending/run/t5676.flags b/test/files/run/t5676.flags
index e1b37447c9..e1b37447c9 100644
--- a/test/pending/run/t5676.flags
+++ b/test/files/run/t5676.flags
diff --git a/test/files/run/t5676.scala b/test/files/run/t5676.scala
new file mode 100644
index 0000000000..b643c300ce
--- /dev/null
+++ b/test/files/run/t5676.scala
@@ -0,0 +1,24 @@
+import java.lang.reflect.Modifier
+
+class Bar[T]
+
+class Foo[T] {
+ object A extends Bar[T]
+}
+
+class Baz[S] extends Foo[S] {
+ override object A extends Bar[S] {
+ def foo(): String = "ok"
+ }
+}
+
+object Test {
+
+ def main(a: Array[String]) {
+ val b = new Baz[Any]
+ println(b.A.foo())
+ println(Modifier.isFinal(classOf[Baz[Any]].getModifiers()))
+ println(Modifier.isFinal(Test.getClass.getModifiers()))
+ }
+
+}
diff --git a/test/pending/run/t5676.scala b/test/pending/run/t5676.scala
deleted file mode 100644
index 3ff498eaa2..0000000000
--- a/test/pending/run/t5676.scala
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-class Bar[T]
-
-
-class Foo[T] {
- object A extends Bar[T]
-}
-
-
-class Baz[S] extends Foo[S] {
- override object A extends Bar[S]
-}
-
-
-object Test {
-
- def main(a: Array[String]) {
- val b = new Baz[Any]
- println(b)
- }
-
-}