From 87b637435155b0c366ae0a788f2c6fa7bdbbec0d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 28 Dec 2015 08:39:46 +0300 Subject: [PATCH] Get rid of redundant intrinsic Also drop 'safe' parameter from TypeIntrinsics.checkcast, because it's supposed to work as JVM checkcast (i.e. accepting nulls) --- .idea/dictionaries/dzharkov.xml | 1 + .../codegen/intrinsics/TypeIntrinsics.kt | 41 +++++++++---------- .../kotlin/jvm/internal/TypeIntrinsics.java | 8 ---- 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/.idea/dictionaries/dzharkov.xml b/.idea/dictionaries/dzharkov.xml index fb88a11d30d..2e8cb56c4fb 100644 --- a/.idea/dictionaries/dzharkov.xml +++ b/.idea/dictionaries/dzharkov.xml @@ -1,6 +1,7 @@ + checkcast insn diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/TypeIntrinsics.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/TypeIntrinsics.kt index 4f594435d14..97c78e211ce 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/TypeIntrinsics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/TypeIntrinsics.kt @@ -78,26 +78,28 @@ public object TypeIntrinsics { instanceofInsn.desc = asmType.internalName } - public @JvmStatic fun checkcast(v: InstructionAdapter, jetType: KotlinType, asmType: Type, safe: Boolean) { + @JvmStatic + public fun checkcast( + v: InstructionAdapter, + kotlinType: KotlinType, asmType: Type, + // This parameter is just for sake of optimization: + // when we generate 'as?' we do necessary intrinsic checks + // when calling TypeIntrinsics.instanceOf, so here we can just make checkcast + safe: Boolean) { if (safe) { v.checkcast(asmType) return } - val functionTypeArity = getFunctionTypeArity(jetType) + val functionTypeArity = getFunctionTypeArity(kotlinType) if (functionTypeArity >= 0) { v.iconst(functionTypeArity) - if (safe) { - v.typeIntrinsic(BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) - } - else { - v.typeIntrinsic(BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) - } + v.typeIntrinsic(BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) v.checkcast(asmType) return } - val asMutableCollectionMethodName = getAsMutableCollectionMethodName(jetType) + val asMutableCollectionMethodName = getAsMutableCollectionMethodName(kotlinType) if (asMutableCollectionMethodName != null) { v.typeIntrinsic(asMutableCollectionMethodName, getAsMutableCollectionDescriptor(asmType)) return @@ -106,20 +108,22 @@ public object TypeIntrinsics { v.checkcast(asmType) } - public @JvmStatic fun checkcast(checkcastInsn: TypeInsnNode, instructions: InsnList, jetType: KotlinType, asmType: Type, safe: Boolean) { + @JvmStatic + public fun checkcast( + checkcastInsn: TypeInsnNode, + instructions: InsnList, + kotlinType: KotlinType, asmType: Type, + safe: Boolean) { if (safe) { checkcastInsn.desc = asmType.internalName return } - val functionTypeArity = getFunctionTypeArity(jetType) + val functionTypeArity = getFunctionTypeArity(kotlinType) if (functionTypeArity >= 0) { instructions.insertBefore(checkcastInsn, iconstNode(functionTypeArity)) - val beforeCheckcast = if (safe) - typeIntrinsicNode(BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) - else - typeIntrinsicNode(BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) + val beforeCheckcast = typeIntrinsicNode(BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY, BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR) instructions.insertBefore(checkcastInsn, beforeCheckcast) instructions.insertBefore(checkcastInsn, TypeInsnNode(Opcodes.CHECKCAST, asmType.internalName)) @@ -127,7 +131,7 @@ public object TypeIntrinsics { return } - val asMutableCollectionMethodName = getAsMutableCollectionMethodName(jetType) + val asMutableCollectionMethodName = getAsMutableCollectionMethodName(kotlinType) if (asMutableCollectionMethodName != null) { instructions.insertBefore(checkcastInsn, typeIntrinsicNode(asMutableCollectionMethodName, getAsMutableCollectionDescriptor(asmType))) @@ -211,9 +215,4 @@ public object TypeIntrinsics { private val BEFORE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE, Type.INT_TYPE) - - private val BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY = "beforeSafeCheckcastToFunctionOfArity" - - private val BEFORE_SAFE_CHECKCAST_TO_FUNCTION_OF_ARITY_DESCRIPTOR = - Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE, Type.INT_TYPE) } \ No newline at end of file diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/TypeIntrinsics.java b/core/runtime.jvm/src/kotlin/jvm/internal/TypeIntrinsics.java index 310fff796ec..8b80c48b7e1 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/TypeIntrinsics.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/TypeIntrinsics.java @@ -361,12 +361,4 @@ public class TypeIntrinsics { } return obj; } - - public static Object beforeSafeCheckcastToFunctionOfArity(Object obj, int arity) { - // TODO should we instead inline bytecode for this in TypeIntrinsics.kt? - if (obj == null || !isFunctionOfArity(obj, arity)) { - return null; - } - return obj; - } }