RFR: 8341548: More concise use of classfile API

Shaojin Wen swen at openjdk.org
Fri Oct 4 17:06:50 UTC 2024


On Fri, 4 Oct 2024 12:05:02 GMT, Shaojin Wen <swen at openjdk.org> wrote:

> java.base should provide best practices for Class File API
> 
> 1. Use fluent coding style
> 2. Use aconst_null instead of oadConstant(null)
> 3. use astore intead of 'storeLocal(REFERENCE'
> 4. use aload instead of 'loadLocal(REFERENCE'
> 5. 'lload/lstore' instead of 'loadLocal(LONG)/storeLocal(LONG)'

Using a fluent coding style can reduce the code size, such as the following code


import java.lang.classfile.CodeBuilder;

public class Demo {
   public static void f0(CodeBuilder cb) {
      cb.aload(0);
      cb.aload(1);
   }

   public static void f1(CodeBuilder cb) {
      cb.aload(0)
        .aload(1);
   }
}


Compile Java code and view bytecode

javac --enable-preview --release 24 Demo.java
javap -c Demo 


The bytecode is as follows


public class Demo {
  public Demo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void f0(java.lang.classfile.CodeBuilder);
    Code:
       0: aload_0
       1: iconst_0
       2: invokeinterface #7,  2            // InterfaceMethod java/lang/classfile/CodeBuilder.aload:(I)Ljava/lang/classfile/CodeBuilder;
       7: pop
       8: aload_0
       9: iconst_1
      10: invokeinterface #7,  2            // InterfaceMethod java/lang/classfile/CodeBuilder.aload:(I)Ljava/lang/classfile/CodeBuilder;
      15: pop
      16: return

  public static void f1(java.lang.classfile.CodeBuilder);
    Code:
       0: aload_0
       1: iconst_0
       2: invokeinterface #7,  2            // InterfaceMethod java/lang/classfile/CodeBuilder.aload:(I)Ljava/lang/classfile/CodeBuilder;
       7: iconst_1
       8: invokeinterface #7,  2            // InterfaceMethod java/lang/classfile/CodeBuilder.aload:(I)Ljava/lang/classfile/CodeBuilder;
      13: pop
      14: return
}


We can see that method `f0` does not use the fluent code style, and the generated bytecode has redundant pop and aload_0 operations.

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

PR Comment: https://git.openjdk.org/jdk/pull/21355#issuecomment-2393963891


More information about the core-libs-dev mailing list