@@ -12,47 +12,49 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
1212 test(" Array[String]()" , List (Op (ICONST_0 ), TypeOp (ANEWARRAY , " java/lang/String" ), Op (POP ), Op (RETURN )))
1313 test(" Array[Unit]()" , List (Op (ICONST_0 ), TypeOp (ANEWARRAY , " scala/runtime/BoxedUnit" ), Op (POP ), Op (RETURN )))
1414 test(" Array[Object]()" , List (Op (ICONST_0 ), TypeOp (ANEWARRAY , " java/lang/Object" ), Op (POP ), Op (RETURN )))
15- test(" Array[Boolean]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 4 ), Op ( POP ), Op ( RETURN ) ))
16- test(" Array[Char ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 5 ), Op ( POP ), Op ( RETURN ) ))
17- test(" Array[Float ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 6 ), Op ( POP ), Op ( RETURN ) ))
18- test(" Array[Double ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 7 ), Op ( POP ), Op ( RETURN ) ))
19- test(" Array[Byte ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 8 ), Op ( POP ), Op ( RETURN ) ))
20- test(" Array[Short ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 9 ), Op ( POP ), Op ( RETURN ) ))
21- test(" Array[Int ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 10 ), Op ( POP ), Op ( RETURN ) ))
22- test(" Array[Long ]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 11 ), Op ( POP ), Op ( RETURN ) ))
23- test(" Array[T]()" , List ( Op ( ICONST_0 ), IntOp ( NEWARRAY , 10 ), Op ( POP ), Op ( RETURN ) ))
15+ test(" Array[Boolean]()" , newArray0Opcodes( T_BOOLEAN ))
16+ test(" Array[Byte ]()" , newArray0Opcodes( T_BYTE ))
17+ test(" Array[Short ]()" , newArray0Opcodes( T_SHORT ))
18+ test(" Array[Int ]()" , newArray0Opcodes( T_INT ))
19+ test(" Array[Long ]()" , newArray0Opcodes( T_LONG ))
20+ test(" Array[Float ]()" , newArray0Opcodes( T_FLOAT ))
21+ test(" Array[Double ]()" , newArray0Opcodes( T_DOUBLE ))
22+ test(" Array[Char ]()" , newArray0Opcodes( T_CHAR ))
23+ test(" Array[T]()" , newArray0Opcodes( T_INT ))
2424 }
2525
2626 @ Test def testArrayGenericApply = {
27- test(""" Array("a", "b")""" , List (Op (ICONST_2 ), TypeOp (ANEWARRAY , " java/lang/String" ), Op (DUP ), Op (ICONST_0 ), Ldc (LDC , " a" ), Op (AASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , " b" ), Op (AASTORE ), Op (POP ), Op (RETURN )))
28- test(""" Array[Object]("a", "b")""" , List (Op (ICONST_2 ), TypeOp (ANEWARRAY , " java/lang/Object" ), Op (DUP ), Op (ICONST_0 ), Ldc (LDC , " a" ), Op (AASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , " b" ), Op (AASTORE ), Op (POP ), Op (RETURN )))
27+ def opCodes (tpe : String ) =
28+ 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 ), Op (POP ), Op (RETURN ))
29+ test(""" Array("a", "b")""" , opCodes(" java/lang/String" ))
30+ test(""" Array[Object]("a", "b")""" , opCodes(" java/lang/Object" ))
2931 }
3032
3133 @ Test def testArrayApplyBoolean =
32- test(" Array(true, false)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 4 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_0 ), Op (BASTORE ), Op ( POP ), Op ( RETURN )))
34+ test(" Array(true, false)" , newArray2Opcodes( T_BOOLEAN , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_0 ), Op (BASTORE ))))
3335
3436 @ Test def testArrayApplyByte =
35- test(" Array[Byte](1, 2)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 8 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (BASTORE ), Op ( POP ), Op ( RETURN )))
37+ test(" Array[Byte](1, 2)" , newArray2Opcodes( T_BYTE , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (BASTORE ))))
3638
3739 @ Test def testArrayApplyShort =
38- test(" Array[Short](1, 2)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 9 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (SASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (SASTORE ), Op ( POP ), Op ( RETURN )))
40+ test(" Array[Short](1, 2)" , newArray2Opcodes( T_SHORT , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (SASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (SASTORE ))))
3941
4042 @ Test def testArrayApplyInt = {
41- test(" Array(1, 2)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 10 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ), Op ( POP ), Op ( RETURN )))
42- test(""" Array[T](t, t)""" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 10 ), 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 ), Op ( POP ), Op ( RETURN )))
43+ test(" Array(1, 2)" , newArray2Opcodes( T_INT , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ))))
44+ test(""" Array[T](t, t)""" , newArray2Opcodes( T_INT , 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 ))))
4345 }
4446
4547 @ Test def testArrayApplyLong =
46- test(" Array(2L, 3L)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 11 ), Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2 ), Op (LASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3 ), Op (LASTORE ), Op ( POP ), Op ( RETURN )))
48+ test(" Array(2L, 3L)" , newArray2Opcodes( T_LONG , List ( Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2 ), Op (LASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3 ), Op (LASTORE ))))
4749
4850 @ Test def testArrayApplyFloat =
49- test(" Array(2.1f, 3.1f)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 6 ), Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2.1f ), Op (FASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3.1f ), Op (FASTORE ), Op ( POP ), Op ( RETURN )))
51+ test(" Array(2.1f, 3.1f)" , newArray2Opcodes( T_FLOAT , List ( Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2.1f ), Op (FASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3.1f ), Op (FASTORE ))))
5052
5153 @ Test def testArrayApplyDouble =
52- test(" Array(2.2d, 3.2d)" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 7 ), Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2.2d ), Op (DASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3.2d ), Op (DASTORE ), Op ( POP ), Op ( RETURN )))
54+ test(" Array(2.2d, 3.2d)" , newArray2Opcodes( T_DOUBLE , List ( Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2.2d ), Op (DASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3.2d ), Op (DASTORE ))))
5355
5456 @ Test def testArrayApplyChar =
55- test(" Array('x', 'y')" , List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 5 ), Op (DUP ), Op (ICONST_0 ), IntOp (BIPUSH , 120 ), Op (CASTORE ), Op (DUP ), Op (ICONST_1 ), IntOp (BIPUSH , 121 ), Op (CASTORE ), Op ( POP ), Op ( RETURN )))
57+ test(" Array('x', 'y')" , newArray2Opcodes( T_CHAR , List ( Op (DUP ), Op (ICONST_0 ), IntOp (BIPUSH , 120 ), Op (CASTORE ), Op (DUP ), Op (ICONST_1 ), IntOp (BIPUSH , 121 ), Op (CASTORE ))))
5658
5759 @ Test def testArrayApplyUnit =
5860 test(" Array[Unit]((), ())" , List (Op (ICONST_2 ), TypeOp (ANEWARRAY , " scala/runtime/BoxedUnit" ), Op (DUP ),
@@ -64,17 +66,23 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
6466 | inline def array(xs: =>Int*): Array[Int] = Array(xs: _*)
6567 | array(1, 2)
6668 |}""" .stripMargin,
67- List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 10 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ), TypeOp (CHECKCAST , " [I" ), Op ( POP ), Op ( RETURN ))
69+ newArray2Opcodes( T_INT , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ), TypeOp (CHECKCAST , " [I" )))
6870 )
6971
7072 @ Test def testArrayInlined2 = test(
7173 """ {
7274 | inline def array(x: =>Int, xs: =>Int*): Array[Int] = Array(x, xs: _*)
7375 | array(1, 2)
7476 |}""" .stripMargin,
75- List ( Op ( ICONST_2 ), IntOp ( NEWARRAY , 10 ), Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ), Op ( POP ), Op ( RETURN ))
77+ newArray2Opcodes( T_INT , List ( Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE )))
7678 )
7779
80+ private def newArray0Opcodes (tpe : Int , init : List [Any ] = Nil ): List [Any ] =
81+ Op (ICONST_0 ) :: IntOp (NEWARRAY , tpe) :: init ::: Op (POP ) :: Op (RETURN ) :: Nil
82+
83+ private def newArray2Opcodes (tpe : Int , init : List [Any ] = Nil ): List [Any ] =
84+ Op (ICONST_2 ) :: IntOp (NEWARRAY , tpe) :: init ::: Op (POP ) :: Op (RETURN ) :: Nil
85+
7886 private def test (code : String , expectedInstructions : List [Any ])= {
7987 val source =
8088 s """ class Foo {
0 commit comments