1  /*
   2   * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
   3   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4   *
   5   * This code is free software; you can redistribute it and/or modify it
   6   * under the terms of the GNU General Public License version 2 only, as
   7   * published by the Free Software Foundation.
   8   *
   9   * This code is distributed in the hope that it will be useful, but WITHOUT
  10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12   * version 2 for more details (a copy is included in the LICENSE file that
  13   * accompanied this code).
  14   *
  15   * You should have received a copy of the GNU General Public License version
  16   * 2 along with this work; if not, write to the Free Software Foundation,
  17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18   *
  19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20   * or visit www.oracle.com if you need additional information or have any
  21   * questions.
  22   *
  23   */
  24 
  25 /*
  26  * This class should throw VerifyError because the StackMap for bytecode index
  27  * 9 (dstore_2, line 60) is incorrect. The stack maps for bytecode indexes 9
  28  * and 18 (astore_2, line 70) do not match because 9 does not supply enough
  29  * locals to satisfy 18.
  30  *
  31  * The dstore_2 bytecode at bytecode index 9 changes the type state,
  32  * preventing the stackmap mismatch.  But, if the incoming type state is used,
  33  * as required by JVM Spec 8, then the verifier will detected the stackmap
  34  * mismatch, and throw VerifyError.
  35  */
  36 
  37 super public class BadMapDstore
  38     version 51:0
  39 {
  40 
  41 Field blah:I;
  42 
  43 public Method "<init>":"()V"
  44     stack 1 locals 1
  45 {
  46         aload_0;
  47         invokespecial    Method java/lang/Object."<init>":"()V";
  48         return;
  49 }
  50 
  51 public static Method main:"([Ljava/lang/String;)V"
  52     stack 4 locals 4
  53 {
  54         new    class BadMapDstore;
  55         dup;
  56         invokespecial    Method "<init>":"()V";
  57         astore_1;
  58         dconst_1;
  59         try t0;
  60         dstore_2;
  61         aload_1;
  62         iconst_5;
  63         putfield    Field blah:"I";
  64         endtry t0;
  65         goto    L22;
  66         catch t0 java/lang/Throwable;
  67         stack_frame_type full;
  68         locals_map class "[Ljava/lang/String;", class BadMapDstore, double;
  69         stack_map class java/lang/Throwable;
  70         astore_2;
  71         aload_1;
  72         dconst_0;
  73         dstore_2;
  74         pop;
  75     L22:    stack_frame_type same;
  76         return;
  77 }
  78 
  79 } // end Class BadMapDstore