On Fri, 25 Apr 2025 14:21:55 GMT, Chen Liang <[email protected]> wrote:
>> The record has fewer source lines but doesn't the generated record class
>> have a getter, toString(), hashCode() and equals(Object) which are not
>> needed here?
>> What about using a lock parameter and a method handle to pass in the
>> required features of PrintStream and PrintWriter:
>>
>> public void printStackTrace(PrintWriter pw) {
>> printStackTrace(pw, pw::println);
>> }
>>
>> public void printStackTrace(PrintStream ps) {
>> printStackTrace(ps, ps::println);
>> }
>>
>> private void printStackTrace(Object lock, Consumer<Object> println) {
>> synchronized(lock) {
>> ...
>> println.accept(this);
>> ...
>> }
>> }
>
> FYI lambda expressions depend on java.lang.invoke, and if anything
> initialized before that throws an exception and needs to print stack trace,
> the VM will fail with a traceless `StackOverflowError` I think. Consumer
> class is fine for early loading, but to implement that, we fall back to
> records again.
Hmm, I just noticed we have `Appendable`; maybe we can reuse that...
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24795#discussion_r2060435819