From a938fcca6c3262123404a1c89fb91e8d5e7d2961 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 24 Oct 2016 12:27:14 +0300 Subject: [PATCH] Add very basic output, small refactoring. (#14) Add very basic output, small refactoring. --- runtime/src/main/cpp/Natives.cpp | 10 +++ runtime/src/main/cpp/Natives.h | 5 ++ .../src/main/kotlin/kotlin_native/Arrays.kt | 61 +++++++++++++++++++ .../main/kotlin/kotlin_native/Cloneable.kt | 5 ++ .../src/main/kotlin/kotlin_native/String.kt | 55 ----------------- .../main/kotlin/kotlin_native/io/Console.kt | 4 ++ 6 files changed, 85 insertions(+), 55 deletions(-) create mode 100644 runtime/src/main/kotlin/kotlin_native/Arrays.kt create mode 100644 runtime/src/main/kotlin/kotlin_native/Cloneable.kt create mode 100644 runtime/src/main/kotlin/kotlin_native/io/Console.kt diff --git a/runtime/src/main/cpp/Natives.cpp b/runtime/src/main/cpp/Natives.cpp index 27ba22acb0b..f7dc623fadb 100644 --- a/runtime/src/main/cpp/Natives.cpp +++ b/runtime/src/main/cpp/Natives.cpp @@ -1,4 +1,5 @@ #include +#include #include "Assert.h" #include "Exceptions.h" @@ -8,6 +9,7 @@ extern "C" { +// Arrays.kt // TODO: those must be compiler intrinsics afterwards. KByte Kotlin_ByteArray_get(const ArrayHeader* obj, KInt index) { if (static_cast(index) >= obj->count_) { @@ -93,6 +95,14 @@ KInt Kotlin_IntArray_getArrayLength(const ArrayHeader* array) { return array->count_; } +// io/Console.kt +void Kotlin_io_Console_print(const ArrayHeader* array) { + RuntimeAssert(array->type_info_ == theStringTypeInfo, "Must use a string"); + // TODO: system stdout must be aware about UTF-8. + write(STDOUT_FILENO, ByteArrayAddressOfElementAt(array, 0), array->count_); +} + +// String.kt KInt Kotlin_String_compareTo(const ArrayHeader* obj, const ArrayHeader* other) { return memcmp(ByteArrayAddressOfElementAt(obj, 0), ByteArrayAddressOfElementAt(other, 0), diff --git a/runtime/src/main/cpp/Natives.h b/runtime/src/main/cpp/Natives.h index 89c122b440f..149aaf71835 100644 --- a/runtime/src/main/cpp/Natives.h +++ b/runtime/src/main/cpp/Natives.h @@ -41,6 +41,7 @@ extern "C" { #endif // TODO: those must be compiler intrinsics afterwards. + // Arrays.kt ArrayHeader* Kotlin_ByteArray_clone(const ArrayHeader* obj); KByte Kotlin_ByteArray_get(const ArrayHeader* obj, KInt index); void Kotlin_ByteArray_set(ArrayHeader* obj, KInt index, KByte value); @@ -56,6 +57,10 @@ KInt Kotlin_IntArray_get(const ArrayHeader* obj, KInt index); void Kotlin_IntArray_set(ArrayHeader* obj, KInt index, KInt value); KInt Kotlin_IntArray_getArrayLength(const ArrayHeader* obj); +// io/Console.kt +void Kotlin_io_Console_print(const ArrayHeader* obj); + +// String.kt KInt Kotlin_String_compareTo(const ArrayHeader* obj, const ArrayHeader* other); KChar Kotlin_String_get(const ArrayHeader* obj, KInt index); ArrayHeader* Kotlin_String_fromUtf8Array(const ArrayHeader* array); diff --git a/runtime/src/main/kotlin/kotlin_native/Arrays.kt b/runtime/src/main/kotlin/kotlin_native/Arrays.kt new file mode 100644 index 00000000000..0f380821b06 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin_native/Arrays.kt @@ -0,0 +1,61 @@ +package kotlin_native + +class ByteArray : Cloneable { + // Constructors are handled with compiler magic. + private constructor() {} + + public val size: Int + get() = getArrayLength() + + @SymbolName("Kotlin_ByteArray_get") + external public operator fun get(index: Int): Byte + + @SymbolName("Kotlin_ByteArray_set") + external public operator fun set(index: Int, value: Byte): Unit + + @SymbolName("Kotlin_ByteArray_clone") + external public override fun clone(): Any + + @SymbolName("Kotlin_ByteArray_getArrayLength") + external private fun getArrayLength(): Int +} + +class CharArray : Cloneable { + // Constructors are handled with the compiler magic. + private constructor() {} + + public val size: Int + get() = getArrayLength() + + @SymbolName("Kotlin_CharArray_get") + external public operator fun get(index: Int): Char + + @SymbolName("Kotlin_CharArray_set") + external public operator fun set(index: Int, value: Char): Unit + + @SymbolName("Kotlin_CharArray_clone") + external public override fun clone(): Any + + @SymbolName("Kotlin_CharArray_getArrayLength") + external private fun getArrayLength(): Int +} + +class IntArray : Cloneable { + // Constructors are handled with the compiler magic. + private constructor() {} + + public val size: Int + get() = getArrayLength() + + @SymbolName("Kotlin_IntArray_get") + external public operator fun get(index: Int): Char + + @SymbolName("Kotlin_IntArray_set") + external public operator fun set(index: Int, value: Char): Unit + + @SymbolName("Kotlin_IntArray_clone") + external public override fun clone(): Any + + @SymbolName("Kotlin_IntArray_getArrayLength") + external private fun getArrayLength(): Int +} \ No newline at end of file diff --git a/runtime/src/main/kotlin/kotlin_native/Cloneable.kt b/runtime/src/main/kotlin/kotlin_native/Cloneable.kt new file mode 100644 index 00000000000..6fb678be938 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin_native/Cloneable.kt @@ -0,0 +1,5 @@ +package kotlin_native + +public interface Cloneable { + public fun clone(): Any +} diff --git a/runtime/src/main/kotlin/kotlin_native/String.kt b/runtime/src/main/kotlin/kotlin_native/String.kt index 488bbd8bbde..acb16b2da35 100644 --- a/runtime/src/main/kotlin/kotlin_native/String.kt +++ b/runtime/src/main/kotlin/kotlin_native/String.kt @@ -1,60 +1,5 @@ package kotlin_native -public interface Cloneable { - public fun clone(): Any -} - -class ByteArray(size: Int) : Cloneable { - public val size: Int - get() = getArrayLength() - - @SymbolName("Kotlin_ByteArray_get") - external public operator fun get(index: Int): Byte - - @SymbolName("Kotlin_ByteArray_set") - external public operator fun set(index: Int, value: Byte): Unit - - @SymbolName("Kotlin_ByteArray_clone") - external public override fun clone(): Any - - @SymbolName("Kotlin_ByteArray_getArrayLength") - external private fun getArrayLength(): Int -} - -class CharArray(size: Int) : Cloneable { - public val size: Int - get() = getArrayLength() - - @SymbolName("Kotlin_CharArray_get") - external public operator fun get(index: Int): Char - - @SymbolName("Kotlin_CharArray_set") - external public operator fun set(index: Int, value: Char): Unit - - @SymbolName("Kotlin_CharArray_clone") - external public override fun clone(): Any - - @SymbolName("Kotlin_CharArray_getArrayLength") - external private fun getArrayLength(): Int -} - -class IntArray(size: Int) : Cloneable { - public val size: Int - get() = getArrayLength() - - @SymbolName("Kotlin_IntArray_get") - external public operator fun get(index: Int): Char - - @SymbolName("Kotlin_IntArray_set") - external public operator fun set(index: Int, value: Char): Unit - - @SymbolName("Kotlin_IntArray_clone") - external public override fun clone(): Any - - @SymbolName("Kotlin_IntArray_getArrayLength") - external private fun getArrayLength(): Int -} - @SymbolName("Kotlin_String_fromUtf8Array") external fun fromUtf8Array(array: ByteArray) : String diff --git a/runtime/src/main/kotlin/kotlin_native/io/Console.kt b/runtime/src/main/kotlin/kotlin_native/io/Console.kt new file mode 100644 index 00000000000..229573077bc --- /dev/null +++ b/runtime/src/main/kotlin/kotlin_native/io/Console.kt @@ -0,0 +1,4 @@ +package kotlin_native.io + +@kotlin_native.SymbolName("Kotlin_io_Console_print") +external public fun print(message: kotlin_native.String) \ No newline at end of file