Add more console operations, nicer naming in natives. (#46)
This commit is contained in:
@@ -153,7 +153,7 @@ task local_variable(type: UnitKonanTest) {
|
||||
}
|
||||
|
||||
task hello0(type: RunKonanTest) {
|
||||
goldValue = "Hello, world!"
|
||||
goldValue = "Hello, world!\n"
|
||||
source = "runtime/basic/hello0.kt"
|
||||
}
|
||||
|
||||
@@ -170,6 +170,12 @@ task hello2(type: RunKonanTest) {
|
||||
source = "runtime/basic/hello2.kt"
|
||||
} */
|
||||
|
||||
/* TODO: enable, once can call toString() on Int.
|
||||
task hello3(type: RunKonanTest) {
|
||||
goldValue = "239"
|
||||
source = "runtime/basic/hello3.kt"
|
||||
} */
|
||||
|
||||
task if_else(type: UnitKonanTest) {
|
||||
source = "codegen/branching/if_else.kt"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// TODO: remove kotlin_native.io once overrides are in place.
|
||||
fun main(args : Array<String>) {
|
||||
kotlin.io.print("Hello, world!")
|
||||
println("Hello, world!")
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// TODO: remove kotlin_native.io once overrides are in place.
|
||||
fun main(args : Array<String>) {
|
||||
kotlin.io.print(kotlin.io.readLine())
|
||||
print(readLine())
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
fun main(args : Array<String>) {
|
||||
print(239)
|
||||
}
|
||||
@@ -12,17 +12,17 @@
|
||||
extern "C" {
|
||||
|
||||
// Any.kt
|
||||
KBool Kotlin_Any_equals(const ObjHeader* thiz, const ObjHeader* other) {
|
||||
KBool Kotlin_Any_equals(KConstRef thiz, KConstRef other) {
|
||||
return thiz == other;
|
||||
}
|
||||
|
||||
KInt Kotlin_Any_hashCode(const ObjHeader* thiz) {
|
||||
KInt Kotlin_Any_hashCode(KConstRef thiz) {
|
||||
// Here we will use different mechanism for stable hashcode, using meta-objects
|
||||
// if moving collector will be used.
|
||||
return reinterpret_cast<uintptr_t>(thiz);
|
||||
}
|
||||
|
||||
ArrayHeader* Kotlin_Any_toString(const ObjHeader* thiz) {
|
||||
KString Kotlin_Any_toString(KConstRef thiz) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -141,13 +141,24 @@ KInt Kotlin_IntArray_getArrayLength(const ArrayHeader* array) {
|
||||
}
|
||||
|
||||
// io/Console.kt
|
||||
void Kotlin_io_Console_print(const ArrayHeader* array) {
|
||||
RuntimeAssert(array->type_info() == theStringTypeInfo, "Must use a string");
|
||||
void Kotlin_io_Console_print(KString message) {
|
||||
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
|
||||
// TODO: system stdout must be aware about UTF-8.
|
||||
write(STDOUT_FILENO, ByteArrayAddressOfElementAt(array, 0), array->count_);
|
||||
write(STDOUT_FILENO, ByteArrayAddressOfElementAt(message, 0), message->count_);
|
||||
}
|
||||
|
||||
ArrayHeader* Kotlin_io_Console_readLine() {
|
||||
void Kotlin_io_Console_println(KString message) {
|
||||
RuntimeAssert(message->type_info() == theStringTypeInfo, "Must use a string");
|
||||
// TODO: system stdout must be aware about UTF-8.
|
||||
write(STDOUT_FILENO, ByteArrayAddressOfElementAt(message, 0), message->count_);
|
||||
Kotlin_io_Console_println0();
|
||||
}
|
||||
|
||||
void Kotlin_io_Console_println0() {
|
||||
write(STDOUT_FILENO, "\n", 1);
|
||||
}
|
||||
|
||||
KString Kotlin_io_Console_readLine() {
|
||||
char data[2048];
|
||||
if (!fgets(data, sizeof(data) - 1, stdin)) {
|
||||
return nullptr;
|
||||
@@ -161,13 +172,13 @@ ArrayHeader* Kotlin_io_Console_readLine() {
|
||||
}
|
||||
|
||||
// String.kt
|
||||
KInt Kotlin_String_compareTo(const ArrayHeader* thiz, const ArrayHeader* other) {
|
||||
KInt Kotlin_String_compareTo(KString thiz, KString other) {
|
||||
return memcmp(ByteArrayAddressOfElementAt(thiz, 0),
|
||||
ByteArrayAddressOfElementAt(other, 0),
|
||||
thiz->count_ < other->count_ ? thiz->count_ : other->count_);
|
||||
}
|
||||
|
||||
KChar Kotlin_String_get(const ArrayHeader* thiz, KInt index) {
|
||||
KChar Kotlin_String_get(KString thiz, KInt index) {
|
||||
// TODO: support full UTF-8.
|
||||
if (static_cast<uint32_t>(index) >= thiz->count_) {
|
||||
ThrowArrayIndexOutOfBoundsException();
|
||||
@@ -175,11 +186,11 @@ KChar Kotlin_String_get(const ArrayHeader* thiz, KInt index) {
|
||||
return *ByteArrayAddressOfElementAt(thiz, index);
|
||||
}
|
||||
|
||||
KInt Kotlin_String_getStringLength(const ArrayHeader* thiz) {
|
||||
KInt Kotlin_String_getStringLength(KString thiz) {
|
||||
return thiz->count_;
|
||||
}
|
||||
|
||||
ArrayHeader* Kotlin_String_fromUtf8Array(const ArrayHeader* array) {
|
||||
KString Kotlin_String_fromUtf8Array(const ArrayHeader* array) {
|
||||
RuntimeAssert(array->type_info() == theByteArrayTypeInfo, "Must use a byte array");
|
||||
uint32_t length = ArraySizeBytes(array);
|
||||
// TODO: support full UTF-8.
|
||||
@@ -191,8 +202,7 @@ ArrayHeader* Kotlin_String_fromUtf8Array(const ArrayHeader* array) {
|
||||
return result;
|
||||
}
|
||||
|
||||
ArrayHeader* Kotlin_String_plusImpl(
|
||||
const ArrayHeader* thiz, const ArrayHeader* other) {
|
||||
KString Kotlin_String_plusImpl(KString thiz, KString other) {
|
||||
// TODO: support UTF-8
|
||||
RuntimeAssert(thiz->type_info() == theStringTypeInfo, "Must be a string");
|
||||
RuntimeAssert(other->type_info() == theStringTypeInfo, "Must be a string");
|
||||
@@ -210,8 +220,7 @@ ArrayHeader* Kotlin_String_plusImpl(
|
||||
return result;
|
||||
}
|
||||
|
||||
KBool Kotlin_String_equals(
|
||||
const ArrayHeader* thiz, const ObjHeader* other) {
|
||||
KBool Kotlin_String_equals(KString thiz, KConstRef other) {
|
||||
if (other == nullptr || other->type_info() != theStringTypeInfo) return 0;
|
||||
const ArrayHeader* otherString = reinterpret_cast<const ArrayHeader*>(other);
|
||||
return thiz->count_ == otherString->count_ &&
|
||||
@@ -220,14 +229,13 @@ KBool Kotlin_String_equals(
|
||||
thiz->count_) == 0;
|
||||
}
|
||||
|
||||
KInt Kotlin_String_hashCode(const ArrayHeader* thiz) {
|
||||
KInt Kotlin_String_hashCode(KString thiz) {
|
||||
// TODO: consider caching strings hashes.
|
||||
// TODO: maybe use some simpler hashing algorithm?
|
||||
return CityHash64(ByteArrayAddressOfElementAt(thiz, 0), thiz->count_);
|
||||
}
|
||||
|
||||
KRef Kotlin_String_subSequence(
|
||||
const ArrayHeader* thiz, KInt startIndex, KInt endIndex) {
|
||||
KRef Kotlin_String_subSequence(KString thiz, KInt startIndex, KInt endIndex) {
|
||||
RuntimeAssert(false, "Unsupported operation");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ typedef uint16_t KChar;
|
||||
typedef int32_t KInt;
|
||||
|
||||
typedef ObjHeader* KRef;
|
||||
typedef const ObjHeader* KConstRef;
|
||||
typedef const ArrayHeader* KString;
|
||||
|
||||
// Optimized versions not accessing type info.
|
||||
inline KByte* ByteArrayAddressOfElementAt(ArrayHeader* obj, KInt index) {
|
||||
@@ -52,9 +54,9 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
// Any.kt
|
||||
KBool Kotlin_Any_equals(const ObjHeader* thiz, const ObjHeader* other);
|
||||
KInt Kotlin_Any_hashCode(const ObjHeader* thiz);
|
||||
ArrayHeader* Kotlin_Any_toString(const ObjHeader* thiz);
|
||||
KBool Kotlin_Any_equals(KConstRef thiz, KConstRef other);
|
||||
KInt Kotlin_Any_hashCode(KConstRef thiz);
|
||||
KString Kotlin_Any_toString(KConstRef thiz);
|
||||
|
||||
// Arrays.kt
|
||||
// TODO: those must be compiler intrinsics afterwards.
|
||||
@@ -79,20 +81,23 @@ void Kotlin_IntArray_set(ArrayHeader* thiz, KInt index, KInt value);
|
||||
KInt Kotlin_IntArray_getArrayLength(const ArrayHeader* thiz);
|
||||
|
||||
// io/Console.kt
|
||||
void Kotlin_io_Console_print(const ArrayHeader* thiz);
|
||||
ArrayHeader* Kotlin_io_Console_readLine();
|
||||
void Kotlin_io_Console_print(KString message);
|
||||
void Kotlin_io_Console_println(KString message);
|
||||
void Kotlin_io_Console_println0();
|
||||
KString Kotlin_io_Console_readLine();
|
||||
|
||||
// Primitives.kt.
|
||||
KString Kotlin_Int_toString(KInt value);
|
||||
|
||||
// String.kt
|
||||
KInt Kotlin_String_hashCode(const ArrayHeader* thiz);
|
||||
KBool Kotlin_String_equals(const ArrayHeader* thiz, const ObjHeader* other);
|
||||
KInt Kotlin_String_compareTo(const ArrayHeader* thiz, const ArrayHeader* other);
|
||||
KChar Kotlin_String_get(const ArrayHeader* thiz, KInt index);
|
||||
ArrayHeader* Kotlin_String_fromUtf8Array(const ArrayHeader* array);
|
||||
ArrayHeader* Kotlin_String_plusImpl(
|
||||
const ArrayHeader* thiz, const ArrayHeader* other);
|
||||
KInt Kotlin_String_getStringLength(const ArrayHeader* thiz);
|
||||
KRef Kotlin_String_subSequence(
|
||||
const ArrayHeader* thiz, KInt startIndex, KInt endIndex);
|
||||
KInt Kotlin_String_hashCode(KString thiz);
|
||||
KBool Kotlin_String_equals(KString thiz, KConstRef other);
|
||||
KInt Kotlin_String_compareTo(KString thiz, KString other);
|
||||
KChar Kotlin_String_get(KString thiz, KInt index);
|
||||
KString Kotlin_String_fromUtf8Array(const ArrayHeader* array);
|
||||
KString Kotlin_String_plusImpl(KString thiz, KString other);
|
||||
KInt Kotlin_String_getStringLength(KString thiz);
|
||||
KRef Kotlin_String_subSequence(KString thiz, KInt startIndex, KInt endIndex);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -144,6 +144,10 @@ public class Byte : Number(), Comparable<Byte> {
|
||||
external public override fun toLong(): Long
|
||||
external public override fun toFloat(): Float
|
||||
external public override fun toDouble(): Double
|
||||
|
||||
// Konan-specific.
|
||||
@SymbolName("Kotlin_Int_toString")
|
||||
external public override fun toString(): String
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,7 +1,18 @@
|
||||
package kotlin.io
|
||||
|
||||
@kotlin.SymbolName("Kotlin_io_Console_print")
|
||||
external public fun print(message: kotlin.String)
|
||||
external public fun print(message: String)
|
||||
|
||||
/*
|
||||
public fun print(message: Int) {
|
||||
print(message.toString())
|
||||
} */
|
||||
|
||||
@kotlin.SymbolName("Kotlin_io_Console_println")
|
||||
external public fun println(message: String)
|
||||
|
||||
@kotlin.SymbolName("Kotlin_io_Console_println0")
|
||||
external public fun println()
|
||||
|
||||
@kotlin.SymbolName("Kotlin_io_Console_readLine")
|
||||
external public fun readLine(): kotlin.String
|
||||
external public fun readLine(): String
|
||||
|
||||
Reference in New Issue
Block a user