You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2014/02/04 23:48:55 UTC

svn commit: r1564551 - in /incubator/sirona/trunk/agent/javaagent/src: main/java/org/apache/sirona/javaagent/ test/java/org/apache/test/sirona/javaagent/

Author: rmannibucau
Date: Tue Feb  4 22:48:55 2014
New Revision: 1564551

URL: http://svn.apache.org/r1564551
Log:
SIRONA-23 fixing static intrumentation

Modified:
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaClassVisitor.java
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/HttpUrlConnectionAddHeaderTest.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaClassVisitor.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaClassVisitor.java?rev=1564551&r1=1564550&r2=1564551&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaClassVisitor.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaClassVisitor.java Tue Feb  4 22:48:55 2014
@@ -61,7 +61,7 @@ public class SironaClassVisitor extends 
                       final String[] interfaces) {
         cv.visit(version, access, name, signature, superName, interfaces);
         classType = Type.getType("L" + name.replace('.', '/') + ";");
-        SironaStaticInitMerger.class.cast(cv).setClassType(classType);
+        SironaStaticInitMerger.class.cast(cv).initSironaFields(classType);
     }
 
 	@Override
@@ -95,28 +95,6 @@ public class SironaClassVisitor extends 
 		return !name.equals(STATIC_INIT) && !name.equals(CONSTRUCTOR) && !Modifier.isAbstract(access) && !Modifier.isNative(access);
 	}
 
-	private static class AddConstantsFieldVisitor extends GeneratorAdapter {
-		private final Map<String, String> keys;
-		private final Type clazz;
-
-		public AddConstantsFieldVisitor(final MethodVisitor methodVisitor, final Type classType, final Map<String, String> keys) {
-			super(ASM4, methodVisitor, ACC_STATIC, STATIC_INIT, NO_PARAM_RETURN_VOID);
-			this.keys = keys;
-			this.clazz = classType;
-		}
-
-		@Override
-		public void visitCode() {
-            // constants for runtime monitoring
-            for (final Map.Entry<String, String> key : keys.entrySet()) {
-                push(key.getValue());
-                putStatic(clazz, key.getKey(), KEY_TYPE);
-            }
-
-			super.visitCode();
-		}
-	}
-
 	private static class ProxyMethodsVisitor extends GeneratorAdapter {
 		private static final Type THROWABLE_TYPE = Type.getType(Throwable.class);
 		private static final Type[] STOP_WITH_THROWABLE_ARGS_TYPES = new Type[] {THROWABLE_TYPE};
@@ -532,7 +510,6 @@ public class SironaClassVisitor extends 
     // fork from org.objectweb.asm.commons.StaticInitMerger to force our contants to be first
     private static class SironaStaticInitMerger extends ClassVisitor {
         private final Map<String, String> keys;
-        private Type classType;
 
         private String name;
         private MethodVisitor clinit;
@@ -555,50 +532,34 @@ public class SironaClassVisitor extends 
         public MethodVisitor visitMethod(final int access, final String name,
                                          final String desc, final String signature, final String[] exceptions) {
             if (STATIC_INIT.equals(name)) {
-                if (clinit == null) {
-                    generateKeys();
-                }
-
                 final String n = STATIC_CLINT_MERGE_PREFIX + counter++;
-                clinit.visitMethodInsn(Opcodes.INVOKESTATIC, this.name, n, desc);
-                return cv.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC, n, desc, signature, exceptions);
+                final MethodVisitor mv = cv.visitMethod(ACC_PRIVATE + ACC_STATIC, n, desc, signature, exceptions);
+                clinit.visitMethodInsn(INVOKESTATIC, this.name, n, desc);
+                return mv;
             }
             return cv.visitMethod(access, name, desc, signature, exceptions);
         }
 
         @Override
         public void visitEnd() {
-            // if no static block was present for it at the end
-            generateKeys();
+            clinit.visitInsn(Opcodes.RETURN);
+            clinit.visitMaxs(0, 0);
 
-            if (clinit != null) {
-                clinit.visitInsn(Opcodes.RETURN);
-                clinit.visitMaxs(0, 0);
-            }
             cv.visitEnd();
         }
 
-        private void generateKeys() {
+        public void initSironaFields(final Type classType) {
             // generate keys first
-            if (!keys.isEmpty()) {
-                for (final String key : keys.keySet()) {
-                    visitField(CONSTANT_ACCESS, key, KEY_TYPE.getDescriptor(), null, null).visitEnd();
-                }
-
-                clinit = cv.visitMethod(ACC_STATIC, STATIC_INIT, NO_PARAM_RETURN_VOID, null, null);
-
-                final AddConstantsFieldVisitor visitor = new AddConstantsFieldVisitor(clinit, classType, keys);
-                visitor.visitCode();
-                visitor.visitInsn(RETURN);
-                visitor.visitMaxs(0, 0);
-                visitor.visitEnd();
-
-                keys.clear();
+            for (final String key : keys.keySet()) {
+                visitField(CONSTANT_ACCESS, key, KEY_TYPE.getDescriptor(), null, null).visitEnd();
             }
-        }
 
-        public void setClassType(final Type classType) {
-            this.classType = classType;
+            // init them in static block
+            clinit = cv.visitMethod(ACC_PRIVATE + ACC_STATIC, STATIC_INIT, NO_PARAM_RETURN_VOID, null, null);
+            for (final Map.Entry<String, String> key : keys.entrySet()) {
+                clinit.visitLdcInsn(key.getValue());
+                clinit.visitFieldInsn(PUTSTATIC, classType.getInternalName(), key.getKey(), KEY_TYPE.getDescriptor());
+            }
         }
     }
 }

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java?rev=1564551&r1=1564550&r2=1564551&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaTransformer.java Tue Feb  4 22:48:55 2014
@@ -37,11 +37,11 @@ public class SironaTransformer implement
 
     private byte[] doTransform(final String className, final byte[] classfileBuffer) {
         try {
-            final ClassReader reader = new ClassReader(classfileBuffer);
-            final ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);
             final SironaClassVisitor.SironaKeyVisitor keyVisitor = new SironaClassVisitor.SironaKeyVisitor(className);
             new ClassReader(classfileBuffer).accept(keyVisitor, ClassReader.SKIP_DEBUG);
             if (keyVisitor.hasAdviced()) {
+                final ClassReader reader = new ClassReader(classfileBuffer);
+                final ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);
                 final SironaClassVisitor advisor = new SironaClassVisitor(writer, className, keyVisitor.getKeys());
                 reader.accept(advisor, ClassReader.SKIP_DEBUG);
                 return writer.toByteArray();

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/HttpUrlConnectionAddHeaderTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/HttpUrlConnectionAddHeaderTest.java?rev=1564551&r1=1564550&r2=1564551&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/HttpUrlConnectionAddHeaderTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/HttpUrlConnectionAddHeaderTest.java Tue Feb  4 22:48:55 2014
@@ -22,7 +22,6 @@ import org.apache.sirona.javaagent.JavaA
 import org.apache.sirona.javaagent.spi.InvocationListener;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -59,7 +58,7 @@ public class HttpUrlConnectionAddHeaderT
         server.stop(0);
     }
 
-    @Test  @Ignore("static to fix")
+    @Test
     public void addHeader() throws IOException {
         final URL url = new URL("http://localhost:" + server.getAddress().getPort());
         final URLConnection connection = url.openConnection();

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java?rev=1564551&r1=1564550&r2=1564551&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/SimpleTest.java Tue Feb  4 22:48:55 2014
@@ -22,7 +22,6 @@ import org.apache.sirona.javaagent.Agent
 import org.apache.sirona.javaagent.JavaAgentRunner;
 import org.apache.sirona.javaagent.listener.CounterListener;
 import org.apache.sirona.repositories.Repository;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -32,19 +31,19 @@ import static org.junit.Assert.fail;
 
 @RunWith(JavaAgentRunner.class)
 public class SimpleTest {
-    @Test @Ignore("static to fix")
+    @Test
     public void ensureStaticBlocksAreKept() throws Exception {
         assertTrue(ServiceTransform.staticInit);
     }
 
-    @Test @Ignore("static to fix")
+    @Test
     public void staticMonitoring() {
         assertHits("org.apache.test.sirona.javaagent.SimpleTest$StaticTransform.monitorMe", 0);
         assertEquals(1, StaticTransform.init);
         assertHits("org.apache.test.sirona.javaagent.SimpleTest$StaticTransform.monitorMe", 1);
     }
 
-    @Test @Ignore("static to fix")
+    @Test
     public void staticMethod() {
         assertHits("org.apache.test.sirona.javaagent.SimpleTest$ServiceTransform.staticMethod", 0);
         ServiceTransform.staticMethod();