~0 field fix

This commit is contained in:
Mikhael Bogdanov
2014-01-10 11:29:00 +04:00
parent 7995ffb798
commit 829a58f225
2 changed files with 30 additions and 0 deletions
@@ -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;
}
}
@@ -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);
}
}
}