From 829a58f22525de11296d5bc4c19e225a8a95a0cf Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Fri, 10 Jan 2014 11:29:00 +0400 Subject: [PATCH] ~0 field fix --- .../jet/codegen/asm/InlineFieldRemapper.java | 21 +++++++++++++++++++ .../jet/codegen/asm/RemapVisitor.java | 9 ++++++++ 2 files changed, 30 insertions(+) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineFieldRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineFieldRemapper.java index 46cbc97c9d4..a5b8a4cadbb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineFieldRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/asm/InlineFieldRemapper.java @@ -16,9 +16,14 @@ package org.jetbrains.jet.codegen.asm; +import org.jetbrains.asm4.Opcodes; +import org.jetbrains.asm4.Type; import org.jetbrains.asm4.tree.AbstractInsnNode; import org.jetbrains.asm4.tree.FieldInsnNode; import org.jetbrains.asm4.tree.MethodNode; +import org.jetbrains.asm4.tree.VarInsnNode; + +import static org.jetbrains.jet.codegen.asm.MethodInliner.getPreviousNoLabelNoLine; public class InlineFieldRemapper extends LambdaFieldRemapper { @@ -35,8 +40,24 @@ public class InlineFieldRemapper extends LambdaFieldRemapper { public AbstractInsnNode doTransform( MethodNode node, FieldInsnNode fieldInsnNode, CapturedParamInfo capturedField ) { + AbstractInsnNode prev = getPreviousNoLabelNoLine(fieldInsnNode); + + assert prev.getType() == AbstractInsnNode.VAR_INSN; + VarInsnNode loadThis = (VarInsnNode) prev; + assert /*loadThis.var == info.getCapturedVarsSize() - 1 && */loadThis.getOpcode() == Opcodes.ALOAD; + + int opcode = Opcodes.GETSTATIC; + + String descriptor = Type.getObjectType(newOwnerType).getDescriptor(); + + FieldInsnNode thisStub = new FieldInsnNode(opcode, newOwnerType, "$$$this", descriptor); + + node.instructions.insertBefore(loadThis, thisStub); + node.instructions.remove(loadThis); + fieldInsnNode.owner = newOwnerType; fieldInsnNode.name = LambdaTransformer.getNewFieldName(fieldInsnNode.name); + return fieldInsnNode; } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/asm/RemapVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/asm/RemapVisitor.java index fac9dcf53f1..53215e19f1d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/asm/RemapVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/asm/RemapVisitor.java @@ -84,4 +84,13 @@ public class RemapVisitor extends InstructionAdapter { public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { return null; } + + @Override + public void visitFieldInsn(int opcode, String owner, String name, String desc) { + if (name.equals("$$$this")) { + super.visitVarInsn(Opcodes.ALOAD, 0); + } else { + super.visitFieldInsn(opcode, owner, name, desc); + } + } }