[JVM IR] Fix issue where fields are not being set to their default
values within initializer blocks.
The issue occurs in code like this:
```
class C {
var b = true
init {
b = false // Missing PUTFIELD for this statement
}
}
```
Added a new statement origin for field initialization (at declaration)
instead of relying on `origin == null` in ExpressionCodegen to determine
whether to generate the initializations.
This was unintentionally broken in
d68a1898d0.
This commit is contained in:
committed by
Dmitry Petrov
parent
56c819f06e
commit
64141b8b38
@@ -0,0 +1,95 @@
|
||||
// No initializers for this class because the fields/properties are initialized to defaults.
|
||||
object RedundantInitializersToDefault {
|
||||
// Constants
|
||||
|
||||
const val constInt: Int = 0
|
||||
const val constByte: Byte = 0
|
||||
const val constLong: Long = 0L
|
||||
const val constShort: Short = 0
|
||||
const val constDouble: Double = 0.0
|
||||
const val constFloat: Float = 0.0f
|
||||
const val constBoolean: Boolean = false
|
||||
const val constChar: Char = '\u0000'
|
||||
|
||||
// Properties
|
||||
|
||||
val myIntPropFromConst: Int = constInt
|
||||
val myBytePropFromConst: Byte = constByte
|
||||
val myLongPropFromConst: Long = constLong
|
||||
val myShortPropFromConst: Short = constShort
|
||||
val myDoublePropFromConst: Double = constDouble
|
||||
val myFloatPropFromConst: Float = constFloat
|
||||
val myBooleanPropFromConst: Boolean = constBoolean
|
||||
val myCharPropFromConst: Char = constChar
|
||||
|
||||
val myIntProp: Int = 0
|
||||
val myByteProp: Byte = 0
|
||||
val myLongProp: Long = 0L
|
||||
val myShortProp: Short = 0
|
||||
val myDoubleProp: Double = 0.0
|
||||
val myFloatProp: Float = 0.0f
|
||||
val myBooleanProp: Boolean = false
|
||||
val myCharProp: Char = '\u0000'
|
||||
|
||||
val myStringProp: String? = null
|
||||
val myAnyProp: Any? = null
|
||||
val myObjectProp: java.lang.Object? = null
|
||||
val myIntegerProp: java.lang.Integer? = null
|
||||
|
||||
// Fields
|
||||
|
||||
@JvmField
|
||||
val myIntFieldFromConst: Int = constInt
|
||||
@JvmField
|
||||
val myByteFieldFromConst: Byte = constByte
|
||||
@JvmField
|
||||
val myLongFieldFromConst: Long = constLong
|
||||
@JvmField
|
||||
val myShortFieldFromConst: Short = constShort
|
||||
@JvmField
|
||||
val myDoubleFieldFromConst: Double = constDouble
|
||||
@JvmField
|
||||
val myFloatFieldFromConst: Float = constFloat
|
||||
@JvmField
|
||||
val myBooleanFieldFromConst: Boolean = constBoolean
|
||||
@JvmField
|
||||
val myCharFieldFromConst: Char = constChar
|
||||
|
||||
@JvmField
|
||||
val myIntField: Int = 0
|
||||
@JvmField
|
||||
val myByteField: Byte = 0
|
||||
@JvmField
|
||||
val myLongField: Long = 0L
|
||||
@JvmField
|
||||
val myShortField: Short = 0
|
||||
@JvmField
|
||||
val myDoubleField: Double = 0.0
|
||||
@JvmField
|
||||
val myFloatField: Float = 0.0f
|
||||
@JvmField
|
||||
val myBooleanField: Boolean = false
|
||||
@JvmField
|
||||
val myCharField: Char = '\u0000'
|
||||
|
||||
@JvmField
|
||||
val myStringField: String? = null
|
||||
@JvmField
|
||||
val myAnyField: Any? = null
|
||||
@JvmField
|
||||
val myObjectField: java.lang.Object? = null
|
||||
@JvmField
|
||||
val myIntegerField: java.lang.Integer? = null
|
||||
}
|
||||
|
||||
object NonRedundantInitializers {
|
||||
// NOT redundant because the JVM's default values for floating-point types are positive 0.0.
|
||||
// See: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.3
|
||||
val myDouble: Double = -0.0
|
||||
val myFloat: Float = -0.0f
|
||||
}
|
||||
|
||||
// There is 1 additional PUTSTATIC for both classes for the object instance.
|
||||
|
||||
// 1 PUTSTATIC RedundantInitializersToDefault
|
||||
// 3 PUTSTATIC NonRedundantInitializers
|
||||
Reference in New Issue
Block a user