On Tue, 25 Oct 2022 19:46:15 GMT, Jorn Vernee <jver...@openjdk.org> wrote:
>>> Is it possible to use filter/findfirst without using lambdas? I want to >>> avoid recursion inside the tracing code. >> >> You could do this I believe (if I've eye-balled that correctly :)): >> Suggestion: >> >> String callerName = caller.getName(); >> String callerInfo = StackWalker.getInstance().walk(new >> Function<Stream<StackWalker.StackFrame>, String>() { >> // We use inner classes (instead of stream/lambda) to avoid >> triggering >> // further invokedynamic resolution, which would cause infinite >> recursion. >> // It's OK to use + for string concat, because java.base is >> compiled without >> // the use of indy string concat. >> @Override >> public String apply(Stream<StackWalker.StackFrame> s) { >> return s.filter(new Predicate<StackWalker.StackFrame>() { >> @Override >> public boolean test(StackWalker.StackFrame f) { >> return callerName.equals(f.getClassName()); >> } >> }).findFirst().get().toStackTraceElement().toString(); >> } >> }); >> >> >>> I am not sure about dumping the call stack. It seems an overkill and not >>> useful in most cases. It’s easier to rebuild the JDK and add >>> Thread.dumpStack() in the rare occasion that you need to do this. >> >> Fair enough. > > Or, maybe it's easier to use `Thread.currentThread().getStackTrace()` and > avoid messing around with streams altogether. I ended up using `Thread.currentThread().getStackTrace()` and the code is much cleaner. Performance isn't important anyway. `Stream.filter()` doesn't work because it uses a Lambda in `<clinit>`: java.lang.NullPointerException: Cannot invoke "java.util.stream.TerminalOp.getOpFlags()" because "terminalOp" is null at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:328) at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:315) at java.base/java.lang.StackStreamFactory$StackFrameTraverser.consumeFrames(StackStreamFactory.java:586) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.doStackWalk(StackStreamFactory.java:324) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:410) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walkHelper(StackStreamFactory.java:261) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:253) at java.base/java.lang.StackWalker.walk(StackWalker.java:589) at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteTracing(MethodHandleNatives.java:315) at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:275) at java.base/java.util.stream.FindOps$FindSink$OfRef.<clinit>(FindOps.java:198) at java.base/java.util.stream.FindOps.makeRef(FindOps.java:60) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:328) at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:315) at java.base/java.lang.StackStreamFactory$StackFrameTraverser.consumeFrames(StackStreamFactory.java:586) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.doStackWalk(StackStreamFactory.java:324) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:410) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walkHelper(StackStreamFactory.java:261) at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:253) at java.base/java.lang.StackWalker.walk(StackWalker.java:589) at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteTracing(MethodHandleNatives.java:315) at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:275) at java.base/jdk.internal.module.SystemModuleFinders$1.find(SystemModuleFinders.java:216) at java.base/jdk.internal.module.ModuleBootstrap.boot2(ModuleBootstrap.java:260) at java.base/jdk.internal.module.ModuleBootstrap.boot(ModuleBootstrap.java:174) at java.base/java.lang.System.initPhase2(System.java:2214) ------------- PR: https://git.openjdk.org/jdk/pull/10842