2020import org .objectweb .asm .ClassReader ;
2121import org .objectweb .asm .ClassVisitor ;
2222import org .objectweb .asm .ClassWriter ;
23- import org .objectweb .asm .Label ;
2423import org .objectweb .asm .MethodVisitor ;
2524import org .objectweb .asm .Opcodes ;
2625import org .objectweb .asm .Type ;
@@ -125,20 +124,6 @@ private void init() {
125124 private void instrumentInetAddress () {
126125 InetAddressClassFileTransformer transformer = new InetAddressClassFileTransformer ();
127126 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- }
142127 }
143128
144129 @ SuppressWarnings ("SystemOut" )
@@ -209,56 +194,6 @@ public void visitCode() {
209194
210195 private static class InetAddressClassFileTransformer implements ClassFileTransformer {
211196 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- }
262197
263198 @ Override
264199 public byte [] transform (
@@ -270,17 +205,15 @@ public byte[] transform(
270205 if (!"java/net/InetAddress" .equals (className )) {
271206 return null ;
272207 }
273- transformed = true ;
274208 ClassReader cr = new ClassReader (classfileBuffer );
275- ClassWriter cw = new ClassWriter (cr , ClassWriter . COMPUTE_MAXS | ClassWriter . COMPUTE_FRAMES );
209+ ClassWriter cw = new ClassWriter (cr , 0 );
276210 ClassVisitor cv =
277211 new ClassVisitor (AsmApi .VERSION , cw ) {
278212 @ Override
279213 public MethodVisitor visitMethod (
280214 int access , String name , String descriptor , String signature , String [] exceptions ) {
281215 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 )) {
284217 return mv ;
285218 }
286219 return new MethodVisitor (api , mv ) {
@@ -291,23 +224,17 @@ public void visitMethodInsn(
291224 String methodName ,
292225 String descriptor ,
293226 boolean isInterface ) {
227+ super .visitMethodInsn (
228+ opcode , ownerClassName , methodName , descriptor , isInterface );
294229 if ("jdk/internal/misc/VM" .equals (ownerClassName )
295230 && "isBooted" .equals (methodName )) {
296- // Create wrapper method only once
297- if (!wrapperMethodCreated ) {
298- createWrapperMethod (cw );
299- wrapperMethodCreated = true ;
300- }
301231 super .visitMethodInsn (
302232 Opcodes .INVOKESTATIC ,
303- "java/net/InetAddress" ,
304- "isAgentAndVmBooted " ,
305- "()Z" ,
306- isInterface );
233+ Type . getInternalName ( AgentInitializer . class ) ,
234+ "isAgentStarted " ,
235+ "(Z )Z" ,
236+ false );
307237 hookInserted = true ;
308- } else {
309- super .visitMethodInsn (
310- opcode , ownerClassName , methodName , descriptor , isInterface );
311238 }
312239 }
313240 };
0 commit comments