From 83dcb0fc3a1feee7c525ff68dc4fa88f4310ebfb Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Fri, 2 Dec 2016 13:18:57 +0300 Subject: [PATCH] Fix array init and add listOf(). (#109) --- .../backend/konan/llvm/KonanPlatform.kt | 1 + backend.native/tests/build.gradle | 2 +- .../tests/runtime/collections/listof0.kt | 5 +++++ runtime/src/main/kotlin/kotlin/String.kt | 3 +-- .../kotlin/kotlin/collections/ArrayList.kt | 1 - .../kotlin/kotlin/collections/ArrayUtil.kt | 6 +++--- .../kotlin/kotlin/collections/Collections.kt | 19 ++++++++++++------- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt index 89b272b3b16..ef834a86e5e 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt @@ -36,6 +36,7 @@ class KonanBuiltIns: KotlinBuiltIns { object KonanPlatform : TargetPlatform("Konan") { override val defaultImports: List = Default.defaultImports + listOf( ImportPath("kotlin.*"), + ImportPath("kotlin.collections.*"), ImportPath("kotlin.io.*"), ImportPath("konan.*") ) diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 2fe5073f91c..1adc5d78071 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -478,7 +478,7 @@ task array_list1(type: RunKonanTest) { } task listof0(type: RunKonanTest) { - goldValue = "abc\n" + goldValue = "abc\n[a, b, c, d]\n[n, s, a]\n" source = "runtime/collections/listof0.kt" } diff --git a/backend.native/tests/runtime/collections/listof0.kt b/backend.native/tests/runtime/collections/listof0.kt index 01aab4c4c0c..92ebdcb7684 100644 --- a/backend.native/tests/runtime/collections/listof0.kt +++ b/backend.native/tests/runtime/collections/listof0.kt @@ -2,4 +2,9 @@ fun main(args : Array) { val list = arrayListOf("a", "b", "c") for (element in list) print(element) println() + list.add("d") + println(list.toString()) + + val list2 = listOf("n", "s", "a") + println(list2.toString()) } \ No newline at end of file diff --git a/runtime/src/main/kotlin/kotlin/String.kt b/runtime/src/main/kotlin/kotlin/String.kt index 021c2874f12..4a698a10dbf 100644 --- a/runtime/src/main/kotlin/kotlin/String.kt +++ b/runtime/src/main/kotlin/kotlin/String.kt @@ -10,8 +10,7 @@ public final class String : Comparable, CharSequence { @SymbolName("Kotlin_String_hashCode") external public override fun hashCode(): Int - // TODO: make it Any? - public operator fun plus(other: Any): String { + public operator fun plus(other: Any?): String { return plusImpl(other.toString()) } diff --git a/runtime/src/main/kotlin/kotlin/collections/ArrayList.kt b/runtime/src/main/kotlin/kotlin/collections/ArrayList.kt index 179db5637e1..5e99eed543a 100644 --- a/runtime/src/main/kotlin/kotlin/collections/ArrayList.kt +++ b/runtime/src/main/kotlin/kotlin/collections/ArrayList.kt @@ -149,7 +149,6 @@ class ArrayList private constructor( } override fun equals(other: Any?): Boolean { - //TODO: rethink instance checks, shall it be other is List<*>? return other === this || (other is List<*>) && contentEquals(other) } diff --git a/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt b/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt index 02a5bcd265b..6aa37a367c7 100644 --- a/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt +++ b/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt @@ -6,9 +6,9 @@ package kotlin.collections * either throwing exception or returning some kind of implementation-specific default value. */ fun arrayOfLateInitElements(size: Int): Array { - // TODO: maybe use an empty array, fix array creation. + // TODO: maybe use an empty array. // return (if (size == 0) emptyArray else Array(size)) as Array - return Array(size) as Array + return Array(size) } /** @@ -17,7 +17,7 @@ fun arrayOfLateInitElements(size: Int): Array { * either throwing exception or returning some kind of implementation-specific default value. */ fun Array.copyOfLateInitElements(newSize: Int): Array { - val result = Array(newSize) as Array + val result = Array(newSize) this.copyRangeTo(result, 0, if (newSize > this.size) this.size else newSize, 0) return result } diff --git a/runtime/src/main/kotlin/kotlin/collections/Collections.kt b/runtime/src/main/kotlin/kotlin/collections/Collections.kt index 7275958f484..2dc74e3ea45 100644 --- a/runtime/src/main/kotlin/kotlin/collections/Collections.kt +++ b/runtime/src/main/kotlin/kotlin/collections/Collections.kt @@ -23,9 +23,17 @@ public interface MutableIterable : Iterable { override fun iterator(): MutableIterator } +fun Array.asList(): List { + // TODO: consider making lighter list over an array. + val result = ArrayList(this.size) + for (e in this) { + result.add(e) + } + return result +} + public fun arrayListOf(vararg args: T): MutableList { - // TODO: fix me! - val result = ArrayList(args.size) as ArrayList + val result = ArrayList(args.size) for (arg in args) { result.add(arg) } @@ -33,10 +41,7 @@ public fun arrayListOf(vararg args: T): MutableList { } /* - * FIXME: Suggested code from @olonho is following - * - * public fun listOf(element: T): List = arrayListOf(element) - * - * but in Big Kotlin this function is following: (see libraries/stdlib/src/kotlin/collections/Collections.kt) + * TODO: in Big Kotlin this function is following: (see libraries/stdlib/src/kotlin/collections/Collections.kt) * public fun listOf(vararg elements: T): List = if (elements.size > 0) elements.asList() else emptyList() */ +public fun listOf(vararg args: T): List = args.asList() \ No newline at end of file