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();