On Tue, 29 Aug 2023 00:16:40 GMT, Mandy Chung <mch...@openjdk.org> wrote:

>> 8268829: Provide an optimized way to walk the stack with Class object only
>> 
>> `StackWalker::walk` creates one `StackFrame` per frame and the current 
>> implementation
>> allocates one `StackFrameInfo` and one `MemberName` objects per frame. Some 
>> frameworks
>> like logging may only interest in the Class object but not the method name 
>> nor the BCI,
>> for example, filters out its implementation classes to find the caller 
>> class.  It's
>> similar to `StackWalker::getCallerClass` but allows a predicate to filter 
>> out the element.
>> 
>> This PR proposes to add `Option::DROP_METHOD_INFO` enum that requests to 
>> drop the method information.  If no method information is needed, a 
>> `StackWalker` with `DROP_METHOD_INFO`
>> can be used instead and such stack walker will save the overhead of 
>> extracting the method information
>> and the memory used for the stack walking.
>> 
>> New factory methods to take a parameter to specify the kind of stack walker 
>> to be created are defined.
>> This provides a simple way for existing code, for example logging 
>> frameworks, to take advantage of
>> this enhancement with the least change as it can keep the existing function 
>> for traversing
>> `StackFrame`s.
>> 
>> For example: to find the first caller filtering a known list of 
>> implementation class,
>> existing code can create a stack walker instance with `DROP_METHOD_INFO` 
>> option:
>> 
>> 
>>      StackWalker walker = StackWalker.getInstance(Option.DROP_METHOD_INFO, 
>> Option.RETAIN_CLASS_REFERENCE);
>>      Optional<Class<?>> callerClass = walker.walk(s ->
>>              s.map(StackFrame::getDeclaringClass)
>>               .filter(Predicate.not(implClasses::contains))
>>               .findFirst());
>> 
>> 
>> If method information is accessed on the `StackFrame`s produced by this 
>> stack walker such as
>> `StackFrame::getMethodName`, then `UnsupportedOperationException` will be 
>> thrown.
>> 
>> #### Javadoc & specdiff
>> 
>> https://cr.openjdk.org/~mchung/api/java.base/java/lang/StackWalker.html
>> https://cr.openjdk.org/~mchung/jdk22/specdiff/overview-summary.html
>> 
>> #### Alternatives Considered
>> One alternative is to provide a new API:
>> `<T> T walkClass(Function<? super Stream<Class<?>, ? extends T> function)`
>> 
>> In this case, the caller would need to pass a function that takes a stream
>> of `Class` object instead of `StackFrame`.  Existing code would have to
>> modify calls to the `walk` method to `walkClass` and the function body.
>> 
>> ### Implementation Details
>> 
>> A `StackWalker` configured with `DROP_METHOD_INFO` ...
>
> Mandy Chung has updated the pull request incrementally with two additional 
> commits since the last revision:
> 
>  - Revised the API change.  Add Option::DROP_METHOD_INFO
>  - Review feedback from Remi

Hi Mandy, I like the new DROP_METHOD_INFO constant. Just a couple of minor 
suggestions on the wording (which you may chose to ignore as English is not my 
primary language).

src/java.base/share/classes/java/lang/StackWalker.java line 73:

> 71:  * <p>1. To find the first caller filtering a known list of 
> implementation class:
> 72:  * {@snippet lang="java" :
> 73:  *     StackWalker walker = 
> StackWalker.getInstance(Option.DROP_METHOD_INFO, 
> Option.RETAIN_CLASS_REFERENCE);

Would this read better as "filtering **out** a known list of implementation 
**classes**" ?

src/java.base/share/classes/java/lang/StackWalker.java line 98:

> 96:      *
> 97:      * <p> The information of a {@code StackFrame} available is 
> determined by the
> 98:      * {@linkplain Option stack walking options} of a stack walker.

Would this read better as "The information available from a {@code StackFrame} 
is determined ... "?

-------------

PR Review: https://git.openjdk.org/jdk/pull/15370#pullrequestreview-1600394012
PR Review Comment: https://git.openjdk.org/jdk/pull/15370#discussion_r1308804787
PR Review Comment: https://git.openjdk.org/jdk/pull/15370#discussion_r1308807710

Reply via email to