public void visitInsn(int opcode) {
   if (opcode == I2L) {
     if (load) {
       super.visitInsn(I2L);
     } else {
       load = true;
     }
   } else {
     if (opcode == L2I) {
       if (load) {
         load = false;
       } else {
         super.visitInsn(L2I);
       }
     } else {
       dropLoad();
       super.visitInsn(opcode);
     }
   }
 }
 public void visitIincInsn(int var, int increment) {
   dropLoad();
   super.visitIincInsn(var, increment);
 }
 public void visitLdcInsn(Object cst) {
   dropLoad();
   super.visitLdcInsn(cst);
 }
 public void visitLabel(Label label) {
   dropLoad();
   super.visitLabel(label);
 }
 public void visitJumpInsn(int opcode, Label label) {
   dropLoad();
   super.visitJumpInsn(opcode, label);
 }
 public void visitMethodInsn(int opcode, String owner, String name, String desc) {
   dropLoad();
   super.visitMethodInsn(opcode, owner, name, desc);
 }
 public void visitTypeInsn(int opcode, String desc) {
   dropLoad();
   super.visitTypeInsn(opcode, desc);
 }
 public void visitVarInsn(int opcode, int var) {
   dropLoad();
   super.visitVarInsn(opcode, var);
 }
 public void visitIntInsn(int opcode, int operand) {
   dropLoad();
   super.visitIntInsn(opcode, operand);
 }
 private void dropLoad() {
   if (load) {
     super.visitInsn(I2L);
     load = false;
   }
 }
 public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
   dropLoad();
   super.visitTryCatchBlock(start, end, handler, type);
 }
 public void visitMultiANewArrayInsn(String desc, int dims) {
   dropLoad();
   super.visitMultiANewArrayInsn(desc, dims);
 }
 public void visitLookupSwitchInsn(Label dflt, int keys[], Label labels[]) {
   dropLoad();
   super.visitLookupSwitchInsn(dflt, keys, labels);
 }
 public void visitTableSwitchInsn(int min, int max, Label dflt, Label labels[]) {
   dropLoad();
   super.visitTableSwitchInsn(min, max, dflt, labels);
 }