Equivalent .class fields should share the same symbol

Vicente Romero vicente.romero at oracle.com
Mon Apr 16 20:23:11 UTC 2018



On 04/16/2018 01:06 PM, B. Blaser wrote:
> Hi Vicente,
>
> On 16 April 2018 at 16:07, Vicente Romero <vicente.romero at oracle.com> wrote:
>> Hi Bernard,
>>
>> The change looks good. Suggestion: it would be nice to include some
>> regression tests with it,
>>
>> Thanks,
>> Vicente
> I added this use case to the de-duplication test (at the end of the
> patch) since the problem appears in such situations.
> Did you miss it or do you have any other idea in mind?

I guess I was thinking about a dedicated test, probably a combo test, 
but yes I guess that reusing the deduplication test could be a good start

>
> Thanks,
> Bernard

Vicente

>
>
>> On 04/15/2018 12:34 PM, B. Blaser wrote:
>>> Hi Rémi,
>>>
>>> On 15 April 2018 at 14:31, Remi Forax <forax at univ-mlv.fr> wrote:
>>>> Hi,
>>>> You can use Map.computeIfAbsent instead of putIfAbsent to avoid to create
>>>> the Symbol before checking if one exist or not.
>>>>
>>>> Also you using _class for several purpose, the Map should be named
>>>> classes and the local variable classSymbol or something like that.
>>>>
>>>> cheers,
>>>> Rémi
>>> Thanks for your feedback, nice suggestions.
>>> Here is the updated version.
>>>
>>> Cheers,
>>> Bernard
>>>
>>> diff -r 8c85a1855e10
>>> src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
>>> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
>>> Fri Apr 13 11:14:49 2018 -0700
>>> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
>>> Sun Apr 15 17:15:36 2018 +0200
>>> @@ -247,6 +247,8 @@
>>>         */
>>>        private final Map<Name, ModuleSymbol> modules = new
>>> LinkedHashMap<>();
>>>
>>> +    public final Map<Types.UniqueType, VarSymbol> classFields = new
>>> HashMap<>();
>>> +
>>>        public void initType(Type type, ClassSymbol c) {
>>>            type.tsym = c;
>>>            typeOfTag[type.getTag().ordinal()] = type;
>>> diff -r 8c85a1855e10
>>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
>>> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
>>> Fri Apr 13 11:14:49 2018 -0700
>>> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
>>> Sun Apr 15 17:15:36 2018 +0200
>>> @@ -3731,11 +3731,14 @@
>>>                    } else if (name == names._class) {
>>>                        // In this case, we have already made sure in
>>>                        // visitSelect that qualifier expression is a type.
>>> -                    Type t = syms.classType;
>>> -                    List<Type> typeargs = List.of(types.erasure(site));
>>> -                    t = new ClassType(t.getEnclosingType(), typeargs,
>>> t.tsym);
>>> -                    return new VarSymbol(
>>> -                        STATIC | PUBLIC | FINAL, names._class, t,
>>> site.tsym);
>>> +                    return syms.classFields.computeIfAbsent(
>>> +                        new Types.UniqueType(site, types), k -> {
>>> +                            Type t = syms.classType;
>>> +                            List<Type> typeargs =
>>> List.of(types.erasure(site));
>>> +                            t = new ClassType(t.getEnclosingType(),
>>> typeargs, t.tsym);
>>> +                            return new VarSymbol(
>>> +                                STATIC | PUBLIC | FINAL,
>>> names._class, t, site.tsym);
>>> +                        });
>>>                    } else {
>>>                        // We are seeing a plain identifier as selector.
>>>                        Symbol sym = rs.findIdentInType(env, site, name,
>>> resultInfo.pkind);
>>> @@ -3773,11 +3776,14 @@
>>>                    if (name == names._class) {
>>>                        // In this case, we have already made sure in Select
>>> that
>>>                        // qualifier expression is a type.
>>> -                    Type t = syms.classType;
>>> -                    Type arg = types.boxedClass(site).type;
>>> -                    t = new ClassType(t.getEnclosingType(),
>>> List.of(arg), t.tsym);
>>> -                    return new VarSymbol(
>>> -                        STATIC | PUBLIC | FINAL, names._class, t,
>>> site.tsym);
>>> +                    return syms.classFields.computeIfAbsent(
>>> +                        new Types.UniqueType(site, types), k -> {
>>> +                            Type t = syms.classType;
>>> +                            Type arg = types.boxedClass(site).type;
>>> +                            t = new ClassType(t.getEnclosingType(),
>>> List.of(arg), t.tsym);
>>> +                            return new VarSymbol(
>>> +                                STATIC | PUBLIC | FINAL,
>>> names._class, t, site.tsym);
>>> +                         });
>>>                    } else {
>>>                        log.error(pos, Errors.CantDeref(site));
>>>                        return syms.errSymbol;
>>> diff -r 8c85a1855e10
>>> test/langtools/tools/javac/lambda/deduplication/Deduplication.java
>>> --- a/test/langtools/tools/javac/lambda/deduplication/Deduplication.java
>>> Fri Apr 13 11:14:49 2018 -0700
>>> +++ b/test/langtools/tools/javac/lambda/deduplication/Deduplication.java
>>> Sun Apr 15 17:15:36 2018 +0200
>>> @@ -38,6 +38,21 @@
>>>                    (Runnable) () -> { ( (Runnable) () -> {} ).run(); }
>>>            );
>>>
>>> +        group(
>>> +                (Runnable) () -> { Deduplication.class.toString(); },
>>> +                (Runnable) () -> { Deduplication.class.toString(); }
>>> +        );
>>> +
>>> +        group(
>>> +                (Runnable) () -> { Integer[].class.toString(); },
>>> +                (Runnable) () -> { Integer[].class.toString(); }
>>> +        );
>>> +
>>> +        group(
>>> +                (Runnable) () -> { char.class.toString(); },
>>> +                (Runnable) () -> { char.class.toString(); }
>>> +        );
>>> +
>>>            group((Function<String, Integer>) x -> x.hashCode());
>>>            group((Function<Object, Integer>) x -> x.hashCode());
>>



More information about the compiler-dev mailing list