~0 field fix
This commit is contained in:
@@ -16,9 +16,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.codegen.asm;
|
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.AbstractInsnNode;
|
||||||
import org.jetbrains.asm4.tree.FieldInsnNode;
|
import org.jetbrains.asm4.tree.FieldInsnNode;
|
||||||
import org.jetbrains.asm4.tree.MethodNode;
|
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 {
|
public class InlineFieldRemapper extends LambdaFieldRemapper {
|
||||||
|
|
||||||
@@ -35,8 +40,24 @@ public class InlineFieldRemapper extends LambdaFieldRemapper {
|
|||||||
public AbstractInsnNode doTransform(
|
public AbstractInsnNode doTransform(
|
||||||
MethodNode node, FieldInsnNode fieldInsnNode, CapturedParamInfo capturedField
|
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.owner = newOwnerType;
|
||||||
fieldInsnNode.name = LambdaTransformer.getNewFieldName(fieldInsnNode.name);
|
fieldInsnNode.name = LambdaTransformer.getNewFieldName(fieldInsnNode.name);
|
||||||
|
|
||||||
return fieldInsnNode;
|
return fieldInsnNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,4 +84,13 @@ public class RemapVisitor extends InstructionAdapter {
|
|||||||
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
|
public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
|
||||||
return null;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user