diff --git a/compiler/test/dotty/tools/backend/jvm/ArrayApplyOptTest.scala b/compiler/test/dotty/tools/backend/jvm/ArrayApplyOptTest.scala index c99de8fcf956..75f18ee45034 100644 --- a/compiler/test/dotty/tools/backend/jvm/ArrayApplyOptTest.scala +++ b/compiler/test/dotty/tools/backend/jvm/ArrayApplyOptTest.scala @@ -21,7 +21,7 @@ class ArrayApplyOptTest extends DottyBytecodeTest { test("Array[Float]()", newArray0Opcodes(T_FLOAT)) test("Array[Double]()", newArray0Opcodes(T_DOUBLE)) test("Array[Char]()", newArray0Opcodes(T_CHAR)) - test("Array[T]()", newArray0Opcodes(T_INT)) + test("Array[T]()", mkInstr0("scala/Array$")) test("IArray[String]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "java/lang/String"), Op(POP), Op(RETURN))) test("IArray[Unit]()", List(Op(ICONST_0), TypeOp(ANEWARRAY, "scala/runtime/BoxedUnit"), Op(POP), Op(RETURN))) @@ -34,7 +34,7 @@ class ArrayApplyOptTest extends DottyBytecodeTest { test("IArray[Float]()", newArray0Opcodes(T_FLOAT)) test("IArray[Double]()", newArray0Opcodes(T_DOUBLE)) test("IArray[Char]()", newArray0Opcodes(T_CHAR)) - test("IArray[T]()", newArray0Opcodes(T_INT)) + test("IArray[T]()", mkInstr0("scala/IArray$package$IArray$")) } @Test def testArrayGenericApply = { @@ -70,9 +70,8 @@ class ArrayApplyOptTest extends DottyBytecodeTest { test("Array(1, 2)", newArray2Opcodes(T_INT, init)) test("IArray(1, 2)", newArray2Opcodes(T_INT, init)) - 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), TypeOp(CHECKCAST, "[I")) - test("""Array[T](t, t): Array[T]""", newArray2Opcodes(T_INT, init2)) - test("""IArray[T](t, t): IArray[T]""", newArray2Opcodes(T_INT, init2)) + test("""Array[T](t, t): Array[T]""", mkInstr2("scala/Array$")) + test("""IArray[T](t, t): IArray[T]""", mkInstr2("scala/IArray$package$IArray$")) } @Test def testArrayApplyLong = { @@ -310,4 +309,22 @@ class ArrayApplyOptTest extends DottyBytecodeTest { } } + def pre(owner: String) = List( + Field(GETSTATIC, owner, "MODULE$", s"L$owner;"), + Field(GETSTATIC, "scala/runtime/ScalaRunTime$", "MODULE$", "Lscala/runtime/ScalaRunTime$;"), + ) + + def mkInstr0(owner: String) = pre(owner) ::: newArray0Opcodes(T_INT, mkApply(owner, Nil)) + def mkInstr2(owner: String) = pre(owner) ::: newArray2Opcodes(T_INT, mkApply(owner, List(ICONST_0, ICONST_1)) ::: TypeOp(CHECKCAST, "[I") :: Nil) + + def mkApply(owner: String, iconsts: List[Int]) = + iconsts.flatMap { iconst => + List(Op(DUP), Op(iconst), Field(GETSTATIC, "Foo$", "MODULE$", "LFoo$;"), Invoke(INVOKEVIRTUAL, "Foo$", "t", "()I", false), Op(IASTORE)) + } ::: List( + Invoke(INVOKEVIRTUAL, "scala/runtime/ScalaRunTime$", "genericWrapArray", "(Ljava/lang/Object;)Lscala/collection/immutable/ArraySeq;", false), + Field(GETSTATIC, "scala/reflect/ClassTag$", "MODULE$", "Lscala/reflect/ClassTag$;"), + Field(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;"), + Invoke(INVOKEVIRTUAL, "scala/reflect/ClassTag$", "apply", "(Ljava/lang/Class;)Lscala/reflect/ClassTag;", false), + Invoke(INVOKEVIRTUAL, owner, "apply", "(Lscala/collection/immutable/Seq;Lscala/reflect/ClassTag;)Ljava/lang/Object;", false), + ) }