On Fri, 3 Jun 2022 11:19:04 GMT, ExE Boss <d...@openjdk.java.net> wrote:

>> You would think that, but javac doesn't do anything fancy once you store to 
>> a local
>> 
>> javap output for lines 108 through 111:
>> 
>>        449: ldc           #148                // float 0.1f
>>        451: fstore        31
>>        453: fload         31
>>        455: invokedynamic #149,  0            // InvokeDynamic 
>> #4:makeConcatWithConstants:(F)Ljava/lang/String;
>>        460: astore        32
>>        462: fload         31
>>        464: aload         4
>>        466: invokedynamic #152,  0            // InvokeDynamic 
>> #7:makeConcatWithConstants:(FLjava/lang/String;)Ljava/lang/String;
>>        471: astore        33
>>        473: aload         4
>>        475: fload         31
>>        477: invokedynamic #155,  0            // InvokeDynamic 
>> #10:makeConcatWithConstants:(Ljava/lang/String;F)Ljava/lang/String;
>
> I guess it only happens for `final` locals.

Yes, looks like javac does constant fold when the local is explicitly final:

                final float f = 0.1f;
                System.out.println("const folding? " + f);

javap:

         0: getstatic     #2                  // Field 
java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String const folding? 0.1
         5: invokevirtual #4                  // Method 
java/io/PrintStream.println:(Ljava/lang/String;)V


Maybe this constant folding is something javac could be enhanced to do on 
effectively final locals, though I think we can defer adjusting 
`HelloClasslist` to break that optimization when that time comes.

-------------

PR: https://git.openjdk.java.net/jdk/pull/8855

Reply via email to