From d0385e4e7c86e98e0ff30d7c42c627c515bffd11 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 9 Aug 2019 10:47:20 +0200 Subject: [PATCH] Recognize Intrinsics.checkNotNullParameter call on lambdas in inline functions We're going to start using this method since 1.4 for parameter null checks, and without this change the compiler would fail if it encountered a call to such method on a lambda parameter inside an inline function, since that call is not inlinable. #KT-22275 In Progress --- .../jetbrains/kotlin/codegen/inline/MethodInliner.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt index 7c29493bf95..d1afc6b34ce 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt @@ -1071,15 +1071,17 @@ class MethodInliner( //remove next template: // aload x // LDC paramName - // INTRINSICS_CLASS_NAME.checkParameterIsNotNull(...) + // INTRINSICS_CLASS_NAME.checkParameterIsNotNull/checkNotNullParameter(...) private fun removeClosureAssertions(node: MethodNode) { val toDelete = arrayListOf() InsnSequence(node.instructions).filterIsInstance().forEach { methodInsnNode -> - if (methodInsnNode.name == "checkParameterIsNotNull" && methodInsnNode.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME) { + if (methodInsnNode.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME && + (methodInsnNode.name == "checkParameterIsNotNull" || methodInsnNode.name == "checkNotNullParameter") + ) { val prev = methodInsnNode.previous - assert(Opcodes.LDC == prev?.opcode) { "'checkParameterIsNotNull' should go after LDC but $prev" } + assert(Opcodes.LDC == prev?.opcode) { "'${methodInsnNode.name}' should go after LDC but $prev" } val prevPev = methodInsnNode.previous.previous - assert(Opcodes.ALOAD == prevPev?.opcode) { "'checkParameterIsNotNull' should be invoked on local var, but $prev" } + assert(Opcodes.ALOAD == prevPev?.opcode) { "'${methodInsnNode.name}' should be invoked on local var, but $prev" } toDelete.add(prevPev) toDelete.add(prev)