IR interpreter: fix calculation of constant Java fields
#KT-42117 Fixed
This commit is contained in:
@@ -266,7 +266,9 @@ class Fir2IrConverter(
|
|||||||
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, irBuiltIns, irFactory, mangler)
|
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, irBuiltIns, irFactory, mangler)
|
||||||
val conversionScope = Fir2IrConversionScope()
|
val conversionScope = Fir2IrConversionScope()
|
||||||
val classifierStorage = Fir2IrClassifierStorage(components)
|
val classifierStorage = Fir2IrClassifierStorage(components)
|
||||||
val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor)
|
val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components)
|
||||||
|
val fir2irVisitor = Fir2IrVisitor(converter, components, conversionScope)
|
||||||
|
val declarationStorage = Fir2IrDeclarationStorage(components, fir2irVisitor, moduleDescriptor)
|
||||||
val typeConverter = Fir2IrTypeConverter(components)
|
val typeConverter = Fir2IrTypeConverter(components)
|
||||||
val builtIns = Fir2IrBuiltIns(components, session)
|
val builtIns = Fir2IrBuiltIns(components, session)
|
||||||
components.declarationStorage = declarationStorage
|
components.declarationStorage = declarationStorage
|
||||||
@@ -276,7 +278,6 @@ class Fir2IrConverter(
|
|||||||
components.builtIns = builtIns
|
components.builtIns = builtIns
|
||||||
val irFiles = mutableListOf<IrFile>()
|
val irFiles = mutableListOf<IrFile>()
|
||||||
|
|
||||||
val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components)
|
|
||||||
for (firFile in firFiles) {
|
for (firFile in firFiles) {
|
||||||
irFiles += converter.registerFileAndClasses(firFile)
|
irFiles += converter.registerFileAndClasses(firFile)
|
||||||
}
|
}
|
||||||
@@ -295,7 +296,6 @@ class Fir2IrConverter(
|
|||||||
session, scopeSession, classifierStorage, declarationStorage, conversionScope
|
session, scopeSession, classifierStorage, declarationStorage, conversionScope
|
||||||
)
|
)
|
||||||
components.fakeOverrideGenerator = fakeOverrideGenerator
|
components.fakeOverrideGenerator = fakeOverrideGenerator
|
||||||
val fir2irVisitor = Fir2IrVisitor(converter, components, conversionScope)
|
|
||||||
val callGenerator = CallAndReferenceGenerator(components, fir2irVisitor, conversionScope)
|
val callGenerator = CallAndReferenceGenerator(components, fir2irVisitor, conversionScope)
|
||||||
components.callGenerator = callGenerator
|
components.callGenerator = callGenerator
|
||||||
declarationStorage.annotationGenerator = AnnotationGenerator(components)
|
declarationStorage.annotationGenerator = AnnotationGenerator(components)
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
|||||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
class Fir2IrDeclarationStorage(
|
class Fir2IrDeclarationStorage(
|
||||||
private val components: Fir2IrComponents,
|
private val components: Fir2IrComponents,
|
||||||
|
private val visitor: Fir2IrVisitor,
|
||||||
private val moduleDescriptor: FirModuleDescriptor
|
private val moduleDescriptor: FirModuleDescriptor
|
||||||
) : Fir2IrComponents by components {
|
) : Fir2IrComponents by components {
|
||||||
|
|
||||||
@@ -812,6 +813,11 @@ class Fir2IrDeclarationStorage(
|
|||||||
isExternal = false,
|
isExternal = false,
|
||||||
isStatic = field.isStatic
|
isStatic = field.isStatic
|
||||||
).apply {
|
).apply {
|
||||||
|
field.initializer?.let {
|
||||||
|
val expression = visitor.convertToIrExpression(it)
|
||||||
|
expression.type = type
|
||||||
|
initializer = irFactory.createExpressionBody(expression)
|
||||||
|
}
|
||||||
descriptor.bind(this)
|
descriptor.bind(this)
|
||||||
fieldCache[field] = this
|
fieldCache[field] = this
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-14
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.ir.IrElement
|
|||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.types.classifierOrNull
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.types.isAny
|
|
||||||
import org.jetbrains.kotlin.ir.types.isPrimitiveType
|
|
||||||
import org.jetbrains.kotlin.ir.types.isString
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -173,19 +170,10 @@ class IrCompileTimeChecker(
|
|||||||
val owner = expression.symbol.owner
|
val owner = expression.symbol.owner
|
||||||
val parent = owner.parent as IrSymbolOwner
|
val parent = owner.parent as IrSymbolOwner
|
||||||
val isJavaPrimitiveStatic = owner.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && owner.isStatic &&
|
val isJavaPrimitiveStatic = owner.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && owner.isStatic &&
|
||||||
owner.parentAsClass.fqNameWhenAvailable.isJavaPrimitive()
|
(owner.type.isPrimitiveType() || owner.type.isStringClassType())
|
||||||
return visitedStack.contains(parent) || isJavaPrimitiveStatic
|
return visitedStack.contains(parent) || isJavaPrimitiveStatic
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO find similar method in utils
|
|
||||||
private fun FqName?.isJavaPrimitive(): Boolean {
|
|
||||||
this ?: return false
|
|
||||||
return this.toString() in setOf(
|
|
||||||
"java.lang.Byte", "java.lang.Short", "java.lang.Integer", "java.lang.Long",
|
|
||||||
"java.lang.Float", "java.lang.Double", "java.lang.Boolean", "java.lang.Character"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitSetField(expression: IrSetField, data: Nothing?): Boolean {
|
override fun visitSetField(expression: IrSetField, data: Nothing?): Boolean {
|
||||||
//todo check receiver?
|
//todo check receiver?
|
||||||
val parent = expression.symbol.owner.parent as IrSymbolOwner
|
val parent = expression.symbol.owner.parent as IrSymbolOwner
|
||||||
|
|||||||
@@ -533,6 +533,10 @@ class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map
|
|||||||
val field = expression.symbol.owner
|
val field = expression.symbol.owner
|
||||||
// for java static variables
|
// for java static variables
|
||||||
if (field.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && field.isStatic) {
|
if (field.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && field.isStatic) {
|
||||||
|
val initializerExpression = field.initializer?.expression
|
||||||
|
if (initializerExpression is IrConst<*>) {
|
||||||
|
return interpretConst(initializerExpression)
|
||||||
|
}
|
||||||
stack.pushReturnValue(Wrapper.getStaticGetter(field)!!.invokeWithArguments().toState(field.type))
|
stack.pushReturnValue(Wrapper.getStaticGetter(field)!!.invokeWithArguments().toState(field.type))
|
||||||
return Next
|
return Next
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: Foo.java
|
// FILE: Foo.java
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: Foo.java
|
// FILE: Foo.java
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: Foo.java
|
// FILE: Foo.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// FILE: first/JavaSuperclass.java
|
// FILE: first/JavaSuperclass.java
|
||||||
|
|
||||||
package first;
|
package first;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// FILE: first/Foo.java
|
// FILE: first/Foo.java
|
||||||
|
|
||||||
package first;
|
package first;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// FILE: JClass.java
|
// FILE: JClass.java
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun foo1(x: Int): Boolean {
|
fun foo1(x: Int): Boolean {
|
||||||
when(x) {
|
when(x) {
|
||||||
0 -> return true
|
0 -> return true
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ FILE fqName:interop fileName:/Definitions.kt
|
|||||||
PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
||||||
FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String? visibility:public [final]
|
FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String? visibility:public [final]
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:CONSTANT type:kotlin.String? visibility:public [final,static]' type=kotlin.String? origin=GET_PROPERTY
|
CONST String type=kotlin.String value="constant"
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-KT_CONSTANT> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String?
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-KT_CONSTANT> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String?
|
||||||
correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
||||||
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
||||||
|
|||||||
Reference in New Issue
Block a user