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
This commit is contained in:
@@ -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<AbstractInsnNode>()
|
||||
InsnSequence(node.instructions).filterIsInstance<MethodInsnNode>().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)
|
||||
|
||||
Reference in New Issue
Block a user