On Tue, 25 Oct 2022 19:46:15 GMT, Jorn Vernee <[email protected]> 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