@@ -22,18 +22,18 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
22
22
test(" Array[Char]()" , newArray0Opcodes(T_CHAR ))
23
23
test(" Array[T]()" , newArray0Opcodes(T_INT ))
24
24
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 ))
37
37
}
38
38
39
39
@ Test def testArrayGenericApply = {
@@ -43,61 +43,61 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
43
43
test(""" Array[Object]("a", "b")""" , opCodes(" java/lang/Object" ))
44
44
45
45
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 ))
47
47
test(""" IArray("a", "b")""" , opCodes2(" java/lang/String" ))
48
48
test(""" IArray[Object]("a", "b")""" , opCodes2(" java/lang/Object" ))
49
49
}
50
50
51
51
@ Test def testArrayApplyBoolean = {
52
52
val init = List (Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_0 ), Op (BASTORE ))
53
53
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 ) )))
55
55
}
56
56
57
57
@ Test def testArrayApplyByte = {
58
58
val init = List (Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (BASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (BASTORE ))
59
59
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 ) )))
61
61
}
62
62
63
63
@ Test def testArrayApplyShort = {
64
64
val init = List (Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (SASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (SASTORE ))
65
65
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 ) )))
67
67
}
68
68
69
69
@ Test def testArrayApplyInt = {
70
70
val init = List (Op (DUP ), Op (ICONST_0 ), Op (ICONST_1 ), Op (IASTORE ), Op (DUP ), Op (ICONST_1 ), Op (ICONST_2 ), Op (IASTORE ))
71
71
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 ) )))
73
73
74
74
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 ))
75
75
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 ) )))
77
77
}
78
78
79
79
@ Test def testArrayApplyLong = {
80
80
val init = List (Op (DUP ), Op (ICONST_0 ), Ldc (LDC , 2 ), Op (LASTORE ), Op (DUP ), Op (ICONST_1 ), Ldc (LDC , 3 ), Op (LASTORE ))
81
81
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 ) )))
83
83
}
84
84
85
85
@ Test def testArrayApplyFloat = {
86
86
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 ))
87
87
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 ) )))
89
89
}
90
90
91
91
@ Test def testArrayApplyDouble = {
92
92
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 ))
93
93
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 ) )))
95
95
}
96
96
97
97
@ Test def testArrayApplyChar = {
98
98
val init = List (Op (DUP ), Op (ICONST_0 ), IntOp (BIPUSH , 120 ), Op (CASTORE ), Op (DUP ), Op (ICONST_1 ), IntOp (BIPUSH , 121 ), Op (CASTORE ))
99
99
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 ) )))
101
101
}
102
102
103
103
@ Test def testArrayApplyUnit = {
@@ -106,7 +106,7 @@ class ArrayApplyOptTest extends DottyBytecodeTest {
106
106
Op (ICONST_1 ), Field (GETSTATIC , " scala/runtime/BoxedUnit" , " UNIT" , " Lscala/runtime/BoxedUnit;" ), Op (AASTORE ), Op (POP ), Op (RETURN )))
107
107
test(" IArray[Unit]((), ())" , List (Op (ICONST_2 ), TypeOp (ANEWARRAY , " scala/runtime/BoxedUnit" ), Op (DUP ),
108
108
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 )))
110
110
}
111
111
112
112
@ Test def testArrayInlined = test(
0 commit comments