From 768c565d3f2790398ed968eb5bf26abc6813e3c0 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 12 Mar 2014 19:11:04 +0400 Subject: [PATCH] Fix for rubish labels inside captured field access chains --- .../org/jetbrains/jet/codegen/inline/FieldRemapper.java | 9 ++++++--- .../org/jetbrains/jet/codegen/inline/MethodInliner.java | 6 +++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java index 66bfb4e1721..c3fa207f2fa 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java @@ -83,10 +83,13 @@ public class FieldRemapper { insnNode.name = "$$$" + insnNode.name; insnNode.setOpcode(Opcodes.GETSTATIC); - for (int i = 0; i < currentInstruction; i++) { - AbstractInsnNode toRemove = capturedFieldAccess.get(i); - node.instructions.remove(toRemove); + AbstractInsnNode next = capturedFieldAccess.get(0); + while (next != insnNode) { + AbstractInsnNode toDelete = next; + next = next.getNext(); + node.instructions.remove(toDelete); } + transformed = capturedFieldAccess.get(capturedFieldAccess.size() - 1); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java index bf93e1771a4..67a1ac5256e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java @@ -429,7 +429,11 @@ public class MethodInliner { List fieldAccessChain = new ArrayList(); fieldAccessChain.add(aload0); AbstractInsnNode next = aload0.getNext(); - while (next != null && next instanceof FieldInsnNode) { + while (next != null && next instanceof FieldInsnNode || next instanceof LabelNode) { + if (next instanceof LabelNode) { + next = next.getNext(); + continue; //it will be delete on transformation + } fieldAccessChain.add(next); if ("this$0".equals(((FieldInsnNode) next).name)) { next = next.getNext();