You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by ol...@apache.org on 2015/02/05 04:35:37 UTC

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

Author: olamy
Date: Thu Feb  5 03:35:36 2015
New Revision: 1657462

URL: http://svn.apache.org/r1657462
Log:
implement passing array with method args to the Agent contxxt

Modified:
    incubator/sirona/trunk/agent/javaagent/pom.xml
    incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
    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/AgentPerfInterceptorAgentContractTest.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/App.java
    incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/PathTrackingListenerTest.java

Modified: incubator/sirona/trunk/agent/javaagent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/pom.xml?rev=1657462&r1=1657461&r2=1657462&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/pom.xml (original)
+++ incubator/sirona/trunk/agent/javaagent/pom.xml Thu Feb  5 03:35:36 2015
@@ -188,6 +188,7 @@
             <test.debug.remote>${test.debug.remote}</test.debug.remote>
             <project.build.directory>${project.build.directory}</project.build.directory>
             <sirona.agent.debug>${sirona.agent.debug}</sirona.agent.debug>
+            <java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
           </systemPropertyVariables>
         </configuration>
       </plugin>

Modified: incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java?rev=1657462&r1=1657461&r2=1657462&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/main/java/org/apache/sirona/javaagent/AgentContext.java Thu Feb  5 03:35:36 2015
@@ -70,8 +70,9 @@ public class AgentContext {
         return AGENT_PARAMETERS;
     }
 
+
     // called by agent
-    public static AgentContext startOn(final Object that, final String key) {
+    public static AgentContext startOn(final Object that, final String key, final Object[] methodParameters) {
 		if (key == null) { // possible in static inits, the best would be to ignore it in instrumentation
 			return FAKE_CONTEXT;
 		}

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=1657462&r1=1657461&r2=1657462&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 Thu Feb  5 03:35:36 2015
@@ -18,6 +18,7 @@ package org.apache.sirona.javaagent;
 
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Handle;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
@@ -26,6 +27,7 @@ import org.objectweb.asm.commons.AdviceA
 import org.objectweb.asm.commons.Method;
 
 import java.lang.reflect.Modifier;
+import java.util.Arrays;
 
 import static java.lang.Integer.MIN_VALUE;
 
@@ -108,34 +110,71 @@ public class SironaClassVisitor extends
         private final boolean isStatic;
         private final String label;
         private final String desc;
+        private final int access;
 
         public SironaAdviceAdapter(final MethodVisitor visitor, final int access, final String name, final String desc, final String label) {
             super(ASM5, visitor, access, name, desc);
             this.isStatic = Modifier.isStatic(access);
             this.label = label;
             this.desc = desc;
+            this.access = access;
         }
 
         private int ctxLocal;
         private final Label tryStart = new Label();
         private final Label endLabel = new Label();
 
+
+
         @Override
         public void onMethodEnter() {
-            if (isStatic) {
-                visitInsn(ACONST_NULL);
-            } else {
+
+            // we need to call static method onStart from AgentContext
+            // with parameters final Object that, final String key, final Object[] methodParameters
+
+            if ( isStatic )
+            {
+                visitInsn( ACONST_NULL );
+            }
+            else
+            {
                 loadThis();
             }
-            push(label);
 
-            ctxLocal = newLocal(AGENT_CONTEXT);
-            invokeStatic(AGENT_CONTEXT, START_METHOD);
-            storeLocal(ctxLocal);
+            push( label );
+
+            int length = Type.getArgumentTypes( desc ).length;
 
-            visitLabel(tryStart);
+            // push count of arguments to the stack
+            super.visitIntInsn( BIPUSH, length );
+            // creates an object array
+            super.visitTypeInsn( ANEWARRAY, "java/lang/Object" );
+
+            // stores the arguments in the array
+            for ( int i = 0; i < length; i++ )
+            {
+                // duplicates the reference to the array. AASTORE consumes the stack element with the reference to the array.
+                super.visitInsn( DUP );
+                // could be optimized
+                super.visitIntInsn( BIPUSH, i );
+                // puts the value of the current argument on the stack
+                super.visitVarInsn( ALOAD, i + ( isStatic ? 0 : 1 ) );
+                // stores the value of the current argument in the array
+                super.visitInsn( AASTORE );
+            }
+
+            ctxLocal = newLocal( AGENT_CONTEXT );
+
+            invokeStatic( AGENT_CONTEXT, START_METHOD );
+
+            //visitMethodInsn(INVOKESTATIC, "org/apache/sirona/javaagent/AgentContext", "startOn", "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V", false);
+
+            storeLocal( ctxLocal );
+
+            visitLabel( tryStart );
         }
 
+
         @Override
         public void onMethodExit(final int opCode) {
             if (opCode == ATHROW) {

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=1657462&r1=1657461&r2=1657462&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 Thu Feb  5 03:35:36 2015
@@ -53,9 +53,10 @@ public class SironaTransformer implement
 
             if (advisor.wasAdviced()) {
                 final byte[] bytes = writer.toByteArray();
-                if (debug) {
+                //if (debug) {
                     final File dump = new File(System.getProperty("java.io.tmpdir"), "sirona-dump/" + className + ".class");
                     dump.getParentFile().mkdirs();
+                System.out.println( "dump to:" + dump.getPath() );
                     FileOutputStream w = null;
                     try {
                         w = new FileOutputStream(dump);
@@ -65,7 +66,7 @@ public class SironaTransformer implement
                             w.close();
                         }
                     }
-                }
+                //}
                 return bytes;
             }
             return classfileBuffer;

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/AgentPerfInterceptorAgentContractTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/AgentPerfInterceptorAgentContractTest.java?rev=1657462&r1=1657461&r2=1657462&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/AgentPerfInterceptorAgentContractTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/AgentPerfInterceptorAgentContractTest.java Thu Feb  5 03:35:36 2015
@@ -36,7 +36,7 @@ public class AgentPerfInterceptorAgentCo
     public void start() {
         final String key = "start";
         AgentContext.listeners(key, new byte[0]);
-        final AgentContext context = AgentContext.startOn(null, key);
+        final AgentContext context = AgentContext.startOn(null, key, null);
         context.stop(null);
         assertEquals("org.apache.sirona.javaagent.AgentContext", context.getClass().getName());
         assertEquals(1, Repository.INSTANCE.getCounter(AgentContext.key(key)).getHits());
@@ -47,7 +47,7 @@ public class AgentPerfInterceptorAgentCo
         final String key = "ref";
         final Object instance = new Object();
         AgentContext.listeners(key, new byte[0]);
-        final AgentContext context = AgentContext.startOn(instance, key);
+        final AgentContext context = AgentContext.startOn(instance, key, null);
         context.stop(null);
         assertEquals(instance, context.getReference());
         assertEquals(key, context.getKey());

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/App.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/App.java?rev=1657462&r1=1657461&r2=1657462&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/App.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/App.java Thu Feb  5 03:35:36 2015
@@ -35,20 +35,21 @@ public class App
         throws Exception
     {
         this.foo();
-        this.pub();
+        this.pub( "blabla" );
     }
 
-    public void pub()
+    public void pub( String foo )
         throws Exception
     {
         Thread.sleep( 100 );
         this.bar();
     }
 
-    public void bar()
+    public App bar()
         throws Exception
     {
         Thread.sleep( 300 );
+        return this;
     }
 
 

Modified: incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/PathTrackingListenerTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/PathTrackingListenerTest.java?rev=1657462&r1=1657461&r2=1657462&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/PathTrackingListenerTest.java (original)
+++ incubator/sirona/trunk/agent/javaagent/src/test/java/org/apache/test/sirona/javaagent/PathTrackingListenerTest.java Thu Feb  5 03:35:36 2015
@@ -42,7 +42,7 @@ public class PathTrackingListenerTest
 
     @Test
     @AgentArgs(value = "",
-               sysProps = "project.build.directory=${project.build.directory}|sirona.agent.debug=${sirona.agent.debug}|org.apache.sirona.configuration.sirona.properties=${project.build.directory}/test-classes/pathtracking/sirona.properties")
+               sysProps = "project.build.directory=${project.build.directory}|sirona.agent.debug=${sirona.agent.debug}|org.apache.sirona.configuration.sirona.properties=${project.build.directory}/test-classes/pathtracking/sirona.properties|java.io.tmpdir=${java.io.tmpdir}")
     public void simpleTest()
         throws Exception
     {