Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8337238

Demote maxStack and maxLocals from CodeModel to CodeAttribute

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 24
    • core-libs
    • None
    • source
    • minimal
    • Changes to preview APIs engender minimal compatibility risk.
    • Java API
    • SE

      Summary

      Move the maxLocals and maxStack accessors from CodeModel to CodeAttribute.

      Problem

      Code attribute has encoded max locals and stack information, but this is not helpful for in-transform code models that implement CodeModel; computing these information is costly, and no transformation depends on these APIs.

      Solution

      Move these 2 APIs to CodeAttribute.

      If transformations wish to access the max stack and locals information, they can create custom transformations in a chain to scan the instructions to detect the max locals, or use CodeStackTracker to detect the max stacks.

      Finally, if these APIs are found necessary to CodeModel later, they can be added back, which would be a source and binary compatible addition.

      Specification

      diff --git a/src/java.base/share/classes/java/lang/classfile/CodeModel.java b/src/java.base/share/classes/java/lang/classfile/CodeModel.java
      index 45488561c1a..ba816f20805 100644
      --- a/src/java.base/share/classes/java/lang/classfile/CodeModel.java
      +++ b/src/java.base/share/classes/java/lang/classfile/CodeModel.java
      @@ -43,17 +43,7 @@
       @PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
       public sealed interface CodeModel
               extends CompoundElement<CodeElement>, AttributedElement, MethodElement
      -        permits CodeAttribute, BufferedCodeBuilder.Model, CodeImpl {
      -
      -    /**
      -     * {@return the maximum size of the local variable table}
      -     */
      -    int maxLocals();
      -
      -    /**
      -     * {@return the maximum size of the operand stack}
      -     */
      -    int maxStack();
      +        permits CodeAttribute, BufferedCodeBuilder.Model {
      
           /**
            * {@return the enclosing method, if known}
      diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
      index 02cbcee810f..7a4f5886580 100644
      --- a/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
      +++ b/src/java.base/share/classes/java/lang/classfile/attribute/CodeAttribute.java
      @@ -47,6 +47,16 @@
       public sealed interface CodeAttribute extends Attribute<CodeAttribute>, CodeModel
               permits BoundAttribute.BoundCodeAttribute {
      
      +    /**
      +     * {@return the maximum size of the local variable table}
      +     */
      +    int maxLocals();
      +
      +    /**
      +     * {@return the maximum size of the operand stack}
      +     */
      +    int maxStack();
      +
           /**
            * {@return The length of the code array in bytes}
            */

            liach Chen Liang
            liach Chen Liang
            Adam Sotona
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: