Skip to content

Commit 2e17745

Browse files
committed
Remove unnecessary unsafe casts in IArray and fix erroneous cast
1 parent c48a598 commit 2e17745

File tree

2 files changed

+106
-92
lines changed

2 files changed

+106
-92
lines changed

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

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
2222
test("Array[Char]()", newArray0Opcodes(T_CHAR))
2323
test("Array[T]()", newArray0Opcodes(T_INT))
2424

25-
test("IArray[String]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "java/lang/String"), TypeOp(CHECKCAST, "[Ljava/lang/String;"), Op(POP), Op(RETURN)))
26-
test("IArray[Unit]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "scala/runtime/BoxedUnit"), TypeOp(CHECKCAST, "[Lscala/runtime/BoxedUnit;"), Op(POP), Op(RETURN)))
27-
test("IArray[Object]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "java/lang/Object"), TypeOp(CHECKCAST, "[Ljava/lang/Object;"), Op(POP), Op(RETURN)))
28-
test("IArray[Boolean]()", newArray0Opcodes(T_BOOLEAN, TypeOp(CHECKCAST, "[Z") :: Nil))
29-
test("IArray[Byte]()", newArray0Opcodes(T_BYTE, TypeOp(CHECKCAST, "[B") :: Nil))
30-
test("IArray[Short]()", newArray0Opcodes(T_SHORT, TypeOp(CHECKCAST, "[S") :: Nil))
31-
test("IArray[Int]()", newArray0Opcodes(T_INT, TypeOp(CHECKCAST, "[I") :: Nil))
32-
test("IArray[Long]()", newArray0Opcodes(T_LONG, TypeOp(CHECKCAST, "[J") :: Nil))
33-
test("IArray[Float]()", newArray0Opcodes(T_FLOAT, TypeOp(CHECKCAST, "[F") :: Nil))
34-
test("IArray[Double]()", newArray0Opcodes(T_DOUBLE, TypeOp(CHECKCAST, "[D") :: Nil))
35-
test("IArray[Char]()", newArray0Opcodes(T_CHAR, TypeOp(CHECKCAST, "[C") :: Nil))
36-
test("IArray[T]()", newArray0Opcodes(T_INT, TypeOp(CHECKCAST, "[I") :: Nil))
25+
test("IArray[String]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "java/lang/String"), TypeOp(CHECKCAST, "[Ljava/lang/String;"), VarOp(ASTORE, 1), VarOp(ALOAD, 1), Op(POP), Op(RETURN)))
26+
test("IArray[Unit]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "scala/runtime/BoxedUnit"), TypeOp(CHECKCAST, "[Lscala/runtime/BoxedUnit;"), VarOp(ASTORE, 1), VarOp(ALOAD, 1), Op(POP), Op(RETURN)))
27+
test("IArray[Object]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "java/lang/Object"), TypeOp(CHECKCAST, "[Ljava/lang/Object;"), VarOp(ASTORE, 1), VarOp(ALOAD, 1), Op(POP), Op(RETURN)))
28+
test("IArray[Boolean]()", newArray0Opcodes(T_BOOLEAN, TypeOp(CHECKCAST, "[Z") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
29+
test("IArray[Byte]()", newArray0Opcodes(T_BYTE, TypeOp(CHECKCAST, "[B") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
30+
test("IArray[Short]()", newArray0Opcodes(T_SHORT, TypeOp(CHECKCAST, "[S") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
31+
test("IArray[Int]()", newArray0Opcodes(T_INT, TypeOp(CHECKCAST, "[I") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
32+
test("IArray[Long]()", newArray0Opcodes(T_LONG, TypeOp(CHECKCAST, "[J") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
33+
test("IArray[Float]()", newArray0Opcodes(T_FLOAT, TypeOp(CHECKCAST, "[F") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
34+
test("IArray[Double]()", newArray0Opcodes(T_DOUBLE, TypeOp(CHECKCAST, "[D") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
35+
test("IArray[Char]()", newArray0Opcodes(T_CHAR, TypeOp(CHECKCAST, "[C") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
36+
test("IArray[T]()", newArray0Opcodes(T_INT, TypeOp(CHECKCAST, "[I") :: VarOp(ASTORE, 1) :: VarOp(ALOAD, 1) :: Nil))
3737
}
3838

3939
@Test def testArrayGenericApply = {
@@ -43,61 +43,61 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
4343
test("""Array[Object]("a", "b")""", opCodes("java/lang/Object"))
4444

4545
def opCodes2(tpe: String) =
46-
List(Op(ICONST_2), TypeOp(ANEWARRAY, tpe), Op(DUP), Op(ICONST_0), Ldc(LDC, "a"), Op(AASTORE), Op(DUP), Op(ICONST_1), Ldc(LDC, "b"), Op(AASTORE), TypeOp(CHECKCAST, s"[L$tpe;"), Op(POP), Op(RETURN))
46+
List(Op(ICONST_2), TypeOp(ANEWARRAY, tpe), Op(DUP), Op(ICONST_0), Ldc(LDC, "a"), Op(AASTORE), Op(DUP), Op(ICONST_1), Ldc(LDC, "b"), Op(AASTORE), TypeOp(CHECKCAST, s"[L$tpe;"), VarOp(ASTORE, 1), VarOp(ALOAD, 1), Op(POP), Op(RETURN))
4747
test("""IArray("a", "b")""", opCodes2("java/lang/String"))
4848
test("""IArray[Object]("a", "b")""", opCodes2("java/lang/Object"))
4949
}
5050

5151
@Test def testArrayApplyBoolean = {
5252
val init = List(Op(DUP), Op(ICONST_0), Op(ICONST_1), Op(BASTORE), Op(DUP), Op(ICONST_1), Op(ICONST_0), Op(BASTORE))
5353
test("Array(true, false)", newArray2Opcodes(T_BOOLEAN, init))
54-
test("IArray(true, false)", newArray2Opcodes(T_BOOLEAN, init :+ TypeOp(CHECKCAST, "[Z")))
54+
test("IArray(true, false)", newArray2Opcodes(T_BOOLEAN, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
5555
}
5656

5757
@Test def testArrayApplyByte = {
5858
val init = List(Op(DUP), Op(ICONST_0), Op(ICONST_1), Op(BASTORE), Op(DUP), Op(ICONST_1), Op(ICONST_2), Op(BASTORE))
5959
test("Array[Byte](1, 2)", newArray2Opcodes(T_BYTE, init))
60-
test("IArray[Byte](1, 2)", newArray2Opcodes(T_BYTE, init :+ TypeOp(CHECKCAST, "[B")))
60+
test("IArray[Byte](1, 2)", newArray2Opcodes(T_BYTE, init ++ List(TypeOp(CHECKCAST, "[B"), VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
6161
}
6262

6363
@Test def testArrayApplyShort = {
6464
val init = List(Op(DUP), Op(ICONST_0), Op(ICONST_1), Op(SASTORE), Op(DUP), Op(ICONST_1), Op(ICONST_2), Op(SASTORE))
6565
test("Array[Short](1, 2)", newArray2Opcodes(T_SHORT, init))
66-
test("IArray[Short](1, 2)", newArray2Opcodes(T_SHORT, init :+ TypeOp(CHECKCAST, "[S")))
66+
test("IArray[Short](1, 2)", newArray2Opcodes(T_SHORT, init ++ List(TypeOp(CHECKCAST, "[S"), VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
6767
}
6868

6969
@Test def testArrayApplyInt = {
7070
val init = List(Op(DUP), Op(ICONST_0), Op(ICONST_1), Op(IASTORE), Op(DUP), Op(ICONST_1), Op(ICONST_2), Op(IASTORE))
7171
test("Array(1, 2)", newArray2Opcodes(T_INT, init))
72-
test("IArray(1, 2)", newArray2Opcodes(T_INT, init :+ TypeOp(CHECKCAST, "[I")))
72+
test("IArray(1, 2)", newArray2Opcodes(T_INT, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
7373

7474
val init2 = List(Op(DUP), Op(ICONST_0), Field(GETSTATIC, "Foo$", "MODULE$", "LFoo$;"), Invoke(INVOKEVIRTUAL, "Foo$", "t", "()I", false), Op(IASTORE), Op(DUP), Op(ICONST_1), Field(GETSTATIC, "Foo$", "MODULE$", "LFoo$;"), Invoke(INVOKEVIRTUAL, "Foo$", "t", "()I", false), Op(IASTORE))
7575
test("""Array[T](t, t)""", newArray2Opcodes(T_INT, init2))
76-
test("""IArray[T](t, t)""", newArray2Opcodes(T_INT, init2 :+ TypeOp(CHECKCAST, "[I")))
76+
test("""IArray[T](t, t)""", newArray2Opcodes(T_INT, init2 ++ List(TypeOp(CHECKCAST, "[I"), VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
7777
}
7878

7979
@Test def testArrayApplyLong = {
8080
val init = List(Op(DUP), Op(ICONST_0), Ldc(LDC, 2), Op(LASTORE), Op(DUP), Op(ICONST_1), Ldc(LDC, 3), Op(LASTORE))
8181
test("Array(2L, 3L)", newArray2Opcodes(T_LONG, init))
82-
test("IArray(2L, 3L)", newArray2Opcodes(T_LONG, init :+ TypeOp(CHECKCAST, "[J")))
82+
test("IArray(2L, 3L)", newArray2Opcodes(T_LONG, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
8383
}
8484

8585
@Test def testArrayApplyFloat = {
8686
val init = List(Op(DUP), Op(ICONST_0), Ldc(LDC, 2.1f), Op(FASTORE), Op(DUP), Op(ICONST_1), Ldc(LDC, 3.1f), Op(FASTORE))
8787
test("Array(2.1f, 3.1f)", newArray2Opcodes(T_FLOAT, init))
88-
test("IArray(2.1f, 3.1f)", newArray2Opcodes(T_FLOAT, init :+ TypeOp(CHECKCAST, "[F")))
88+
test("IArray(2.1f, 3.1f)", newArray2Opcodes(T_FLOAT, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
8989
}
9090

9191
@Test def testArrayApplyDouble = {
9292
val init = List(Op(DUP), Op(ICONST_0), Ldc(LDC, 2.2d), Op(DASTORE), Op(DUP), Op(ICONST_1), Ldc(LDC, 3.2d), Op(DASTORE))
9393
test("Array(2.2d, 3.2d)", newArray2Opcodes(T_DOUBLE, init))
94-
test("IArray(2.2d, 3.2d)", newArray2Opcodes(T_DOUBLE, init :+ TypeOp(CHECKCAST, "[D")))
94+
test("IArray(2.2d, 3.2d)", newArray2Opcodes(T_DOUBLE, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
9595
}
9696

9797
@Test def testArrayApplyChar = {
9898
val init = List(Op(DUP), Op(ICONST_0), IntOp(BIPUSH, 120), Op(CASTORE), Op(DUP), Op(ICONST_1), IntOp(BIPUSH, 121), Op(CASTORE))
9999
test("Array('x', 'y')", newArray2Opcodes(T_CHAR, init))
100-
test("IArray('x', 'y')", newArray2Opcodes(T_CHAR, init :+ TypeOp(CHECKCAST, "[C")))
100+
test("IArray('x', 'y')", newArray2Opcodes(T_CHAR, init ++ List(VarOp(ASTORE, 1), VarOp(ALOAD, 1))))
101101
}
102102

103103
@Test def testArrayApplyUnit = {
@@ -106,7 +106,7 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
106106
Op(ICONST_1), Field(GETSTATIC, "scala/runtime/BoxedUnit", "UNIT", "Lscala/runtime/BoxedUnit;"), Op(AASTORE), Op(POP), Op(RETURN)))
107107
test("IArray[Unit]((), ())", List(Op(ICONST_2), TypeOp(ANEWARRAY, "scala/runtime/BoxedUnit"), Op(DUP),
108108
Op(ICONST_0), Field(GETSTATIC, "scala/runtime/BoxedUnit", "UNIT", "Lscala/runtime/BoxedUnit;"), Op(AASTORE), Op(DUP),
109-
Op(ICONST_1), Field(GETSTATIC, "scala/runtime/BoxedUnit", "UNIT", "Lscala/runtime/BoxedUnit;"), Op(AASTORE), TypeOp(CHECKCAST, "[Lscala/runtime/BoxedUnit;"), Op(POP), Op(RETURN)))
109+
Op(ICONST_1), Field(GETSTATIC, "scala/runtime/BoxedUnit", "UNIT", "Lscala/runtime/BoxedUnit;"), Op(AASTORE), TypeOp(CHECKCAST, "[Lscala/runtime/BoxedUnit;"), VarOp(ASTORE, 1), VarOp(ALOAD, 1), Op(POP), Op(RETURN)))
110110
}
111111

112112
@Test def testArrayInlined = test(

0 commit comments

Comments
 (0)