Loosening requirements for super() invocation
Brian Goetz
brian.goetz at oracle.com
Mon Oct 31 22:07:59 UTC 2022
This looks like some nice progress.
I would really like it if we had some warnings to detect more of the
cases where `this` might escape construction, such as passing `this`
explicitly to a method, invoking a non-final instance method, or
invoking an instance method whose implementation is in a superclass.
(Same for use of `this` in init blocks.)
I think the "try" part is likely to be off the table; too intrusive for
too little value.
Have you looked at the spec to see what would need to be adjusted?
On 10/31/2022 3:18 PM, Archie Cobbs wrote:
> This is an old thread which I've been looking at again lately.
>
> To summarize, the idea is to relax the JLS rules about code prior to
> super()/this() invocation to more closely match what the JVM allows,
> which is field assignments and any code that doesn't reference 'this'.
> Relevant issues are JDK-8194743
> <https://bugs.openjdk.org/browse/JDK-8194743> and JDK-8193760
> <https://bugs.openjdk.org/browse/JDK-8193760>.
>
> In order to make this idea less theoretical, I've prototyped all the
> required compiler changes. There is also a write-up describing them
> <https://urldefense.com/v3/__https://github.com/archiecobbs/jdk/blob/JDK-8193760/README-JDK-8193760.md__;!!ACWV5N9M2RV99hQ!IFOxLGBuSAtoSNYjvgWAbvbnDuMuHauJA4BIffX89H5Q_c0wG__CXaZEcL6ZG7_e_uQ6KhbytfzaMQ_YMAOcpvY$>.
>
> There are a few interesting subtleties, e.g. relating to
> initialization blocks, and there is also a sub-question, which is
> whether to allow invoking super()/this() within a try block (this
> would have to be under the restriction that any catch or finally
> clause must not return normally). Currently that's not possible
> without a small JVM change, which I also think might be worth
> considering to really round out this new feature. See the writeup for
> details.
>
> To see some examples of what would be allowed, see this unit test
> <https://urldefense.com/v3/__https://github.com/archiecobbs/jdk/blob/JDK-8193760/test/langtools/tools/javac/superInit/SuperInitGood.java__;!!ACWV5N9M2RV99hQ!IFOxLGBuSAtoSNYjvgWAbvbnDuMuHauJA4BIffX89H5Q_c0wG__CXaZEcL6ZG7_e_uQ6KhbytfzaMQ_YIuRHaaQ$>.
> The compiler changes are here
> <https://urldefense.com/v3/__https://github.com/openjdk/jdk/compare/master...archiecobbs:jdk:JDK-8193760__;!!ACWV5N9M2RV99hQ!IFOxLGBuSAtoSNYjvgWAbvbnDuMuHauJA4BIffX89H5Q_c0wG__CXaZEcL6ZG7_e_uQ6KhbytfzaMQ_Y-maJVCk$>.
>
> Thoughts?
>
> -Archie
>
> On Thu, Jan 17, 2019 at 8:42 AM Brian Goetz <brian.goetz at oracle.com>
> wrote:
>
> Some things have improved for this feature since we last talked;
> several verifier issues that this would have pushed on have been
> resolved. So it’s moved from the “way too expensive for the
> benefit” category into the “there are lots of things we can do, is
> this really what we want to spend our effort and complexity budget
> on” category.
>
> My view on this is that while there’s nothing wrong with it, it’s
> also a pretty minor wart. If this fell out of a bigger feature,
> I’d certainly not object, but I’d rather spend the effort and
> complexity budget on things that have broader benefit.
>
> > On Jan 16, 2019, at 5:48 PM, Archie Cobbs
> <archie.cobbs at gmail.com> wrote:
> >
> > I'm curious what are people's current thoughts on loosening the
> > requirements for super() invocation in the context of Amber, e.g.:
> >
> > public class MyInputStream extends FilterInputStream {
> > public MyInputStream(InputStream in) {
> > if (in == null)
> > throw new IllegalArgumentException("null input");
> > super(in); // look ma!
> > }
> > }
> >
>
>
> --
> Archie L. Cobbs
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20221031/dc7304d3/attachment-0001.htm>
More information about the amber-dev
mailing list