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:
Alexander Udalov
2015-07-23 16:29:02 +03:00
parent 681c45ef61
commit be77a2feee
2 changed files with 18 additions and 14 deletions
@@ -60,7 +60,7 @@ open class KFunctionImpl protected constructor(
Visibilities.isPrivate(descriptor.visibility))
is JavaMethod -> jvmSignature.method
is JavaConstructor -> jvmSignature.constructor
is BuiltInFunction -> throw KotlinReflectionInternalError("Built-in functions are not fully supported yet: $descriptor")
is BuiltInFunction -> jvmSignature.getMember(container)
}
when (member) {
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import java.lang.reflect.Constructor
import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
import kotlin.reflect.KotlinReflectionInternalError
@@ -67,8 +68,14 @@ sealed class JvmFunctionSignature {
"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
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
when (function.name.asString()) {
"equals" -> {
if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) {
return JvmFunctionSignature.BuiltInFunction("equals(Ljava/lang/Object;)Z")
}
"equals" -> if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) {
return JvmFunctionSignature.BuiltInFunction.Predefined("equals(Ljava/lang/Object;)Z",
javaClass<Any>().getDeclaredMethod("equals", javaClass<Any>()))
}
"hashCode" -> {
if (parameters.isEmpty()) {
return JvmFunctionSignature.BuiltInFunction("hashCode()I")
}
"hashCode" -> if (parameters.isEmpty()) {
return JvmFunctionSignature.BuiltInFunction.Predefined("hashCode()I",
javaClass<Any>().getDeclaredMethod("hashCode"))
}
"toString" -> {
if (parameters.isEmpty()) {
return JvmFunctionSignature.BuiltInFunction("toString()Ljava/lang/String;")
}
"toString" -> if (parameters.isEmpty()) {
return JvmFunctionSignature.BuiltInFunction.Predefined("toString()Ljava/lang/String;",
javaClass<Any>().getDeclaredMethod("toString"))
}
// TODO: generalize and support other functions from built-ins
}