1 /*
2 * Copyright (c) 2018, 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 * This test contains a incorrect ldc instruction of a condy whose loadable
26 * constant is a double. VerifyError expected.
27 */
28
29 class CondyBadLDC
30 version 55:0
31 {
32
33
34 public Method "<init>":"()V"
35 stack 1 locals 1
36 {
37 aload_0;
38 invokespecial Method java/lang/Object."<init>":"()V";
39 return;
40 }
41
42 public static Method intConversion:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;I)Ljava/lang/Object;"
43 throws java/lang/Throwable
44 stack 4 locals 6
45 {
46 aload_1;
47 astore 4;
48 iconst_m1;
49 istore 5;
50 aload 4;
51 invokevirtual Method java/lang/String.hashCode:"()I";
52 lookupswitch{ //11
53 -2001159796: L238;
54 -1538095928: L272;
55 -891985903: L255;
56 66: L108;
57 67: L124;
58 68: L140;
59 70: L156;
60 73: L172;
61 74: L188;
62 83: L204;
63 90: L221;
64 default: L286 };
65 L108: stack_frame_type append;
66 locals_map class java/lang/String, int;
67 aload 4;
68 ldc String "B";
69 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
70 ifeq L286;
71 iconst_0;
72 istore 5;
73 goto L286;
74 L124: stack_frame_type same;
75 aload 4;
76 ldc String "C";
77 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
78 ifeq L286;
79 iconst_1;
80 istore 5;
81 goto L286;
82 L140: stack_frame_type same;
83 aload 4;
84 ldc String "D";
85 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
86 ifeq L286;
87 iconst_2;
88 istore 5;
89 goto L286;
90 L156: stack_frame_type same;
91 aload 4;
92 ldc String "F";
93 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
94 ifeq L286;
95 iconst_3;
96 istore 5;
97 goto L286;
98 L172: stack_frame_type same;
99 aload 4;
100 ldc String "I";
101 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
102 ifeq L286;
103 iconst_4;
104 istore 5;
105 goto L286;
106 L188: stack_frame_type same;
107 aload 4;
108 ldc String "J";
109 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
110 ifeq L286;
111 iconst_5;
112 istore 5;
113 goto L286;
114 L204: stack_frame_type same;
115 aload 4;
116 ldc String "S";
117 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
118 ifeq L286;
119 bipush 6;
120 istore 5;
121 goto L286;
122 L221: stack_frame_type same;
123 aload 4;
124 ldc String "Z";
125 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
126 ifeq L286;
127 bipush 7;
128 istore 5;
129 goto L286;
130 L238: stack_frame_type same;
131 aload 4;
132 ldc String "nullRef";
133 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
134 ifeq L286;
135 bipush 8;
136 istore 5;
137 goto L286;
138 L255: stack_frame_type same;
139 aload 4;
140 ldc String "string";
141 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
142 ifeq L286;
143 bipush 9;
144 istore 5;
145 goto L286;
146 L272: stack_frame_type same;
147 aload 4;
148 ldc String "stringArray";
149 invokevirtual Method java/lang/String.equals:"(Ljava/lang/Object;)Z";
150 ifeq L286;
151 bipush 10;
152 istore 5;
153 L286: stack_frame_type same;
154 iload 5;
155 tableswitch{ //0 to 10
156 0: L348;
157 1: L354;
158 2: L360;
159 3: L366;
160 4: L372;
161 5: L377;
162 6: L383;
163 7: L389;
164 8: L402;
165 9: L404;
166 10: L407;
167 default: L422 };
168 L348: stack_frame_type same;
169 iload_3;
170 i2b;
171 invokestatic Method java/lang/Byte.valueOf:"(B)Ljava/lang/Byte;";
172 areturn;
173 L354: stack_frame_type same;
174 iload_3;
175 i2c;
176 invokestatic Method java/lang/Character.valueOf:"(C)Ljava/lang/Character;";
177 areturn;
178 L360: stack_frame_type same;
179 iload_3;
180 i2d;
181 invokestatic Method java/lang/Double.valueOf:"(D)Ljava/lang/Double;";
182 areturn;
183 L366: stack_frame_type same;
184 iload_3;
185 i2f;
186 invokestatic Method java/lang/Float.valueOf:"(F)Ljava/lang/Float;";
187 areturn;
188 L372: stack_frame_type same;
189 iload_3;
190 invokestatic Method java/lang/Integer.valueOf:"(I)Ljava/lang/Integer;";
191 areturn;
192 L377: stack_frame_type same;
193 iload_3;
194 i2l;
195 invokestatic Method java/lang/Long.valueOf:"(J)Ljava/lang/Long;";
196 areturn;
197 L383: stack_frame_type same;
198 iload_3;
199 i2s;
200 invokestatic Method java/lang/Short.valueOf:"(S)Ljava/lang/Short;";
201 areturn;
202 L389: stack_frame_type same;
203 iload_3;
204 ifle L397;
205 iconst_1;
206 goto L398;
207 L397: stack_frame_type same;
208 iconst_0;
209 L398: stack_frame_type stack1;
210 stack_map int;
211 invokestatic Method java/lang/Boolean.valueOf:"(Z)Ljava/lang/Boolean;";
212 areturn;
213 L402: stack_frame_type same;
214 aconst_null;
215 areturn;
216 L404: stack_frame_type same;
217 ldc String "string";
218 areturn;
219 L407: stack_frame_type same;
220 iconst_2;
221 anewarray class java/lang/String;
222 dup;
223 iconst_0;
224 ldc String "string";
225 aastore;
226 dup;
227 iconst_1;
228 ldc String "string";
229 aastore;
230 areturn;
231 L422: stack_frame_type same;
232 new class java/lang/BootstrapMethodError;
233 dup;
234 ldc String "Failure to generate a dynamic constant";
235 invokespecial Method java/lang/BootstrapMethodError."<init>":"(Ljava/lang/String;)V";
236 athrow;
237 }
238
239 public static Method D:"()D"
240 stack 2 locals 0
241 {
242 // ldc of a double will yield a VerifyError, should be an ldc2_w instruction
243 ldc Dynamic REF_invokeStatic:CondyBadLDC.intConversion:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;I)Ljava/lang/Object;":D:"D" int 2147483647;
244 dreturn;
245 }
246
247 public static Method main:"([Ljava/lang/String;)V"
248 stack 2 locals 1
249 {
250 invokestatic Method D:"()D";
251 return;
252 }
253
254 } // end Class CondyBadLDC