59
60 package jdk.internal.org.objectweb.asm.commons;
61
62 import jdk.internal.org.objectweb.asm.AnnotationVisitor;
63 import jdk.internal.org.objectweb.asm.Handle;
64 import jdk.internal.org.objectweb.asm.Label;
65 import jdk.internal.org.objectweb.asm.MethodVisitor;
66 import jdk.internal.org.objectweb.asm.Opcodes;
67 import jdk.internal.org.objectweb.asm.TypePath;
68
69 /**
70 * A {@link LocalVariablesSorter} for type mapping.
71 *
72 * @author Eugene Kuleshov
73 */
74 public class MethodRemapper extends MethodVisitor {
75
76 protected final Remapper remapper;
77
78 public MethodRemapper(final MethodVisitor mv, final Remapper remapper) {
79 this(Opcodes.ASM5, mv, remapper);
80 }
81
82 protected MethodRemapper(final int api, final MethodVisitor mv,
83 final Remapper remapper) {
84 super(api, mv);
85 this.remapper = remapper;
86 }
87
88 @Override
89 public AnnotationVisitor visitAnnotationDefault() {
90 AnnotationVisitor av = super.visitAnnotationDefault();
91 return av == null ? av : new AnnotationRemapper(av, remapper);
92 }
93
94 @Override
95 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
96 AnnotationVisitor av = super.visitAnnotation(remapper.mapDesc(desc),
97 visible);
98 return av == null ? av : new AnnotationRemapper(av, remapper);
99 }
105 remapper.mapDesc(desc), visible);
106 return av == null ? av : new AnnotationRemapper(av, remapper);
107 }
108
109 @Override
110 public AnnotationVisitor visitParameterAnnotation(int parameter,
111 String desc, boolean visible) {
112 AnnotationVisitor av = super.visitParameterAnnotation(parameter,
113 remapper.mapDesc(desc), visible);
114 return av == null ? av : new AnnotationRemapper(av, remapper);
115 }
116
117 @Override
118 public void visitFrame(int type, int nLocal, Object[] local, int nStack,
119 Object[] stack) {
120 super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack,
121 remapEntries(nStack, stack));
122 }
123
124 private Object[] remapEntries(int n, Object[] entries) {
125 for (int i = 0; i < n; i++) {
126 if (entries[i] instanceof String) {
127 Object[] newEntries = new Object[n];
128 if (i > 0) {
129 System.arraycopy(entries, 0, newEntries, 0, i);
130 }
131 do {
132 Object t = entries[i];
133 newEntries[i++] = t instanceof String ? remapper
134 .mapType((String) t) : t;
135 } while (i < n);
136 return newEntries;
137 }
138 }
139 return entries;
140 }
141
142 @Override
143 public void visitFieldInsn(int opcode, String owner, String name,
144 String desc) {
145 super.visitFieldInsn(opcode, remapper.mapType(owner),
146 remapper.mapFieldName(owner, name, desc),
147 remapper.mapDesc(desc));
148 }
149
150 @Deprecated
151 @Override
152 public void visitMethodInsn(final int opcode, final String owner,
153 final String name, final String desc) {
154 if (api >= Opcodes.ASM5) {
155 super.visitMethodInsn(opcode, owner, name, desc);
156 return;
157 }
158 doVisitMethodInsn(opcode, owner, name, desc,
|
59
60 package jdk.internal.org.objectweb.asm.commons;
61
62 import jdk.internal.org.objectweb.asm.AnnotationVisitor;
63 import jdk.internal.org.objectweb.asm.Handle;
64 import jdk.internal.org.objectweb.asm.Label;
65 import jdk.internal.org.objectweb.asm.MethodVisitor;
66 import jdk.internal.org.objectweb.asm.Opcodes;
67 import jdk.internal.org.objectweb.asm.TypePath;
68
69 /**
70 * A {@link LocalVariablesSorter} for type mapping.
71 *
72 * @author Eugene Kuleshov
73 */
74 public class MethodRemapper extends MethodVisitor {
75
76 protected final Remapper remapper;
77
78 public MethodRemapper(final MethodVisitor mv, final Remapper remapper) {
79 this(Opcodes.ASM6, mv, remapper);
80 }
81
82 protected MethodRemapper(final int api, final MethodVisitor mv,
83 final Remapper remapper) {
84 super(api, mv);
85 this.remapper = remapper;
86 }
87
88 @Override
89 public AnnotationVisitor visitAnnotationDefault() {
90 AnnotationVisitor av = super.visitAnnotationDefault();
91 return av == null ? av : new AnnotationRemapper(av, remapper);
92 }
93
94 @Override
95 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
96 AnnotationVisitor av = super.visitAnnotation(remapper.mapDesc(desc),
97 visible);
98 return av == null ? av : new AnnotationRemapper(av, remapper);
99 }
105 remapper.mapDesc(desc), visible);
106 return av == null ? av : new AnnotationRemapper(av, remapper);
107 }
108
109 @Override
110 public AnnotationVisitor visitParameterAnnotation(int parameter,
111 String desc, boolean visible) {
112 AnnotationVisitor av = super.visitParameterAnnotation(parameter,
113 remapper.mapDesc(desc), visible);
114 return av == null ? av : new AnnotationRemapper(av, remapper);
115 }
116
117 @Override
118 public void visitFrame(int type, int nLocal, Object[] local, int nStack,
119 Object[] stack) {
120 super.visitFrame(type, nLocal, remapEntries(nLocal, local), nStack,
121 remapEntries(nStack, stack));
122 }
123
124 private Object[] remapEntries(int n, Object[] entries) {
125 if (entries != null) {
126 for (int i = 0; i < n; i++) {
127 if (entries[i] instanceof String) {
128 Object[] newEntries = new Object[n];
129 if (i > 0) {
130 System.arraycopy(entries, 0, newEntries, 0, i);
131 }
132 do {
133 Object t = entries[i];
134 newEntries[i++] = t instanceof String ? remapper
135 .mapType((String) t) : t;
136 } while (i < n);
137 return newEntries;
138 }
139 }
140 }
141 return entries;
142 }
143
144 @Override
145 public void visitFieldInsn(int opcode, String owner, String name,
146 String desc) {
147 super.visitFieldInsn(opcode, remapper.mapType(owner),
148 remapper.mapFieldName(owner, name, desc),
149 remapper.mapDesc(desc));
150 }
151
152 @Deprecated
153 @Override
154 public void visitMethodInsn(final int opcode, final String owner,
155 final String name, final String desc) {
156 if (api >= Opcodes.ASM5) {
157 super.visitMethodInsn(opcode, owner, name, desc);
158 return;
159 }
160 doVisitMethodInsn(opcode, owner, name, desc,
|