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

// This class has an illegal NameAndType at constant pool #4.  It's illegal because
// the type that it points to at #28 is a zero length Utf8 string which is not a
// valid signature.  Loading this class should cause a ClassFormatError exception.
class emptySigUtf8 {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [29] { // Constant Pool
    ; // first element is empty
    Method #6 #15; // #1     at 0x0A
    Field #16 #17; // #2     at 0x0F
    String #18; // #3     at 0x14
    NameAndType #27 #28; // #4     at 0x9F
    class #21; // #5     at 0x1C
    class #22; // #6     at 0x1F
    Utf8 "<init>"; // #7     at 0x22
    Utf8 "()V"; // #8     at 0x2B
    Utf8 "Code"; // #9     at 0x2E
    Utf8 "LineNumberTable"; // #10     at 0x35
    Utf8 "main"; // #11     at 0x47
    Utf8 "([Ljava/lang/String;)V"; // #12     at 0x4E
    Utf8 "SourceFile"; // #13     at 0x67
    Utf8 "emptySigUtf8.java"; // #14     at 0x74
    NameAndType #7 #8; // #15     at 0x81
    class #23; // #16     at 0x86
    NameAndType #24 #25; // #17     at 0x89
    Utf8 "Hello World"; // #18     at 0x8E
    class #26; // #19     at 0x9C
    Method #19 #4; // #20     at 0x17
    Utf8 "emptySigUtf8"; // #21     at 0xA4
    Utf8 "java/lang/Object"; // #22     at 0xAC
    Utf8 "java/lang/System"; // #23     at 0xBF
    Utf8 "out"; // #24     at 0xD2
    Utf8 "Ljava/io/PrintStream;"; // #25     at 0xD8
    Utf8 "java/io/PrintStream"; // #26     at 0xF0
    Utf8 "hi"; // #27     at 0x0106
    Utf8 ""; // #28     at 0x0110
  } // Constant Pool

  0x0021; // access
  #5;// this_cpx
  #6;// super_cpx

  [0] { // Interfaces
  } // Interfaces

  [0] { // fields
  } // fields

  [2] { // methods
    { // Member at 0x0134
      0x0001; // access
      #7; // name_cpx
      #8; // sig_cpx
      [1] { // Attributes
        Attr(#9, 29) { // Code at 0x013C
          1; // max_stack
          1; // max_locals
          Bytes[5]{
            0x2AB70001B1;
          };
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 6) { // LineNumberTable at 0x0153
              [1] { // LineNumberTable
                0  2; //  at 0x015F
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member at 0x015F
      0x0009; // access
      #11; // name_cpx
      #12; // sig_cpx
      [1] { // Attributes
        Attr(#9, 37) { // Code at 0x0167
          2; // max_stack
          1; // max_locals
          Bytes[9]{
            0xB200021203B60004;
            0xB1;
          };
          [0] { // Traps
          } // end Traps
          [1] { // Attributes
            Attr(#10, 10) { // LineNumberTable at 0x0182
              [2] { // LineNumberTable
                0  4; //  at 0x018E
                8  5; //  at 0x0192
              }
            } // end LineNumberTable
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

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