Equivalent .class fields should share the same symbol

Jan Lahoda jan.lahoda at oracle.com
Mon Apr 16 15:02:36 UTC 2018


Hi Bernard,

There are two things I wonder about:
-can the key to the map be TypeSymbol? Basically "site.tsym" instead of 
"new Types.UniqueType(site...)". To me that would feel simpler.
-should there be a method in Symtab managing the map? Something like:
Symtab.getClassField(TypeSymbol tsym) {/*create the VarSymbol is needed*/}

Thanks,
     Jan

On 15.4.2018 18:34, 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