RFR: JDK-8203277: preflow visitor used during lambda attribution shouldn't visit class definitions inside the lambda body
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Nov 27 10:26:03 UTC 2018
I see looks good, thanks for the explanation.
Maurizio
On 27/11/2018 03:51, Vicente Romero wrote:
>
>
> On 11/20/18 6:54 AM, Maurizio Cimadamore wrote:
>>
>> Looks good - why is there a new change in the test?
>>
>
> good catch, I didn't think much about this but you are correct that at
> first glance the particular test case compiled in the test
> TestGetScopeResult shouldn't trigger the code in the patch. We are
> talking about this case:
>
> class Test {
> void test() {
> cand((t, var s) -> "");
> }
> void cand(I i) {}
>
> interface I {
> public String test(String s);
> }
> }
>
> which fails during the parser phase so it shouldn't exercise the new
> code added in this patch. But the test TestGetScopeResult forces the
> attribution of the test above when it does:
>
> ...
> Scope scope = Trees.instance(t).getScope(new
> TreePath(getCurrentPath(), node.getBody()));
> ...
>
> and then we have the following invocation chain:
>
> JavacTrees::getScope -> JavacTrees::getAttrContext ->
> JavacTrees::attribStatToTree -> Attr::attribStatToTree
>
> which finally forces the attribution of the lambda and thus the
> execution of the new code.
>
> Thanks,
> Vicente
>
>> Maurizio
>>
>> On 19/11/2018 20:57, Vicente Romero wrote:
>>> Hi Maurizio,
>>>
>>> On 11/9/18 5:57 AM, Maurizio Cimadamore wrote:
>>>>
>>>> Looks good - can we cook up a test that is also stressing the other
>>>> new code path?
>>>>
>>>
>>> what about: http://cr.openjdk.java.net/~vromero/8203277/webrev.02/?
>>>
>>>> Maurizio
>>>>
>>>
>>> Thanks,
>>> Vicente
>>>
>>>> On 09/11/2018 00:12, Vicente Romero wrote:
>>>>>
>>>>>
>>>>> On 11/8/18 6:02 PM, Maurizio Cimadamore wrote:
>>>>>>
>>>>>> Hi,
>>>>>> I agree that preflow shouldn't care about nested constructs; but
>>>>>> I wonder - is diamond anon class the only case we need to worry
>>>>>> about here? What about a nested lambda expression?
>>>>>>
>>>>>
>>>>> right I agree with you, what about [3]?
>>>>>
>>>>>> Maurizio
>>>>>>
>>>>> Vicente
>>>>>
>>>>> [3] http://cr.openjdk.java.net/~vromero/8203277/webrev.01/
>>>>>>
>>>>>> On 08/11/2018 00:24, Vicente Romero wrote:
>>>>>>> Please review the fix for [1] at [2]. The bug can be illustrated
>>>>>>> with this test case:
>>>>>>>
>>>>>>> import java.util.List;
>>>>>>> import java.util.function.Function;
>>>>>>>
>>>>>>> class DiamondInsideLambdaTest {
>>>>>>> void build() {
>>>>>>> List<Function<String, Double>> list = transform(null,
>>>>>>> builder -> new Function<>() {
>>>>>>> public Double apply(String params) { return
>>>>>>> null; }
>>>>>>> });
>>>>>>> }
>>>>>>>
>>>>>>> static <Argument, Result> List<Result>
>>>>>>> transform(List<Argument> fromList, Function<? super Argument,?
>>>>>>> extends Result> function) { return null; }
>>>>>>> }
>>>>>>>
>>>>>>> During lambda attribution, there is a preflow visitor that fill
>>>>>>> some holes, missing types / symbols, before doing an special
>>>>>>> flow analysis on the lambda. This flow analysis skip inner
>>>>>>> classes defined inside the lambda body. The preflow visitor is
>>>>>>> anyway visiting inner classes and filling, with garbage, some of
>>>>>>> the wholes. In most cases as the preflow step happens after the
>>>>>>> lambda body has been attributed, it should be a no-op. But if
>>>>>>> the lambda body contains a diamond as in this case, then it
>>>>>>> could be that the attribution can't be done previous to the
>>>>>>> preflow step. Simply because some types in the diamond could be
>>>>>>> waiting for type inference to come to a resolution. In that case
>>>>>>> preflow will modify the diamond expression and later on during
>>>>>>> completion, as some symbols and types are filled with erroneous
>>>>>>> types, they will keep that erroneous type.
>>>>>>>
>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8203277
>>>>>>> [2] http://cr.openjdk.java.net/~vromero/8203277/webrev.00/
>>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20181127/a99150eb/attachment.html>
More information about the compiler-dev
mailing list