< prev index next >

src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java

Print this page
*** 139,15 ***
          return attributes;
      }
  
      @Override
      public void writeTo(BufWriterImpl buf) {
!         if (buf.canWriteDirect(classReader)) {
              super.writeTo(buf);
          }
          else {
!             DirectCodeBuilder.build((MethodInfo) enclosingMethod,
                                      Util.writingAll(this),
                                      (SplitConstantPool)buf.constantPool(),
                                      buf.context(),
                                      null).writeTo(buf);
          }
--- 139,16 ---
          return attributes;
      }
  
      @Override
      public void writeTo(BufWriterImpl buf) {
!         var methodInfo = (MethodInfo) enclosingMethod;
+         if (Util.canSkipMethodInflation(classReader, methodInfo, buf)) {
              super.writeTo(buf);
          }
          else {
!             DirectCodeBuilder.build(methodInfo,
                                      Util.writingAll(this),
                                      (SplitConstantPool)buf.constantPool(),
                                      buf.context(),
                                      null).writeTo(buf);
          }

*** 277,21 ***
          int bci = -1; //compensate for offsetDelta + 1
          int nEntries = classReader.readU2(stackMapPos);
          int p = stackMapPos + 2;
          for (int i = 0; i < nEntries; ++i) {
              int frameType = classReader.readU1(p);
!             int offsetDelta;
              if (frameType < 64) {
                  offsetDelta = frameType;
                  ++p;
              }
              else if (frameType < 128) {
                  offsetDelta = frameType & 0x3f;
                  p = adjustForObjectOrUninitialized(p + 1);
              }
!             else
                  switch (frameType) {
                      case 247 -> {
                          offsetDelta = classReader.readU2(p + 1);
                          p = adjustForObjectOrUninitialized(p + 3);
                      }
                      case 248, 249, 250, 251 -> {
--- 278,27 ---
          int bci = -1; //compensate for offsetDelta + 1
          int nEntries = classReader.readU2(stackMapPos);
          int p = stackMapPos + 2;
          for (int i = 0; i < nEntries; ++i) {
              int frameType = classReader.readU1(p);
!             int offsetDelta = -1;
              if (frameType < 64) {
                  offsetDelta = frameType;
                  ++p;
              }
              else if (frameType < 128) {
                  offsetDelta = frameType & 0x3f;
                  p = adjustForObjectOrUninitialized(p + 1);
              }
!             else {
                  switch (frameType) {
+                     case 246 -> {
+                         int numberOfUnsetFields = classReader.readU2(p + 1);
+                         p += 3;
+                         p += 2 * numberOfUnsetFields;
+                         continue; // do not move bci/create label
+                     }
                      case 247 -> {
                          offsetDelta = classReader.readU2(p + 1);
                          p = adjustForObjectOrUninitialized(p + 3);
                      }
                      case 248, 249, 250, 251 -> {

*** 320,10 ***
--- 327,11 ---
                              p = adjustForObjectOrUninitialized(p);
                          }
                      }
                      default -> throw new IllegalArgumentException("Bad frame type: " + frameType);
                  }
+             }
              bci += offsetDelta + 1;
              inflateLabel(bci);
          }
      }
  
< prev index next >