Put default value (null or zero) to slot for uninitialized values

This way range of the variable is correct in LVT.
 #KT-24672 Fixed
This commit is contained in:
Ilmir Usmanov
2018-12-26 17:56:44 +03:00
parent 8ab9226805
commit a52f430d8f
14 changed files with 360 additions and 0 deletions
@@ -0,0 +1,12 @@
// IGNORE_BACKEND: JVM_IR
fun test(): java.lang.Integer {
val c: java.lang.Integer
run {
c = java.lang.Integer(1)
}
return c
}
// 2 ASTORE 0
// 1 LOCALVARIABLE c Ljava/lang/Integer; L1 L10 0
@@ -0,0 +1,25 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@ExperimentalContracts
fun test(): Char {
val c: Char
doIt {
c = ' '
}
return c
}
@ExperimentalContracts
fun doIt(block: () -> Unit) {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
}
// 2 FCONST 0
// 1 LOCALVARIABLE c Lkotlin/jvm/internal/Ref$CharRef; L1 L10 0
@@ -0,0 +1,16 @@
// IGNORE_BACKEND: JVM_IR
inline fun <reified T> foo(default: T): T {
val t: T
run {
t = default
}
return t
}
fun test() {
foo(0.0f)
}
// 2 ASTORE 1
// 1 LOCALVARIABLE t\$iv Ljava/lang/Object; L2 L11 1
@@ -0,0 +1,16 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.random.Random
fun test(): Char {
val c: Char
if (Random.nextBoolean()) {
c = '1'
} else {
c = '2'
}
return c
}
// 3 ISTORE 0
// 1 LOCALVARIABLE c C L1 L7 0
@@ -0,0 +1,16 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.random.Random
fun test(): Char {
val c: Char
if (Random.nextBoolean())
c = '1'
else
c = '2'
return c
}
// 3 ISTORE 0
// 1 LOCALVARIABLE c C L1 L5 0
@@ -0,0 +1,12 @@
// IGNORE_BACKEND: JVM_IR
fun test(): UInt {
val c: UInt
run {
c = 1u
}
return c
}
// 2 ISTORE 0
// 1 LOCALVARIABLE c I L1 L10 0
@@ -0,0 +1,12 @@
// IGNORE_BACKEND: JVM_IR
fun test(): Char {
lateinit var c: Any
run {
c = ' '
}
return c as Char
}
// 2 ASTORE 0
// 1 LOCALVARIABLE c Ljava/lang/Object; L1 L11 0
@@ -0,0 +1,14 @@
// IGNORE_BACKEND: JVM_IR
fun test(): Char {
val c: Char
run {
c = ' '
println(c)
}
return c
}
// The first on declaration, the other on initialization
// 2 ISTORE 0
// 1 LOCALVARIABLE c C L1 L13 0
@@ -0,0 +1,23 @@
// IGNORE_BACKEND: JVM_IR
fun test(): Char {
val c: Char
val l = Any()
val l1 = Any()
val l2 = Any()
val l3 = Any()
val l4 = Any()
val l5 = Any()
val l6 = Any()
val l7 = Any()
val l8 = Any()
val l11 = Any()
val l12 = Any()
val l13 = Any()
val l14 = Any()
c = '1'
return c
}
// 2 ISTORE 0
// 1 LOCALVARIABLE c C L1 L16 0
@@ -0,0 +1,12 @@
// IGNORE_BACKEND: JVM_IR
fun test(): Char {
var c: Char
run {
c = ' '
}
return c
}
// 1 ASTORE 0
// 1 LOCALVARIABLE c Lkotlin/jvm/internal/Ref\$CharRef; L1 L10 0
@@ -0,0 +1,22 @@
// IGNORE_BACKEND: JVM_IR
fun test(i: Int): Char {
val c: Char
when (i) {
1 -> c = '1'
2 -> c = '2'
3 -> c = '3'
4 -> c = '4'
5 -> c = '5'
6 -> c = '6'
7 -> c = '7'
8 -> c = '8'
9 -> c = '9'
0 -> c = '0'
else -> c = ' '
}
return c
}
// 12 ISTORE 1
// 1 LOCALVARIABLE c C L1 L16 1