From a8005e7526dcd92a89eaa07b9cf75ad351c53ae0 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 25 Apr 2025 11:04:19 +0200 Subject: [PATCH] feat(bootstrap): Introduce Java 8 bytecode bridge for instrumentation API Add has context API helpers --- .../api/Java8BytecodeBridge.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java new file mode 100644 index 00000000000..72728c6c94f --- /dev/null +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java @@ -0,0 +1,32 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import datadog.context.Context; + +/** + * A helper for accessing methods that rely on new Java 8 bytecode features such as calling a static + * interface methods. In instrumentation, we may need to call these methods in code that is inlined + * into an instrumented class, however many times the instrumented class has been compiled to a + * previous version of bytecode, and so we cannot inline calls to static interface methods, as those + * were not supported prior to Java 8 and will lead to a class verification error. + */ +public class Java8BytecodeBridge { + /** @see Context#root() */ + public static Context getRootContext() { + return Context.root(); + } + + /** @see Context#current() */ + public static Context getCurrentContext() { + return Context.current(); + } + + /** @see Context#from(Object) */ + public static Context getContextFrom(Object carrier) { + return Context.from(carrier); + } + + /** @see Context#detachFrom(Object) */ + public static Context detachContextFrom(Object carrier) { + return Context.detachFrom(carrier); + } +}