From 06fa8d5e48abfd2aeba3beafb361044d4d546438 Mon Sep 17 00:00:00 2001 From: Elena Lepilkina Date: Mon, 20 Jul 2020 17:55:38 +0300 Subject: [PATCH] Added codegen test for local escape analysis --- backend.native/tests/build.gradle | 12 +++ .../localEscapeAnalysis/arraysFieldWrite.kt | 73 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 backend.native/tests/codegen/localEscapeAnalysis/arraysFieldWrite.kt diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index be31a6b9f09..1c4a81c8c9c 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -4428,6 +4428,18 @@ task metadata_compare_typedefs(type: MetadataComparisonTest) { defFile = "interop/basics/typedefs.def" } +standaloneTest("local_ea_arraysfieldwrite") { + disabled = (cacheTesting != null) // Cache is not compatible with -opt. + goldValue = "Array (constructor init):\nSize: 2\nContents: [1, 2]\n" + + "Array (constructor init):\nSize: 2\nContents: [3, 4]\n" + + "Array (default value init):\nSize: 2\nContents: [1, 2]\n" + + "Array (default value init):\nSize: 2\nContents: [3, 4]\n" + + "Array (init block):\nSize: 2\nContents: [1, 2]\n" + + "Array (init block):\nSize: 2\nContents: [3, 4]\n" + flags = ["-opt"] + source = "codegen/localEscapeAnalysis/arraysFieldWrite.kt" +} + /** * Creates tasks to build and execute stdlib tests. */ diff --git a/backend.native/tests/codegen/localEscapeAnalysis/arraysFieldWrite.kt b/backend.native/tests/codegen/localEscapeAnalysis/arraysFieldWrite.kt new file mode 100644 index 00000000000..75098792ac8 --- /dev/null +++ b/backend.native/tests/codegen/localEscapeAnalysis/arraysFieldWrite.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +class ArraysConstructor { + private val memberArray: IntArray + constructor(int1: Int, int2: Int) { + memberArray = IntArray(2) + set(int1, int2) + } + fun set(int1: Int, int2: Int) { + memberArray[0] = int1 + memberArray[1] = int2 + } + fun log() { + println("Array (constructor init):") + println("Size: ${memberArray.size}") + println("Contents: ${memberArray.contentToString()}") + } +} + +class ArraysDefault { + private val memberArray = IntArray(2) + constructor(int1: Int, int2: Int) { + set(int1, int2) + } + fun set(int1: Int, int2: Int) { + memberArray[0] = int1 + memberArray[1] = int2 + } + fun log() { + println("Array (default value init):") + println("Size: ${memberArray.size}") + println("Contents: ${memberArray.contentToString()}") + } +} + +class ArraysInitBlock { + private val memberArray : IntArray + init { + memberArray = IntArray(2) + } + constructor(int1: Int, int2: Int) { + set(int1, int2) + } + fun set(int1: Int, int2: Int) { + memberArray[0] = int1 + memberArray[1] = int2 + } + fun log() { + println("Array (init block):") + println("Size: ${memberArray.size}") + println("Contents: ${memberArray.contentToString()}") + } +} + +fun main() { + val array1 = (::ArraysConstructor)(1, 2) + array1.log() + array1.set( 3, 4) + array1.log() + + val array2 = (::ArraysDefault)(1, 2) + array2.log() + array2.set( 3, 4) + array2.log() + + val array3 = (::ArraysInitBlock)(1, 2) + array3.log() + array3.set( 3, 4) + array3.log() +} \ No newline at end of file