Equivalent .class fields should share the same symbol

B. Blaser bsrbnd at gmail.com
Mon Apr 16 17:06:34 UTC 2018


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?

Thanks,
Bernard


> 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