From 12e427b4b5c5f12d34cda40e0c0dac3fd037b1c4 Mon Sep 17 00:00:00 2001 From: meztihn Date: Mon, 19 Feb 2018 22:41:14 +0500 Subject: [PATCH] KT-11208 Remove readLine's new charset parameter It can't be introduced in a patch release. --- libraries/stdlib/src/kotlin/io/Console.kt | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/libraries/stdlib/src/kotlin/io/Console.kt b/libraries/stdlib/src/kotlin/io/Console.kt index 1c4adcaa46c..ed2ca4ca918 100644 --- a/libraries/stdlib/src/kotlin/io/Console.kt +++ b/libraries/stdlib/src/kotlin/io/Console.kt @@ -139,22 +139,14 @@ public inline fun println() { private const val BUFFER_SIZE: Int = 32 private const val LINE_SEPARATOR_MAX_LENGTH: Int = 2 -private var cachedDecoder: CharsetDecoder? = null - -private fun decoderFor(charset: Charset): CharsetDecoder { - return cachedDecoder?.takeIf { cached -> - cached.charset() == charset - } ?: charset.newDecoder().also { newDecoder -> - cachedDecoder = newDecoder - } -} +private val decoder: CharsetDecoder by lazy { Charset.defaultCharset().newDecoder() } /** * Reads a line of input from the standard input stream. * * @return the line read or `null` if the input stream is redirected to a file and the end of file has been reached. */ -fun readLine(charset: Charset = Charset.defaultCharset()): String? = readLine(System.`in`, decoderFor(charset)) +fun readLine(): String? = readLine(System.`in`, decoder) internal fun readLine(inputStream: InputStream, decoder: CharsetDecoder): String? { require(decoder.maxCharsPerByte() <= 1) { "Encodings with multiple chars per byte are not supported" } @@ -165,7 +157,7 @@ internal fun readLine(inputStream: InputStream, decoder: CharsetDecoder): String var read = inputStream.read() if (read == -1) return null - while (read != -1) { + do { byteBuffer.put(read.toByte()) if (decoder.tryDecode(byteBuffer, charBuffer, false)) { if (charBuffer.containsLineSeparator()) { @@ -176,7 +168,7 @@ internal fun readLine(inputStream: InputStream, decoder: CharsetDecoder): String } } read = inputStream.read() - } + } while (read != -1) with(decoder) { tryDecode(byteBuffer, charBuffer, true) // throws exception if undecoded bytes are left