From 61aaebfc97048a57d2a74b005602a03fff837839 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Wed, 29 Aug 2018 15:00:15 -0700 Subject: [PATCH] Create muzzle references from ldc instructions --- .../agent/tooling/muzzle/ReferenceCreator.java | 15 +++++++++++++++ .../groovy/muzzle/ReferenceCreatorTest.groovy | 8 ++++++++ .../testing/src/test/java/muzzle/TestClasses.java | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java index ba7f42013d..6b7978ac7d 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/muzzle/ReferenceCreator.java @@ -347,5 +347,20 @@ public class ReferenceCreator extends ClassVisitor { .build()); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } + + @Override + public void visitLdcInsn(final Object value) { + if (value instanceof Type) { + final Type type = underlyingType((Type) value); + if (type.getSort() == Type.OBJECT) { + addReference( + new Reference.Builder(type.getInternalName()) + .withSource(refSourceClassName, currentLineNumber) + .withFlag(computeMinimumClassAccess(refSourceType, type)) + .build()); + } + } + super.visitLdcInsn(value); + } } } diff --git a/dd-java-agent/testing/src/test/groovy/muzzle/ReferenceCreatorTest.groovy b/dd-java-agent/testing/src/test/groovy/muzzle/ReferenceCreatorTest.groovy index 41a5fb5450..e46b76c8b2 100644 --- a/dd-java-agent/testing/src/test/groovy/muzzle/ReferenceCreatorTest.groovy +++ b/dd-java-agent/testing/src/test/groovy/muzzle/ReferenceCreatorTest.groovy @@ -57,6 +57,14 @@ class ReferenceCreatorTest extends AgentTestRunner { findMethod(bMethods, "protectedMethod", "()V").getFlags().contains(Reference.Flag.PROTECTED_OR_HIGHER) } + def "ldc creates references" () { + setup: + Map references = ReferenceCreator.createReferencesFrom(LdcAdvice.getName(), this.getClass().getClassLoader()) + + expect: + references.get('muzzle.TestClasses$MethodBodyAdvice$A') != null + } + private static Reference.Method findMethod(Set methods, String methodName, String methodDesc) { for (Reference.Method method : methods) { if (method == new Reference.Method(methodName, methodDesc)) { diff --git a/dd-java-agent/testing/src/test/java/muzzle/TestClasses.java b/dd-java-agent/testing/src/test/java/muzzle/TestClasses.java index bb033be755..894a68ddcd 100644 --- a/dd-java-agent/testing/src/test/java/muzzle/TestClasses.java +++ b/dd-java-agent/testing/src/test/java/muzzle/TestClasses.java @@ -68,4 +68,10 @@ public class TestClasses { public interface AnotherInterface extends SomeInterface {} } + + public static class LdcAdvice { + public static void ldcMethod() { + MethodBodyAdvice.A.class.getName(); + } + } }