@@ -12,47 +12,49 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
12
12
test(" Array[String]()" , List (Op (ICONST_0 ), TypeOp (ANEWARRAY , " java/lang/String" ), Op (POP ), Op (RETURN )))
13
13
test(" Array[Unit]()" , List (Op (ICONST_0 ), TypeOp (ANEWARRAY , " scala/runtime/BoxedUnit" ), Op (POP ), Op (RETURN )))
14
14
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 ))
24
24
}
25
25
26
26
@ 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" ))
29
31
}
30
32
31
33
@ 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 ))))
33
35
34
36
@ 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 ))))
36
38
37
39
@ 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 ))))
39
41
40
42
@ 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 ))))
43
45
}
44
46
45
47
@ 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 ))))
47
49
48
50
@ 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 ))))
50
52
51
53
@ 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 ))))
53
55
54
56
@ 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 ))))
56
58
57
59
@ Test def testArrayApplyUnit =
58
60
test(" Array[Unit]((), ())" , List (Op (ICONST_2 ), TypeOp (ANEWARRAY , " scala/runtime/BoxedUnit" ), Op (DUP ),
@@ -64,17 +66,23 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
64
66
| inline def array(xs: =>Int*): Array[Int] = Array(xs: _*)
65
67
| array(1, 2)
66
68
|}""" .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" )))
68
70
)
69
71
70
72
@ Test def testArrayInlined2 = test(
71
73
""" {
72
74
| inline def array(x: =>Int, xs: =>Int*): Array[Int] = Array(x, xs: _*)
73
75
| array(1, 2)
74
76
|}""" .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 )))
76
78
)
77
79
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
+
78
86
private def test (code : String , expectedInstructions : List [Any ])= {
79
87
val source =
80
88
s """ class Foo {
0 commit comments