From 0ac53da2ed432c492e723d1fa1bedc4aec18d98c Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 29 Jan 2014 17:06:52 +0400 Subject: [PATCH] Assertion remove fix --- .../jet/codegen/asm/MethodInliner.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/asm/MethodInliner.java b/compiler/backend/src/org/jetbrains/jet/codegen/asm/MethodInliner.java index dcdaeeb16d1..b1db37e15be 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/asm/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/asm/MethodInliner.java @@ -371,10 +371,23 @@ public class MethodInliner { MethodInsnNode methodInsnNode = (MethodInsnNode) next; if (methodInsnNode.name.equals("checkParameterIsNotNull") && methodInsnNode.owner.equals("jet/runtime/Intrinsics")) { AbstractInsnNode prev = cur.getPrevious(); - assert prev.getType() == AbstractInsnNode.VAR_INSN && prev.getOpcode() == Opcodes.ALOAD; - int varIndex = ((VarInsnNode) prev).var; - LambdaInfo closure = getLambda(varIndex); - if (closure != null) { + boolean delete = false; + if (prev.getOpcode() == Opcodes.INVOKESTATIC) { + //parameter boxing + AbstractInsnNode prePrevious = cur.getPrevious(); + if (prePrevious.getType() == AbstractInsnNode.VAR_INSN && + prePrevious.getOpcode() < Opcodes.ALOAD && + prePrevious.getOpcode() >= Opcodes.ILOAD) { + delete = true; + node.instructions.remove(prePrevious); + } + } else { + assert prev.getType() == AbstractInsnNode.VAR_INSN && prev.getOpcode() == Opcodes.ALOAD; + int varIndex = ((VarInsnNode) prev).var; + LambdaInfo closure = getLambda(varIndex); + delete = closure != null; + } + if (delete) { node.instructions.remove(prev); node.instructions.remove(cur); cur = next.getNext();