[WASM] Implement data class hashCode and toString for arrays

This commit is contained in:
Igor Yakovlev
2022-02-23 17:04:35 +01:00
committed by teamcity
parent 8a20df1a97
commit f0f94623f4
3 changed files with 42 additions and 23 deletions
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.render
@@ -205,6 +202,24 @@ class WasmSymbols(
val arraysCopyInto = findFunctions(collectionsPackage.memberScope, Name.identifier("copyInto"))
.map { symbolTable.referenceSimpleFunction(it) }
private val contentToString: List<IrSimpleFunctionSymbol> =
findFunctions(collectionsPackage.memberScope, Name.identifier("contentToString"))
.map { symbolTable.referenceSimpleFunction(it) }
private val contentHashCode: List<IrSimpleFunctionSymbol> =
findFunctions(collectionsPackage.memberScope, Name.identifier("contentHashCode"))
.map { symbolTable.referenceSimpleFunction(it) }
private fun findOverloadForReceiver(arrayType: IrType, overloadsList: List<IrSimpleFunctionSymbol>): IrSimpleFunctionSymbol =
overloadsList.first {
val receiverType = it.owner.extensionReceiverParameter?.type
receiverType != null && arrayType.isNullable() == receiverType.isNullable() && arrayType.classOrNull == receiverType.classOrNull
}
fun findContentToStringOverload(arrayType: IrType): IrSimpleFunctionSymbol = findOverloadForReceiver(arrayType, contentToString)
fun findContentHashCodeOverload(arrayType: IrType): IrSimpleFunctionSymbol = findOverloadForReceiver(arrayType, contentHashCode)
private val getProgressionLastElementSymbols =
irBuiltIns.findFunctions(Name.identifier("getProgressionLastElement"), "kotlin", "internal")
@@ -13,19 +13,14 @@ import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.backend.js.utils.isEqualsInheritedFromAny
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irCallConstructor
import org.jetbrains.kotlin.ir.builders.irComposite
import org.jetbrains.kotlin.ir.builders.irInt
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.interpreter.toIrConst
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classFqName
import org.jetbrains.kotlin.ir.types.getClass
import org.jetbrains.kotlin.ir.types.isNullable
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.parentOrNull
@@ -112,17 +107,27 @@ class BuiltInsLowering(val context: WasmBackendContext) : FileLoweringPass {
putValueArgument(0, call.getValueArgument(0)!!)
}
irBuiltins.dataClassArrayMemberHashCodeSymbol -> {
// TODO: Implement
return builder.irComposite {
+call.getValueArgument(0)!!
+irInt(7777)
irBuiltins.dataClassArrayMemberHashCodeSymbol, irBuiltins.dataClassArrayMemberToStringSymbol -> {
val argument = call.getValueArgument(0)!!
val argumentType = argument.type
val overloadSymbol: IrSimpleFunctionSymbol
val returnType: IrType
if (symbol == irBuiltins.dataClassArrayMemberHashCodeSymbol) {
overloadSymbol = symbols.findContentHashCodeOverload(argumentType)
returnType = irBuiltins.intType
} else {
overloadSymbol = symbols.findContentToStringOverload(argumentType)
returnType = irBuiltins.stringType
}
}
irBuiltins.dataClassArrayMemberToStringSymbol -> {
// TODO: Implement
return builder.irCall(symbols.anyNtoString).apply {
putValueArgument(0, call.getValueArgument(0))
return builder.irCall(
overloadSymbol,
returnType,
).apply {
extensionReceiver = argument
if (argumentType.classOrNull == irBuiltins.arrayClass) {
putTypeArgument(0, argumentType.getArrayElementType(irBuiltins))
}
}
}
in symbols.startCoroutineUninterceptedOrReturnIntrinsics -> {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: WASM
// WASM_MUTE_REASON: IGNORED_IN_JS
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS_IR_ES6