File tree Expand file tree Collapse file tree 2 files changed +25
-0
lines changed
src/dotty/tools/backend/jvm
test/dotty/tools/backend/jvm Expand file tree Collapse file tree 2 files changed +25
-0
lines changed Original file line number Diff line number Diff line change @@ -754,12 +754,14 @@ trait BCodeSkelBuilder extends BCodeHelpers {
754
754
755
755
val isNative = methSymbol.hasAnnotation(NativeAttr )
756
756
val isAbstractMethod = (methSymbol.is(Deferred ) || (methSymbol.owner.isInterface && ((methSymbol.is(Deferred )) || methSymbol.isClassConstructor)))
757
+ val isFinal = methSymbol.is(Final )
757
758
val flags =
758
759
import GenBCodeOps .addFlagIf
759
760
javaFlags(methSymbol)
760
761
.addFlagIf(isAbstractMethod, asm.Opcodes .ACC_ABSTRACT )
761
762
.addFlagIf(false /* methSymbol.isStrictFP*/ , asm.Opcodes .ACC_STRICT )
762
763
.addFlagIf(isNative, asm.Opcodes .ACC_NATIVE ) // native methods of objects are generated in mirror classes
764
+ .addFlagIf(isFinal, asm.Opcodes .ACC_FINAL )
763
765
764
766
// TODO needed? for(ann <- m.symbol.annotations) { ann.symbol.initialize }
765
767
val paramSyms = params.map(_.symbol)
Original file line number Diff line number Diff line change @@ -1557,6 +1557,29 @@ class DottyBytecodeTests extends DottyBytecodeTest {
1557
1557
}
1558
1558
}
1559
1559
1560
+ /** Check that final mutable var accessors are final */
1561
+ @ Test def i10835 = {
1562
+ val source =
1563
+ s """ class A {
1564
+ | final var x = 1
1565
+ |}
1566
+ | """ .stripMargin
1567
+ checkBCode(source){dir =>
1568
+ val clsIn = dir.lookupName(" A.class" , directory = false ).input
1569
+ val clsNode = loadClassNode(clsIn)
1570
+ def isFinal (access : Int ) = (access & Opcodes .ACC_FINAL ) != 0
1571
+
1572
+ val field = clsNode.fields.asScala.find(_.name == " x" ).map(_.access)
1573
+ assertTrue(" field is not final" , field.exists(! isFinal(_)))
1574
+ assertTrue(" field is private" , field.exists(acc => (acc & Opcodes .ACC_PRIVATE ) != 0 ))
1575
+
1576
+ val methods = clsNode.methods.asScala
1577
+ def methodAccess (name : String ) = methods.find(_.name == name).map(_.access)
1578
+ assertTrue(" getter is final" , methodAccess(" x" ).exists(isFinal))
1579
+ assertTrue(" setter is final" , methodAccess(" x_$eq" ).exists(isFinal))
1580
+ }
1581
+ }
1582
+
1560
1583
/** Check that erasure if `Int | Nothing` is `int` */
1561
1584
@ Test def i14970 = {
1562
1585
val source =
You can’t perform that action at this time.
0 commit comments