mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-04-05 08:31:31 +00:00
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.
99 lines
3.1 KiB
Kotlin
Vendored
99 lines
3.1 KiB
Kotlin
Vendored
// 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
|
|
|
|
var myIntPropFromConst: Int = constInt
|
|
var myBytePropFromConst: Byte = constByte
|
|
var myLongPropFromConst: Long = constLong
|
|
var myShortPropFromConst: Short = constShort
|
|
var myDoublePropFromConst: Double = constDouble
|
|
var myFloatPropFromConst: Float = constFloat
|
|
var myBooleanPropFromConst: Boolean = constBoolean
|
|
var myCharPropFromConst: Char = constChar
|
|
|
|
var myIntProp: Int = 0
|
|
var myByteProp: Byte = 0
|
|
var myLongProp: Long = 0L
|
|
var myShortProp: Short = 0
|
|
var myDoubleProp: Double = 0.0
|
|
var myFloatProp: Float = 0.0f
|
|
var myBooleanProp: Boolean = false
|
|
var myCharProp: Char = '\u0000'
|
|
|
|
var myStringProp: String? = null
|
|
var myAnyProp: Any? = null
|
|
var myObjectProp: java.lang.Object? = null
|
|
var myIntegerProp: java.lang.Integer? = null
|
|
|
|
// Fields
|
|
|
|
@JvmField
|
|
var myIntFieldFromConst: Int = constInt
|
|
@JvmField
|
|
var myByteFieldFromConst: Byte = constByte
|
|
@JvmField
|
|
var myLongFieldFromConst: Long = constLong
|
|
@JvmField
|
|
var myShortFieldFromConst: Short = constShort
|
|
@JvmField
|
|
var myDoubleFieldFromConst: Double = constDouble
|
|
@JvmField
|
|
var myFloatFieldFromConst: Float = constFloat
|
|
@JvmField
|
|
var myBooleanFieldFromConst: Boolean = constBoolean
|
|
@JvmField
|
|
var myCharFieldFromConst: Char = constChar
|
|
|
|
@JvmField
|
|
var myIntField: Int = 0
|
|
@JvmField
|
|
var myByteField: Byte = 0
|
|
@JvmField
|
|
var myLongField: Long = 0L
|
|
@JvmField
|
|
var myShortField: Short = 0
|
|
@JvmField
|
|
var myDoubleField: Double = 0.0
|
|
@JvmField
|
|
var myFloatField: Float = 0.0f
|
|
@JvmField
|
|
var myBooleanField: Boolean = false
|
|
@JvmField
|
|
var myCharField: Char = '\u0000'
|
|
|
|
@JvmField
|
|
var myStringField: String? = null
|
|
@JvmField
|
|
var myAnyField: Any? = null
|
|
@JvmField
|
|
var myObjectField: java.lang.Object? = null
|
|
@JvmField
|
|
var 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
|
|
var myDouble: Double = -0.0
|
|
var myFloat: Float = -0.0f
|
|
}
|
|
|
|
// There are 20 PUTSTATUCs in RedundantInitializersToDefault are in the setters for the 20 properties that don't have @JvmField.
|
|
// There are 2 PUTSTATICs in NonRedundantInitializers are also in setters, while the other 2 are in the constructor during initialization.
|
|
// There is 1 additional PUTSTATIC for both classes for the object instance.
|
|
|
|
// 21 PUTSTATIC RedundantInitializersToDefault
|
|
// 5 PUTSTATIC NonRedundantInitializers
|
|
// 0 PUTFIELD
|