Fix KCallable.call for equals/hashCode/toString
Other built-in functions should be supported in the same way one day
This commit is contained in:
@@ -60,7 +60,7 @@ open class KFunctionImpl protected constructor(
|
|||||||
Visibilities.isPrivate(descriptor.visibility))
|
Visibilities.isPrivate(descriptor.visibility))
|
||||||
is JavaMethod -> jvmSignature.method
|
is JavaMethod -> jvmSignature.method
|
||||||
is JavaConstructor -> jvmSignature.constructor
|
is JavaConstructor -> jvmSignature.constructor
|
||||||
is BuiltInFunction -> throw KotlinReflectionInternalError("Built-in functions are not fully supported yet: $descriptor")
|
is BuiltInFunction -> jvmSignature.getMember(container)
|
||||||
}
|
}
|
||||||
|
|
||||||
when (member) {
|
when (member) {
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
|
|||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||||
import java.lang.reflect.Constructor
|
import java.lang.reflect.Constructor
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
|
import java.lang.reflect.Member
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
import kotlin.reflect.KotlinReflectionInternalError
|
import kotlin.reflect.KotlinReflectionInternalError
|
||||||
|
|
||||||
@@ -67,8 +68,14 @@ sealed class JvmFunctionSignature {
|
|||||||
"V"
|
"V"
|
||||||
}
|
}
|
||||||
|
|
||||||
class BuiltInFunction(private val signature: String) : JvmFunctionSignature() {
|
open class BuiltInFunction(private val signature: String) : JvmFunctionSignature() {
|
||||||
|
open fun getMember(container: KCallableContainerImpl): Member? = null
|
||||||
|
|
||||||
override fun asString(): String = signature
|
override fun asString(): String = signature
|
||||||
|
|
||||||
|
class Predefined(signature: String, private val member: Member): BuiltInFunction(signature) {
|
||||||
|
override fun getMember(container: KCallableContainerImpl): Member = member
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,20 +166,17 @@ object RuntimeTypeMapper {
|
|||||||
val parameters = function.valueParameters
|
val parameters = function.valueParameters
|
||||||
|
|
||||||
when (function.name.asString()) {
|
when (function.name.asString()) {
|
||||||
"equals" -> {
|
"equals" -> if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) {
|
||||||
if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) {
|
return JvmFunctionSignature.BuiltInFunction.Predefined("equals(Ljava/lang/Object;)Z",
|
||||||
return JvmFunctionSignature.BuiltInFunction("equals(Ljava/lang/Object;)Z")
|
javaClass<Any>().getDeclaredMethod("equals", javaClass<Any>()))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"hashCode" -> {
|
"hashCode" -> if (parameters.isEmpty()) {
|
||||||
if (parameters.isEmpty()) {
|
return JvmFunctionSignature.BuiltInFunction.Predefined("hashCode()I",
|
||||||
return JvmFunctionSignature.BuiltInFunction("hashCode()I")
|
javaClass<Any>().getDeclaredMethod("hashCode"))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"toString" -> {
|
"toString" -> if (parameters.isEmpty()) {
|
||||||
if (parameters.isEmpty()) {
|
return JvmFunctionSignature.BuiltInFunction.Predefined("toString()Ljava/lang/String;",
|
||||||
return JvmFunctionSignature.BuiltInFunction("toString()Ljava/lang/String;")
|
javaClass<Any>().getDeclaredMethod("toString"))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// TODO: generalize and support other functions from built-ins
|
// TODO: generalize and support other functions from built-ins
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user