Take into account irrelevant implementation of special builtins

This commit is contained in:
Denis Zharkov
2015-10-20 17:11:55 +03:00
parent d674aa1427
commit 8db206e7ff
8 changed files with 277 additions and 4 deletions
@@ -61,7 +61,8 @@ object BuiltinSpecialBridgesUtil {
// e.g. `size()I`
val overriddenBuiltinSignature = signatureByDescriptor(overriddenBuiltin)
val needGenerateSpecialBridge = needGenerateSpecialBridge(function, reachableDeclarations, overriddenBuiltin)
val needGenerateSpecialBridge = needGenerateSpecialBridge(
function, reachableDeclarations, overriddenBuiltin, signatureByDescriptor, overriddenBuiltinSignature)
&& methodItself != overriddenBuiltinSignature
val specialBridge = if (needGenerateSpecialBridge)
@@ -107,15 +108,21 @@ private fun findSuperImplementationForStubDelegation(function: FunctionDescripto
private fun findAllReachableDeclarations(functionDescriptor: FunctionDescriptor): MutableSet<FunctionDescriptor> =
findAllReachableDeclarations(DescriptorBasedFunctionHandle(functionDescriptor)).map { it.descriptor }.toMutableSet()
private fun needGenerateSpecialBridge(
private fun <Signature> needGenerateSpecialBridge(
functionDescriptor: FunctionDescriptor,
reachableDeclarations: Collection<FunctionDescriptor>,
specialCallableDescriptor: CallableMemberDescriptor
specialCallableDescriptor: CallableMemberDescriptor,
signatureByDescriptor: (FunctionDescriptor) -> Signature,
overriddenBuiltinSignature: Signature
): Boolean {
val classDescriptor = functionDescriptor.containingDeclaration as ClassDescriptor
return !classDescriptor.hasRealKotlinSuperClassWithOverrideOf(specialCallableDescriptor)
&& specialCallableDescriptor.modality != Modality.FINAL
&& reachableDeclarations.none { it.containingDeclaration is JavaClassDescriptor && it.modality == Modality.FINAL }
&& reachableDeclarations.none {
it.containingDeclaration is JavaClassDescriptor
&& it.modality == Modality.FINAL
&& signatureByDescriptor(it) == overriddenBuiltinSignature
}
}
public fun isValueArgumentForCallToMethodWithTypeCheckBarrier(