Hiding the lambda proxy frame

Remi Forax forax at univ-mlv.fr
Tue Jun 11 09:21:12 PDT 2013


On 06/11/2013 03:22 PM, Brian Goetz wrote:
> Why wouldn't you bring this to the EG list instead?

Sure, it was an implementation detail for me, hence the post on lambda-dev.

So from lambda-dev:
Currently when you print a stacktrace that show a call inside a lambda,
users can see the the frame corresponding to the method of the generated
proxy.

By example:
java.lang.Throwable
       StackTraceTest.lambda$0(StackTraceTest.java:6)
       StackTraceTest$$Lambda$1.run(Unknown Source)     <--- ugly, isn't it
       StackTraceTest.main(StackTraceTest.java:8)

I think this line should not be visible to user, it doesn't provide 
useful information,
just make the stack trace longer than it should.

There is an annotation LambdaForm.Hidden that you can use to mark method
that should be hidden when dumping the stack trace.
(Maybe the annotation should be a top-level by the way, add John in CC given
he is the creator of this annotation)

This part was not in the original mail:
Moreover, offline, one of my friend point me to a presentation of Jamie 
Allen
http://jaxenter.com/what-you-need-to-know-about-lambdas-by-jamie-allen-47356.html
on the same subject at JAXConf 2013. I've just finished to see it.

He raises a good point that the compiler translation should try to 
provide a better name.
By example,
   Runnable myRunnable = () -> System.out.println("hello");
should result in a lambda that instead to be called "lambda$0",
instead the compiler should try to name it something like lambda$myRunnable
(or lambda$myRunnable0, ..., if there is a collision) if it's possible.

I think we already discuss about something like that in the light of 
serialization,
but not in the stack trace context.

Rémi




More information about the lambda-spec-experts mailing list