 /*
  * Copyright (c) 2015, 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 should throw VerifyError because the StackMap for bytecode index
 * 9 (istore_2, line 60) is incorrect. The stack maps for bytecode indexes 9
 * and 18 (astore_2, line 70) do not match because 9 does not supply enough
 * locals to satisfy 18.
 *
 * The istore_2 bytecode at bytecode index 9 changes the type state,
 * preventing the stackmap mismatch.  But, if the incoming type state is used,
 * as required by JVM Spec 8, then the verifier will detected the stackmap
 * mismatch, and throw VerifyError.
 */

super public class BadMapIstore
    version 51:0
{

Field blah:I;

public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial    Method java/lang/Object."<init>":"()V";
        return;
}

public static Method main:"([Ljava/lang/String;)V"
    stack 2 locals 3
{
        new    class BadMapIstore;
        dup;
        invokespecial    Method "<init>":"()V";
        astore_1;
        iconst_2;
        try t0;
        istore_2;
        aload_1;
        iconst_5;
        putfield    Field blah:"I";
        endtry t0;
        goto    L22;
        catch t0 java/lang/Throwable;
        stack_frame_type full;
        locals_map class "[Ljava/lang/String;", class BadMapIstore, int;
        stack_map class java/lang/Throwable;
        astore_2;
        aload_1;
        iconst_4;
        istore_2;
        pop;
    L22:    stack_frame_type same;
        return;
}

} // end Class BadMapIstore
