diff --git a/core/src/com/google/inject/BUILD b/core/src/com/google/inject/BUILD index 5be458bc1b..d15096d96d 100644 --- a/core/src/com/google/inject/BUILD +++ b/core/src/com/google/inject/BUILD @@ -35,6 +35,15 @@ IMPLEMENTED_BY_SRCS = [ "ImplementedBy.java", ] +CALLER_FINDER_STACK_WALKER_SRCS = ["internal/util/DirectStackWalkerFinder.java"] + +java_library( + name = "caller_finder_impl", + srcs = CALLER_FINDER_STACK_WALKER_SRCS, + javacopts = JAVAC_OPTS, + deps = [":caller_finder_common"], +) + java_library( name = "caller_finder_common", srcs = CALLER_FINDER_COMMON_SRCS, @@ -65,19 +74,25 @@ java_library( name = "inject", srcs = glob( ["**/*.java"], - exclude = IMPLEMENTED_BY_SRCS + PROVIDED_BY_SRCS + ANNOTATION_SRCS + CALLER_FINDER_COMMON_SRCS, + exclude = IMPLEMENTED_BY_SRCS + + PROVIDED_BY_SRCS + + ANNOTATION_SRCS + + CALLER_FINDER_COMMON_SRCS + + CALLER_FINDER_STACK_WALKER_SRCS, ), javacopts = JAVAC_OPTS, tags = ["maven_coordinates=com.google.inject:guice:" + POM_VERSION], exports = [ ":annotations", ":caller_finder_common", + ":caller_finder_impl", ":implemented_by", ":provided_by", ], deps = [ ":annotations", ":caller_finder_common", + ":caller_finder_impl", ":implemented_by", ":provided_by", "//third_party/java/aopalliance", @@ -120,6 +135,7 @@ gen_maven_artifact( ":annotations", ":implemented_by", ":caller_finder_common", + ":caller_finder_impl", ":provided_by", ], javadoc_srcs = [":javadoc-srcs"], diff --git a/core/src/com/google/inject/internal/util/DirectStackWalkerFinder.java b/core/src/com/google/inject/internal/util/DirectStackWalkerFinder.java new file mode 100644 index 0000000000..c593de0b70 --- /dev/null +++ b/core/src/com/google/inject/internal/util/DirectStackWalkerFinder.java @@ -0,0 +1,17 @@ +package com.google.inject.internal.util; + +import java.util.function.Predicate; + +/** A CallerFinder directly compiled against StackWalker. Requires compiling against jdk11+. */ +final class DirectStackWalkerFinder implements CallerFinder { + private static final StackWalker WALKER = + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + + @Override + public StackTraceElement findCaller(Predicate shouldBeSkipped) { + return WALKER + .walk(s -> s.skip(2).filter(f -> !shouldBeSkipped.test(f.getClassName())).findFirst()) + .map(StackWalker.StackFrame::toStackTraceElement) + .orElseThrow(AssertionError::new); + } +} diff --git a/core/src/com/google/inject/internal/util/SourceProvider.java b/core/src/com/google/inject/internal/util/SourceProvider.java index db069a67ef..2db4c2637e 100644 --- a/core/src/com/google/inject/internal/util/SourceProvider.java +++ b/core/src/com/google/inject/internal/util/SourceProvider.java @@ -96,6 +96,6 @@ public Object getFromClassNames(List moduleClassNames) { } private static CallerFinder loadCallerFinder() { - return new NewThrowableFinder(); + return new DirectStackWalkerFinder(); } }