Skip to content

Commit 74c956b

Browse files
committed
Patch identification of synthetic unapply methods
* With the tasty library we are not tagging these methods with the Case flag * The case accessors are listed as vals and not methods
1 parent 51acd80 commit 74c956b

File tree

2 files changed

+42
-61
lines changed

2 files changed

+42
-61
lines changed

compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,13 @@ object PatternMatcher {
327327
/** Plan for matching the result of an unapply against argument patterns `args` */
328328
def unapplyPlan(unapp: Tree, args: List[Tree]): Plan = {
329329
def caseClass = unapp.symbol.owner.linkedClass
330-
lazy val caseAccessors = caseClass.caseAccessors.filter(_.is(Method))
330+
lazy val caseAccessors = caseClass.caseAccessors.filter(sym => sym.is(Method) || sym.owner.is(Scala2Tasty))
331331

332332
def isSyntheticScala2Unapply(sym: Symbol) =
333-
sym.isAllOf(SyntheticCase) && sym.owner.is(Scala2x)
333+
sym.is(Synthetic) && (
334+
(sym.is(Case) && sym.owner.is(Scala2x))
335+
|| sym.owner.is(Scala2Tasty)
336+
)
334337

335338
def tupleApp(i: Int, receiver: Tree) = // manually inlining the call to NonEmptyTuple#apply, because it's an inline method
336339
ref(defn.RuntimeTuplesModule)

compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala

Lines changed: 37 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,54 +1049,44 @@ class DottyBytecodeTests extends DottyBytecodeTest {
10491049
val m1Meth = getMethod(fooClass, "m1")
10501050

10511051
assertSameCode(m1Meth, List(
1052-
// FIXME regression accessing `::`, `Option` and `Tuple2` members.
10531052
VarOp(ALOAD, 1),
10541053
VarOp(ASTORE, 2),
10551054
VarOp(ALOAD, 2),
10561055
TypeOp(INSTANCEOF, "scala/collection/immutable/$colon$colon"),
1057-
Jump(IFEQ, Label(28)),
1058-
Field(GETSTATIC, "scala/package$", "MODULE$", "Lscala/package$;"),
1059-
Invoke(INVOKEVIRTUAL, "scala/package$", "$colon$colon", "()Lscala/collection/immutable/$colon$colon$;", false),
1056+
Jump(IFEQ, Label(19)),
10601057
VarOp(ALOAD, 2),
10611058
TypeOp(CHECKCAST, "scala/collection/immutable/$colon$colon"),
1062-
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon$", "unapply", "(Lscala/collection/immutable/$colon$colon;)Lscala/Option;", false),
10631059
VarOp(ASTORE, 3),
10641060
VarOp(ALOAD, 3),
1065-
Invoke(INVOKEVIRTUAL, "scala/Option", "isEmpty", "()Z", false),
1066-
Jump(IFNE, Label(28)),
1067-
VarOp(ALOAD, 3),
1068-
Invoke(INVOKEVIRTUAL, "scala/Option", "get", "()Ljava/lang/Object;", false),
1069-
TypeOp(CHECKCAST, "scala/Tuple2"),
1061+
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon", "next$access$1", "()Lscala/collection/immutable/List;", false),
10701062
VarOp(ASTORE, 4),
1071-
VarOp(ALOAD, 4),
1072-
Invoke(INVOKEVIRTUAL, "scala/Tuple2", "_1", "()Ljava/lang/Object;", false),
1063+
VarOp(ALOAD, 3),
1064+
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon", "head", "()Ljava/lang/Object;", false),
10731065
Invoke(INVOKESTATIC, "scala/runtime/BoxesRunTime", "unboxToInt", "(Ljava/lang/Object;)I", false),
10741066
VarOp(ISTORE, 5),
10751067
VarOp(ALOAD, 4),
1076-
Invoke(INVOKEVIRTUAL, "scala/Tuple2", "_2", "()Ljava/lang/Object;", false),
1077-
TypeOp(CHECKCAST, "scala/collection/immutable/List"),
10781068
VarOp(ASTORE, 6),
10791069
VarOp(ILOAD, 5),
10801070
Op(IRETURN),
1081-
Label(28),
1071+
Label(19),
10821072
Field(GETSTATIC, "scala/package$", "MODULE$", "Lscala/package$;"),
10831073
Invoke(INVOKEVIRTUAL, "scala/package$", "Nil", "()Lscala/collection/immutable/Nil$;", false),
10841074
VarOp(ALOAD, 2),
10851075
VarOp(ASTORE, 7),
10861076
Op(DUP),
1087-
Jump(IFNONNULL, Label(40)),
1077+
Jump(IFNONNULL, Label(31)),
10881078
Op(POP),
10891079
VarOp(ALOAD, 7),
1090-
Jump(IFNULL, Label(45)),
1091-
Jump(GOTO, Label(49)),
1092-
Label(40),
1080+
Jump(IFNULL, Label(36)),
1081+
Jump(GOTO, Label(40)),
1082+
Label(31),
10931083
VarOp(ALOAD, 7),
10941084
Invoke(INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false),
1095-
Jump(IFEQ, Label(49)),
1096-
Label(45),
1085+
Jump(IFEQ, Label(40)),
1086+
Label(36),
10971087
IntOp(BIPUSH, 20),
10981088
Op(IRETURN),
1099-
Label(49),
1089+
Label(40),
11001090
TypeOp(NEW, "scala/MatchError"),
11011091
Op(DUP),
11021092
VarOp(ALOAD, 2),
@@ -1109,57 +1099,45 @@ class DottyBytecodeTests extends DottyBytecodeTest {
11091099
val m2Meth = getMethod(fooClass, "m2")
11101100

11111101
assertSameCode(m2Meth, List(
1112-
// FIXME regression accessing `::`, `Option` and `Tuple2` members.
11131102
VarOp(ALOAD, 1),
11141103
VarOp(ASTORE, 2),
11151104
VarOp(ALOAD, 2),
11161105
TypeOp(INSTANCEOF, "scala/collection/immutable/$colon$colon"),
1117-
Jump(IFEQ, Label(53)),
1118-
Field(GETSTATIC, "scala/package$", "MODULE$", "Lscala/package$;"),
1119-
Invoke(INVOKEVIRTUAL, "scala/package$", "$colon$colon", "()Lscala/collection/immutable/$colon$colon$;", false),
1106+
Jump(IFEQ, Label(42)),
11201107
VarOp(ALOAD, 2),
11211108
TypeOp(CHECKCAST, "scala/collection/immutable/$colon$colon"),
1122-
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon$", "unapply", "(Lscala/collection/immutable/$colon$colon;)Lscala/Option;", false),
11231109
VarOp(ASTORE, 3),
11241110
VarOp(ALOAD, 3),
1125-
Invoke(INVOKEVIRTUAL, "scala/Option", "isEmpty", "()Z", false),
1126-
Jump(IFNE, Label(53)),
1127-
VarOp(ALOAD, 3),
1128-
Invoke(INVOKEVIRTUAL, "scala/Option", "get", "()Ljava/lang/Object;", false),
1129-
TypeOp(CHECKCAST, "scala/Tuple2"),
1130-
VarOp(ASTORE, 4),
1131-
VarOp(ALOAD, 4),
1132-
Invoke(INVOKEVIRTUAL, "scala/Tuple2", "_1", "()Ljava/lang/Object;", false),
1111+
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon", "head", "()Ljava/lang/Object;", false),
11331112
Invoke(INVOKESTATIC, "scala/runtime/BoxesRunTime", "unboxToInt", "(Ljava/lang/Object;)I", false),
1134-
VarOp(ISTORE, 5),
1135-
VarOp(ALOAD, 4),
1136-
Invoke(INVOKEVIRTUAL, "scala/Tuple2", "_2", "()Ljava/lang/Object;", false),
1137-
TypeOp(CHECKCAST, "scala/collection/immutable/List"),
1138-
VarOp(ASTORE, 6),
1113+
VarOp(ISTORE, 4),
1114+
VarOp(ALOAD, 3),
1115+
Invoke(INVOKEVIRTUAL, "scala/collection/immutable/$colon$colon", "next$access$1", "()Lscala/collection/immutable/List;", false),
1116+
VarOp(ASTORE, 5),
11391117
Op(ICONST_1),
1140-
VarOp(ILOAD, 5),
1141-
Jump(IF_ICMPNE, Label(30)),
1142-
Jump(GOTO, Label(39)),
1143-
Label(30),
1118+
VarOp(ILOAD, 4),
1119+
Jump(IF_ICMPNE, Label(19)),
1120+
Jump(GOTO, Label(28)),
1121+
Label(19),
11441122
Op(ICONST_2),
1145-
VarOp(ILOAD, 5),
1146-
Jump(IF_ICMPNE, Label(36)),
1147-
Jump(GOTO, Label(39)),
1148-
Label(36),
1149-
Jump(GOTO, Label(45)),
1150-
Label(39),
1151-
VarOp(ALOAD, 6),
1152-
VarOp(ASTORE, 7),
1123+
VarOp(ILOAD, 4),
1124+
Jump(IF_ICMPNE, Label(25)),
1125+
Jump(GOTO, Label(28)),
1126+
Label(25),
1127+
Jump(GOTO, Label(34)),
1128+
Label(28),
1129+
VarOp(ALOAD, 5),
1130+
VarOp(ASTORE, 6),
11531131
IntOp(BIPUSH, 10),
11541132
Op(IRETURN),
1155-
Label(45),
1156-
VarOp(ILOAD, 5),
1157-
VarOp(ISTORE, 8),
1158-
VarOp(ALOAD, 6),
1159-
VarOp(ASTORE, 9),
1160-
VarOp(ILOAD, 8),
1133+
Label(34),
1134+
VarOp(ILOAD, 4),
1135+
VarOp(ISTORE, 7),
1136+
VarOp(ALOAD, 5),
1137+
VarOp(ASTORE, 8),
1138+
VarOp(ILOAD, 7),
11611139
Op(IRETURN),
1162-
Label(53),
1140+
Label(42),
11631141
IntOp(BIPUSH, 20),
11641142
Op(IRETURN),
11651143
))

0 commit comments

Comments
 (0)