2362N/A# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. 0N/A# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A# This code is free software; you can redistribute it and/or modify it 0N/A# under the terms of the GNU General Public License version 2 only, as 0N/A# published by the Free Software Foundation. 0N/A# This code is distributed in the hope that it will be useful, but WITHOUT 0N/A# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A# version 2 for more details (a copy is included in the LICENSE file that 0N/A# accompanied this code). 0N/A# You should have received a copy of the GNU General Public License version 0N/A# 2 along with this work; if not, write to the Free Software Foundation, 0N/A# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2362N/A# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 0N/A# @summary Redefine a class so that the order of external classes in 0N/A# the constant pool are changed. 0N/A# Would like to run this test with this option: 0N/A# -XX:-FailOverToOldVerifier 0N/A# Uncomment this to see the JDI trace 0N/A#jdbOptions=-dbgtrace 0N/Aimport java.lang.annotation.Retention; 0N/Aimport java.lang.annotation.RetentionPolicy; 0N/A public static void main(String[] args) { 0N/A new $1().hi(true); // @1 breakpoint 0N/A public void hi(boolean expected) { 0N/A boolean isNewVersion = false; // @1 commentout 0N/A // @1 uncomment boolean isNewVersion = true; 0N/A if (expected == isNewVersion) { 0N/A System.out.println("PASS: expected and isNewVersion match."); 0N/A System.out.println("FAIL: expected and isNewVersion do not match."); 0N/A System.out.println("expected=" + expected 0N/A + " isNewVersion=" + isNewVersion); 0N/A Foo1 foo1 = new Foo1(); // @1 commentout 0N/A foo1.hi(); // @1 commentout 0N/A // This Hack code block exists to force some verification_type_info 0N/A // objects of subtype Object_variable_info into the StackMapTable. 0N/A // In the redefined code, the above Foo1 code is effectively 0N/A // moved after the Foo2 code below which causes things to be 0N/A // layed out in a different order in the constant pool. The 0N/A // cpool_index in the Object_variable_info has to be updated 0N/A // in the redefined code's StackMapTable to refer to right 0N/A /// constant pool index in the merged constant pool. 0N/A Hack hack = getClass().getAnnotation(Hack.class); 0N/A String class_annotation = hack.value(); 0N/A System.out.println("class annotation is: " + class_annotation); 0N/A if (class_annotation.equals("JUNK")) { 0N/A System.out.println("class_annotation is JUNK."); 0N/A System.out.println("class_annotation is NOT JUNK."); 0N/A Foo2 foo2 = new Foo2(); 0N/A // @1 uncomment Foo1 foo1 = new Foo1(); 0N/A // @1 uncomment foo1.hi(); 0N/A System.out.println("Hello from " + getClass()); 0N/A System.out.println("Hello from " + getClass()); 0N/A@Retention(RetentionPolicy.RUNTIME) 0N/A# This is called to feed cmds to jdb. 0N/A# You could replace this next line with the contents