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
29class CondyBadLDC
30	version 55:0
31{
32
33
34public Method "<init>":"()V"
35	stack 1 locals 1
36{
37		aload_0;
38		invokespecial	Method java/lang/Object."<init>":"()V";
39		return;
40}
41
42public 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
239public 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
247public 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
255