aboutsummaryrefslogtreecommitdiff
path: root/test/test/DottyBytecodeTests.scala
diff options
context:
space:
mode:
Diffstat (limited to 'test/test/DottyBytecodeTests.scala')
-rw-r--r--test/test/DottyBytecodeTests.scala83
1 files changed, 81 insertions, 2 deletions
diff --git a/test/test/DottyBytecodeTests.scala b/test/test/DottyBytecodeTests.scala
index 717c8527a..5b5989474 100644
--- a/test/test/DottyBytecodeTests.scala
+++ b/test/test/DottyBytecodeTests.scala
@@ -86,7 +86,7 @@ class TestBCode extends DottyBytecodeTest {
/** Make sure that creating multidim arrays reduces to "multinewarray"
* instruction
*/
- @Test def multidimArrays = {
+ @Test def multidimArraysFromOfDim = {
val source = """
|object Arr {
| def arr = Array.ofDim[Int](2, 1)
@@ -98,7 +98,10 @@ class TestBCode extends DottyBytecodeTest {
val hadCorrectInstr =
instructionsFromMethod(method)
- .collect { case x @ NewArray(op, _, dims) if op == 197 && dims == 2 => x }
+ .collect {
+ case x @ NewArray(op, _, dims)
+ if op == Opcode.multianewarray && dims == 2 => x
+ }
.length > 0
assert(hadCorrectInstr,
@@ -106,4 +109,80 @@ class TestBCode extends DottyBytecodeTest {
instructionsFromMethod(method).mkString("\n"))
}
}
+
+ @Test def arraysFromOfDim = {
+ val source = """
+ |object Arr {
+ | def arr1 = Array.ofDim[Int](2)
+ | def arr2 = Array.ofDim[Unit](2)
+ | def arr3 = Array.ofDim[String](2)
+ | def arr4 = Array.ofDim[Map[String, String]](2)
+ |}""".stripMargin
+ checkBCode(source) { dir =>
+ val moduleIn = dir.lookupName("Arr$.class", directory = false)
+ val moduleNode = loadClassNode(moduleIn.input)
+ val arr1 = getMethod(moduleNode, "arr1")
+ val arr2 = getMethod(moduleNode, "arr2")
+ val arr3 = getMethod(moduleNode, "arr3")
+
+ val arr1CorrectInstr =
+ instructionsFromMethod(arr1)
+ .collect {
+ case x @ IntOp(op, oprnd)
+ if op == Opcode.newarray && oprnd == Opcode.int => x
+ }
+ .length > 0
+
+ assert(arr1CorrectInstr,
+ "Did not contain \"multianewarray\" instruction in:\n" +
+ instructionsFromMethod(arr1).mkString("\n"))
+
+ val arr2CorrectInstr =
+ instructionsFromMethod(arr2)
+ .collect {
+ case x @ TypeOp(op, oprnd)
+ if op == Opcode.anewarray && oprnd == Opcode.boxedUnit => x
+ }
+ .length > 0
+
+ assert(arr2CorrectInstr,
+ "arr2 bytecode did not contain correct `anewarray` instruction:\n" +
+ instructionsFromMethod(arr2)mkString("\n"))
+
+ val arr3CorrectInstr =
+ instructionsFromMethod(arr3)
+ .collect {
+ case x @ TypeOp(op, oprnd)
+ if op == Opcode.anewarray && oprnd == Opcode.javaString => x
+ }
+ .length > 0
+
+ assert(arr3CorrectInstr,
+ "arr3 bytecode did not contain correct `anewarray` instruction:\n" +
+ instructionsFromMethod(arr3).mkString("\n"))
+ }
+ }
+
+ @Test def arraysFromDimAndFromNewEqual = {
+ val source = """
+ |object Arr {
+ | def arr1 = Array.ofDim[Int](2)
+ | def arr2 = new Array[Int](2)
+ |}""".stripMargin
+
+ checkBCode(source) { dir =>
+ val moduleIn = dir.lookupName("Arr$.class", directory = false)
+ val moduleNode = loadClassNode(moduleIn.input)
+ val arr1 = getMethod(moduleNode, "arr1")
+ val arr2 = getMethod(moduleNode, "arr2")
+
+ // First two instructions of `arr1` fetch the static reference to `Array`
+ val instructions1 = instructionsFromMethod(arr1).drop(2)
+ val instructions2 = instructionsFromMethod(arr2)
+
+ assert(instructions1 == instructions2,
+ "Creating arrays using `Array.ofDim[Int](2)` did not equal bytecode for `new Array[Int](2)`\n" +
+ diffInstructions(instructions1, instructions2))
+ }
+ }
}