/*
 * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

// Class with ACC_SUPER set
class SUPERset {
  0xCAFEBABE;
  0; // minor version
  64; // version
  [14] { // Constant Pool
    ; // first element is empty
    Method #2 #3; // #1     at 0x0A
    class #4; // #2     at 0x0F
    NameAndType #5 #6; // #3     at 0x12
    Utf8 "java/lang/Object"; // #4     at 0x17
    Utf8 "<init>"; // #5     at 0x2A
    Utf8 "()V"; // #6     at 0x33
    class #8; // #7     at 0x39
    Utf8 "SUPERset"; // #8     at 0x3C
    Utf8 "Code"; // #9     at 0x48
    Utf8 "LineNumberTable"; // #10     at 0x4F
    Utf8 "hi"; // #11     at 0x61
    Utf8 "SourceFile"; // #12     at 0x66
    Utf8 "SUPERset.java"; // #13     at 0x73
  } // Constant Pool

  0x0021; // access [ ACC_PUBLIC ACC_SUPER ]
  #7;// this_cpx
  #2;// super_cpx

  [0] { // Interfaces
  } // Interfaces

  [0] { // Fields
  } // Fields

  [2] { // Methods
    {  // method at 0x90
      0x0001; // access
      #5; // name_index       : <init>
      #6; // descriptor_index : ()V
      [1] { // Attributes
        Attr(#9, 29) { // Code at 0x98
          1; // max_stack
          1; // max_locals
          Bytes[5]{
            0x2AB70001B1;
          }
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0xAF
              [1] { // line_number_table
                0  1; //  at 0xBB
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    }
    ;
    {  // method at 0xBB
      0x0009; // access
      #11; // name_index       : hi
      #6; // descriptor_index : ()V
      [1] { // Attributes
        Attr(#9, 25) { // Code at 0xC3
          0; // max_stack
          0; // max_locals
          Bytes[1]{
            0xB1;
          }
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0xD6
              [1] { // line_number_table
                0  2; //  at 0xE2
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    }
  } // Methods

  [1] { // Attributes
    Attr(#12, 2) { // SourceFile at 0xE4
      #13;
    } // end SourceFile
  } // Attributes
} // end class SUPERset


// Class with ACC_SUPER not set
class SUPERnotset {
  0xCAFEBABE;
  0; // minor version
  64; // version
  [14] { // Constant Pool
    ; // first element is empty
    Method #2 #3; // #1     at 0x0A
    class #4; // #2     at 0x0F
    NameAndType #5 #6; // #3     at 0x12
    Utf8 "java/lang/Object"; // #4     at 0x17
    Utf8 "<init>"; // #5     at 0x2A
    Utf8 "()V"; // #6     at 0x33
    class #8; // #7     at 0x39
    Utf8 "SUPERnotset"; // #8     at 0x3C
    Utf8 "Code"; // #9     at 0x48
    Utf8 "LineNumberTable"; // #10     at 0x4F
    Utf8 "hi"; // #11     at 0x61
    Utf8 "SourceFile"; // #12     at 0x66
    Utf8 "SUPERnotset.java"; // #13     at 0x73
  } // Constant Pool

  0x0001; // access [ ACC_PUBLIC ]
  #7;// this_cpx
  #2;// super_cpx

  [0] { // Interfaces
  } // Interfaces

  [0] { // Fields
  } // Fields

  [2] { // Methods
    {  // method at 0x90
      0x0001; // access
      #5; // name_index       : <init>
      #6; // descriptor_index : ()V
      [1] { // Attributes
        Attr(#9, 29) { // Code at 0x98
          1; // max_stack
          1; // max_locals
          Bytes[5]{
            0x2AB70001B1;
          }
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0xAF
              [1] { // line_number_table
                0  1; //  at 0xBB
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    }
    ;
    {  // method at 0xBB
      0x0009; // access
      #11; // name_index       : hi
      #6; // descriptor_index : ()V
      [1] { // Attributes
        Attr(#9, 25) { // Code at 0xC3
          0; // max_stack
          0; // max_locals
          Bytes[1]{
            0xB1;
          }
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0xD6
              [1] { // line_number_table
                0  2; //  at 0xE2
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    }
  } // Methods

  [1] { // Attributes
    Attr(#12, 2) { // SourceFile at 0xE4
      #13;
    } // end SourceFile
  } // Attributes
} // end class SUPERnotset
