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

Reply via email to