/*
 * Copyright (c) 2021, 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.
 */

// Code below is equivalent to
// public abstract class AbstractStrictfpMethod61 {
//     public AbstractStrictfpMethod61() {}
//
//     abstract strictfp double foo();
// }

class AbstractStrictfpMethod61 {
  0xCAFEBABE;
  0; // minor version
  61; // version
  [15] { // 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 "AbstractStrictfpMethod61"; // #8     at 0x3C
    Utf8 "Code"; // #9     at 0x57
    Utf8 "LineNumberTable"; // #10     at 0x5E
    Utf8 "foo"; // #11     at 0x70
    Utf8 "()D"; // #12     at 0x76
    Utf8 "SourceFile"; // #13     at 0x7C
    Utf8 "AbstractStrictfpMethod61.java"; // #14     at 0x89
  } // Constant Pool

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

  [0] { // Interfaces
  } // Interfaces

  [0] { // Fields
  } // Fields

  [2] { // Methods
    {  // method at 0xB5
      0x0001; // access
      #5; // name_index       : <init>
      #6; // descriptor_index : ()V
      [1] { // Attributes
        Attr(#9, 29) { // Code at 0xBD
          1; // max_stack
          1; // max_locals
          Bytes[5]{
            0x2AB70001B1;
          }
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0xD4
              [1] { // line_number_table
                0  2; //  at 0xE0
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    }
    ;
    {  // method at 0xE0
      0x0C00; // access [ACC_STRICTFP ACC_ABSTRACT]
      #11; // name_index       : foo
      #12; // descriptor_index : ()D
      [0] { // Attributes
      } // Attributes
    }
  } // Methods

  [1] { // Attributes
    Attr(#13, 2) { // SourceFile at 0xEA
      #14;
    } // end SourceFile
  } // Attributes
} // end class AbstractStrictfpMethod61
