[K/N] Throwable.printStackTrace() should print to the stderr output
Aligns with the JVM behavior. As a part of efforts to stabilize Native stdlib.
This commit is contained in:
committed by
Space Team
parent
d972b78627
commit
0cfb80144a
@@ -32,24 +32,40 @@
|
|||||||
|
|
||||||
using namespace kotlin;
|
using namespace kotlin;
|
||||||
|
|
||||||
extern "C" {
|
namespace {
|
||||||
|
|
||||||
// io/Console.kt
|
std_support::string kStringToUtf8(KString message) {
|
||||||
void Kotlin_io_Console_print(KString message) {
|
|
||||||
if (message->type_info() != theStringTypeInfo) {
|
if (message->type_info() != theStringTypeInfo) {
|
||||||
ThrowClassCastException(message->obj(), theStringTypeInfo);
|
ThrowClassCastException(message->obj(), theStringTypeInfo);
|
||||||
}
|
}
|
||||||
// TODO: system stdout must be aware about UTF-8.
|
|
||||||
const KChar* utf16 = CharArrayAddressOfElementAt(message, 0);
|
const KChar* utf16 = CharArrayAddressOfElementAt(message, 0);
|
||||||
std_support::string utf8;
|
std_support::string utf8;
|
||||||
utf8.reserve(message->count_);
|
utf8.reserve(message->count_);
|
||||||
// Replace incorrect sequences with a default codepoint (see utf8::with_replacement::default_replacement)
|
// Replace incorrect sequences with a default codepoint (see utf8::with_replacement::default_replacement)
|
||||||
utf8::with_replacement::utf16to8(utf16, utf16 + message->count_, back_inserter(utf8));
|
utf8::with_replacement::utf16to8(utf16, utf16 + message->count_, back_inserter(utf8));
|
||||||
|
|
||||||
|
return utf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
// io/Console.kt
|
||||||
|
void Kotlin_io_Console_print(KString message) {
|
||||||
|
// TODO: system stdout must be aware about UTF-8.
|
||||||
|
auto utf8 = kStringToUtf8(message);
|
||||||
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
||||||
konan::consoleWriteUtf8(utf8.c_str(), utf8.size());
|
konan::consoleWriteUtf8(utf8.c_str(), utf8.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Kotlin_io_Console_printToStdErr(KString message) {
|
||||||
|
// TODO: system stderr must be aware about UTF-8.
|
||||||
|
auto utf8 = kStringToUtf8(message);
|
||||||
|
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
||||||
|
konan::consoleErrorUtf8(utf8.c_str(), utf8.size());
|
||||||
|
}
|
||||||
|
|
||||||
void Kotlin_io_Console_println(KString message) {
|
void Kotlin_io_Console_println(KString message) {
|
||||||
Kotlin_io_Console_print(message);
|
Kotlin_io_Console_print(message);
|
||||||
#ifndef KONAN_ANDROID
|
#ifndef KONAN_ANDROID
|
||||||
@@ -62,11 +78,28 @@ void Kotlin_io_Console_println(KString message) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Kotlin_io_Console_printlnToStdErr(KString message) {
|
||||||
|
Kotlin_io_Console_printToStdErr(message);
|
||||||
|
#ifndef KONAN_ANDROID
|
||||||
|
Kotlin_io_Console_println0ToStdErr();
|
||||||
|
#else
|
||||||
|
// On Android single print produces logcat entry, so no need in linefeed.
|
||||||
|
if (!kotlin::compiler::printToAndroidLogcat()) {
|
||||||
|
Kotlin_io_Console_println0ToStdErr();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void Kotlin_io_Console_println0() {
|
void Kotlin_io_Console_println0() {
|
||||||
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
||||||
konan::consoleWriteUtf8("\n", 1);
|
konan::consoleWriteUtf8("\n", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Kotlin_io_Console_println0ToStdErr() {
|
||||||
|
kotlin::ThreadStateGuard guard(kotlin::ThreadState::kNative);
|
||||||
|
konan::consoleErrorUtf8("\n", 1);
|
||||||
|
}
|
||||||
|
|
||||||
OBJ_GETTER0(Kotlin_io_Console_readLine) {
|
OBJ_GETTER0(Kotlin_io_Console_readLine) {
|
||||||
char data[4096];
|
char data[4096];
|
||||||
int32_t result;
|
int32_t result;
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ extern "C" {
|
|||||||
|
|
||||||
OBJ_GETTER0(TheEmptyString);
|
OBJ_GETTER0(TheEmptyString);
|
||||||
void Kotlin_io_Console_println0();
|
void Kotlin_io_Console_println0();
|
||||||
|
void Kotlin_io_Console_println0ToStdErr();
|
||||||
void Kotlin_NativePtrArray_set(KRef thiz, KInt index, KNativePtr value);
|
void Kotlin_NativePtrArray_set(KRef thiz, KInt index, KNativePtr value);
|
||||||
KNativePtr Kotlin_NativePtrArray_get(KConstRef thiz, KInt index);
|
KNativePtr Kotlin_NativePtrArray_get(KConstRef thiz, KInt index);
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ void consoleWriteUtf8(const char* utf8, uint32_t sizeBytes) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
NO_EXTERNAL_CALLS_CHECK void consoleErrorUtf8(const char* utf8, uint32_t sizeBytes) {
|
void consoleErrorUtf8(const char* utf8, uint32_t sizeBytes) {
|
||||||
#ifdef KONAN_ANDROID
|
#ifdef KONAN_ANDROID
|
||||||
if (kotlin::compiler::printToAndroidLogcat()) {
|
if (kotlin::compiler::printToAndroidLogcat()) {
|
||||||
// TODO: use sizeBytes!
|
// TODO: use sizeBytes!
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public open class Throwable(open val message: String?, open val cause: Throwable
|
|||||||
(0 until stackTrace.size).map { index -> stackTrace[index].toLong() }
|
(0 until stackTrace.size).map { index -> stackTrace[index].toLong() }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints the [detailed description][Throwable.stackTraceToString] of this throwable to the standard output.
|
* Prints the [detailed description][Throwable.stackTraceToString] of this throwable to the standard error output.
|
||||||
*
|
*
|
||||||
* Note that the format of the output is not stable and may change in the future.
|
* Note that the format of the output is not stable and may change in the future.
|
||||||
*/
|
*/
|
||||||
@@ -75,7 +75,7 @@ public open class Throwable(open val message: String?, open val cause: Throwable
|
|||||||
|
|
||||||
private fun StringBuilder.endln() {
|
private fun StringBuilder.endln() {
|
||||||
if (printOut) {
|
if (printOut) {
|
||||||
println(this)
|
printlnToStdErr(this.toString())
|
||||||
clear()
|
clear()
|
||||||
} else {
|
} else {
|
||||||
appendLine()
|
appendLine()
|
||||||
@@ -169,7 +169,7 @@ private external fun getStackTraceStrings(stackTrace: NativePtrArray): Array<Str
|
|||||||
public actual fun Throwable.stackTraceToString(): String = dumpStackTrace()
|
public actual fun Throwable.stackTraceToString(): String = dumpStackTrace()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints the [detailed description][Throwable.stackTraceToString] of this throwable to the standard output.
|
* Prints the [detailed description][Throwable.stackTraceToString] of this throwable to the standard error output.
|
||||||
*
|
*
|
||||||
* Note that the format of the output is not stable and may change in the future.
|
* Note that the format of the output is not stable and may change in the future.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ public actual fun print(message: Any?) {
|
|||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal external fun println(message: String)
|
internal external fun println(message: String)
|
||||||
|
|
||||||
|
/** Prints the given [message] and the line separator to the standard error output stream. */
|
||||||
|
@GCUnsafeCall("Kotlin_io_Console_printlnToStdErr")
|
||||||
|
internal external fun printlnToStdErr(message: String)
|
||||||
|
|
||||||
/** Prints the given [message] and the line separator to the standard output stream. */
|
/** Prints the given [message] and the line separator to the standard output stream. */
|
||||||
public actual fun println(message: Any?) {
|
public actual fun println(message: Any?) {
|
||||||
println(message.toString())
|
println(message.toString())
|
||||||
|
|||||||
Reference in New Issue
Block a user