20
20
import org .objectweb .asm .ClassReader ;
21
21
import org .objectweb .asm .ClassVisitor ;
22
22
import org .objectweb .asm .ClassWriter ;
23
- import org .objectweb .asm .Label ;
24
23
import org .objectweb .asm .MethodVisitor ;
25
24
import org .objectweb .asm .Opcodes ;
26
25
import org .objectweb .asm .Type ;
@@ -125,20 +124,6 @@ private void init() {
125
124
private void instrumentInetAddress () {
126
125
InetAddressClassFileTransformer transformer = new InetAddressClassFileTransformer ();
127
126
instrumentation .addTransformer (transformer , true );
128
-
129
- try {
130
- Class <?> clazz = Class .forName ("java.net.InetAddress" , false , null );
131
- if (transformer .transformed ) {
132
- // InetAddress was loaded and got transformed
133
- return ;
134
- }
135
- // InetAddress was already loaded before we set up transformer
136
- instrumentation .retransformClasses (clazz );
137
- } catch (ClassNotFoundException | UnmodifiableClassException ignore ) {
138
- // ignore
139
- } finally {
140
- instrumentation .removeTransformer (transformer );
141
- }
142
127
}
143
128
144
129
@ SuppressWarnings ("SystemOut" )
@@ -209,56 +194,6 @@ public void visitCode() {
209
194
210
195
private static class InetAddressClassFileTransformer implements ClassFileTransformer {
211
196
boolean hookInserted = false ;
212
- boolean transformed = false ;
213
- boolean wrapperMethodCreated = false ;
214
-
215
- private static void createWrapperMethod (ClassWriter cw ) {
216
- /*
217
- private static boolean isAgentAndVmBooted();
218
- Code:
219
- 0: invokestatic #X // Method io/opentelemetry/javaagent/bootstrap/AgentInitializer/isAgentStarted:()Z
220
- 3: ifeq 16
221
- 6: invokestatic #Y // Method jdk/internal/misc/VM.isBooted:()Z
222
- 9: ifeq 16
223
- 12: iconst_1
224
- 13: goto 17
225
- 16: iconst_0
226
- 17: ireturn
227
- */
228
-
229
- String descriptor = Type .getMethodDescriptor (Type .BOOLEAN_TYPE );
230
- Label elseLabel = new Label ();
231
- Label endLabel = new Label ();
232
-
233
- MethodVisitor mv =
234
- cw .visitMethod (
235
- Opcodes .ACC_PRIVATE | Opcodes .ACC_STATIC ,
236
- "isAgentAndVmBooted" ,
237
- descriptor ,
238
- null ,
239
- null );
240
- mv .visitCode ();
241
-
242
- mv .visitMethodInsn (
243
- Opcodes .INVOKESTATIC ,
244
- Type .getInternalName (AgentInitializer .class ),
245
- "isAgentStarted" ,
246
- descriptor ,
247
- false );
248
- mv .visitJumpInsn (Opcodes .IFEQ , elseLabel );
249
- mv .visitMethodInsn (
250
- Opcodes .INVOKESTATIC , "jdk/internal/misc/VM" , "isBooted" , descriptor , false );
251
- mv .visitJumpInsn (Opcodes .IFEQ , elseLabel );
252
- mv .visitInsn (Opcodes .ICONST_1 );
253
- mv .visitJumpInsn (Opcodes .GOTO , endLabel );
254
- mv .visitLabel (elseLabel );
255
- mv .visitInsn (Opcodes .ICONST_0 );
256
- mv .visitLabel (endLabel );
257
- mv .visitInsn (Opcodes .IRETURN );
258
-
259
- mv .visitMaxs (0 , 0 );
260
- mv .visitEnd ();
261
- }
262
197
263
198
@ Override
264
199
public byte [] transform (
@@ -270,17 +205,15 @@ public byte[] transform(
270
205
if (!"java/net/InetAddress" .equals (className )) {
271
206
return null ;
272
207
}
273
- transformed = true ;
274
208
ClassReader cr = new ClassReader (classfileBuffer );
275
- ClassWriter cw = new ClassWriter (cr , ClassWriter . COMPUTE_MAXS | ClassWriter . COMPUTE_FRAMES );
209
+ ClassWriter cw = new ClassWriter (cr , 0 );
276
210
ClassVisitor cv =
277
211
new ClassVisitor (AsmApi .VERSION , cw ) {
278
212
@ Override
279
213
public MethodVisitor visitMethod (
280
214
int access , String name , String descriptor , String signature , String [] exceptions ) {
281
215
MethodVisitor mv = super .visitMethod (access , name , descriptor , signature , exceptions );
282
- // We don't want to patch "jdk.internal.misc.VM.isBooted" call in our wrapper
283
- if ("isAgentAndVmBooted" .equals (name )) {
216
+ if (!"resolver" .equals (name )) {
284
217
return mv ;
285
218
}
286
219
return new MethodVisitor (api , mv ) {
@@ -291,23 +224,17 @@ public void visitMethodInsn(
291
224
String methodName ,
292
225
String descriptor ,
293
226
boolean isInterface ) {
227
+ super .visitMethodInsn (
228
+ opcode , ownerClassName , methodName , descriptor , isInterface );
294
229
if ("jdk/internal/misc/VM" .equals (ownerClassName )
295
230
&& "isBooted" .equals (methodName )) {
296
- // Create wrapper method only once
297
- if (!wrapperMethodCreated ) {
298
- createWrapperMethod (cw );
299
- wrapperMethodCreated = true ;
300
- }
301
231
super .visitMethodInsn (
302
232
Opcodes .INVOKESTATIC ,
303
- "java/net/InetAddress" ,
304
- "isAgentAndVmBooted " ,
305
- "()Z" ,
306
- isInterface );
233
+ Type . getInternalName ( AgentInitializer . class ) ,
234
+ "isAgentStarted " ,
235
+ "(Z )Z" ,
236
+ false );
307
237
hookInserted = true ;
308
- } else {
309
- super .visitMethodInsn (
310
- opcode , ownerClassName , methodName , descriptor , isInterface );
311
238
}
312
239
}
313
240
};
0 commit comments