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 CONSTANT_InvokeDynamic_info structure whose bootstrap_method_attr_index
 26  * points to a BSM for an CONSTANT_Dynamic.  Both the condy & indy point at element 0 in the
 27  * bootstrap methods array.  BootstrapMethodError expected.
 28  */
 29 
 30 /*
 31 class IndyUsesCondyBSM {
 32     IndyUsesCondyBSM() { }
 33     public static Object Condybsm(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.Class) {
 34         System.out.println("In Condybsm");
 35         return String(0);
 36     }
 37     public static int foo() {
 38         System.out.println("In Indybsm target CallSite method foo");
 39         return 100;
 40     }
 41     public static MethodHandle MH_foo() {
 42         // Constructs a MethodHandle for foo
 43         Lookup lookup = MethodHandles.lookup();
 44         MethodType mt = MethodType.methodType(int.class);
 45         return lookup.findStatic(IndyUsesCondyBSM.class, "foo", mt);
 46     }
 47     public static CallSite Indybsm(java.lang.invoke.MethodHandles$Lookup, java.lang.String, java.lang.invoke.MethodType) {
 48         return new CallSite(IndyUsesCondyBSM.MH_foo());
 49     }
 50     public static int m() {
 51         // ldc_w dynamic where the BSM = slot #0 in the BootstrapMethods array is IndyUsesCondyBSM.Condybsm() -> succeeds
 52         // invokedynamic where the BSM = slot #0 in the BootstrapMethods array is IndyUsesCondyBSM.Condybsm()  -> receives a BootstrapMethodError 
 53         return Callsite.foo();
 54     }
 55     public static void main(String[] args) {
 56         IndyUsesCondyBSM.m();
 57         return;
 58    }
 59 
 60 BootstrapMethods:
 61   0: #65 REF_invokeStatic IndyUsesCondyBSM.Condybsm:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
 62     Method arguments:
 63   1: #74 REF_invokeStatic IndyUsesCondyBSM.Indybsm:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
 64     Method arguments:
 65 }
 66 */
 67 
 68 class IndyUsesCondyBSM {
 69   0xCAFEBABE;
 70   0; // minor version
 71   55; // version
 72   [88] { // Constant Pool
 73     ; // first element is empty
 74     String #48; // #1     at 0x0A
 75     String #49; // #2     at 0x0D
 76     String #56; // #3     at 0x10
 77     String #58; // #4     at 0x13
 78     class #51; // #5     at 0x16
 79     Method #62 #20; // #6     at 0x19
 80     InvokeDynamic 0s #53; // #7     at 0x1E
 81     Method #5 #71; // #8     at 0x23
 82     Method #26 #47; // #9     at 0x28
 83     Field #21 #86; // #10     at 0x2D
 84     Method #28 #75; // #11     at 0x32
 85     Field #61 #82; // #12     at 0x37
 86     Method #18 #36; // #13     at 0x3C
 87     Method #29 #46; // #14     at 0x41
 88     Method #57 #87; // #15     at 0x46
 89     Method #5 #73; // #16     at 0x4B
 90     Dynamic 0s #23; // #17     at 0x50
 91     class #80; // #18     at 0x55
 92     Utf8 "java/io/PrintStream"; // #19     at 0x58
 93     NameAndType #81 #59; // #20     at 0x6E
 94     class #85; // #21     at 0x73
 95     Utf8 "java/lang/invoke/MethodType"; // #22     at 0x76
 96     NameAndType #31 #77; // #23     at 0x94
 97     Utf8 "m"; // #24     at 0x99
 98     Utf8 "java/lang/invoke/MethodHandles$Lookup"; // #25     at 0x9D
 99     class #19; // #26     at 0xC5
100     Utf8 "SourceFile"; // #27     at 0xC8
101     class #22; // #28     at 0xD5
102     class #25; // #29     at 0xD8
103     Utf8 "IndyUsesCondyBSM.jasm"; // #30     at 0xDB
104     Utf8 "name"; // #31     at 0xF3
105     Utf8 "Indybsm"; // #32     at 0xFA
106     Utf8 "findStatic"; // #33     at 0x0104
107     Utf8 "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;"; // #34     at 0x0111
108     Utf8 "()Ljava/lang/invoke/MethodHandles$Lookup;"; // #35     at 0x0172
109     NameAndType #81 #66; // #36     at 0x019E
110     Utf8 "MH_foo"; // #37     at 0x01A3
111     Method #5 #84; // #38     at 0x01AC
112     Utf8 "Code"; // #39     at 0x01B1
113     Utf8 "lookup"; // #40     at 0x01B8
114     Utf8 "([Ljava/lang/String;)V"; // #41     at 0x01C1
115     Utf8 "out"; // #42     at 0x01DA
116     Utf8 "BootstrapMethods"; // #43     at 0x01E0
117     Utf8 "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"; // #44     at 0x01F3
118     Utf8 "Ljava/lang/Class;"; // #45     at 0x0257
119     NameAndType #33 #44; // #46     at 0x026B
120     NameAndType #52 #63; // #47     at 0x0270
121     Utf8 "0"; // #48     at 0x0275
122     Utf8 "In Condybsm"; // #49     at 0x0279
123     Utf8 "java/lang/invoke/MethodHandles"; // #50     at 0x0287
124     Utf8 "IndyUsesCondyBSM"; // #51     at 0x02A8
125     Utf8 "println"; // #52     at 0x02BB
126     NameAndType #58 #67; // #53     at 0x02C5
127     Utf8 "java/lang/Object"; // #54     at 0x02CA
128     Utf8 "java/lang/System"; // #55     at 0x02DD
129     Utf8 "In Indybsm target CallSite method foo"; // #56     at 0x02F0
130     class #50; // #57     at 0x0318
131     Utf8 "foo"; // #58     at 0x031B
132     Utf8 "()V"; // #59     at 0x0321
133     Utf8 "()Ljava/lang/invoke/MethodHandle;"; // #60     at 0x0327
134     class #55; // #61     at 0x034B
135     class #54; // #62     at 0x034E
136     Utf8 "(Ljava/lang/String;)V"; // #63     at 0x0351
137     Utf8 "main"; // #64     at 0x0369
138     MethodHandle 6b #79; // #65     at 0x0370
139     Utf8 "(Ljava/lang/invoke/MethodHandle;)V"; // #66     at 0x0374
140     Utf8 "()I"; // #67     at 0x0399
141     Utf8 "(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"; // #68     at 0x039F
142     Utf8 "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"; // #69     at 0x03D2
143     Utf8 "Condybsm"; // #70     at 0x0448
144     NameAndType #37 #60; // #71     at 0x0453
145     NameAndType #70 #34; // #72     at 0x0458
146     NameAndType #24 #67; // #73     at 0x045D
147     MethodHandle 6b #38; // #74     at 0x0462
148     NameAndType #78 #68; // #75     at 0x0466
149     Utf8 "Ljava/io/PrintStream;"; // #76     at 0x046B
150     Utf8 "Ljava/lang/Object;"; // #77     at 0x0483
151     Utf8 "methodType"; // #78     at 0x0498
152     Method #5 #72; // #79     at 0x04A5
153     Utf8 "java/lang/invoke/ConstantCallSite"; // #80     at 0x04AA
154     Utf8 "<init>"; // #81     at 0x04CE
155     NameAndType #42 #76; // #82     at 0x04D7
156     Utf8 "TYPE"; // #83     at 0x04DC
157     NameAndType #32 #69; // #84     at 0x04E3
158     Utf8 "java/lang/Integer"; // #85     at 0x04E8
159     NameAndType #83 #45; // #86     at 0x04FC
160     NameAndType #40 #35; // #87     at 0x0501
161   } // Constant Pool
162 
163   0x0000; // access [ ]
164   #5;// this_cpx
165   #62;// super_cpx
166 
167   [0] { // Interfaces
168   } // Interfaces
169 
170   [0] { // fields
171   } // fields
172 
173   [7] { // methods
174     { // Member at 0x0512
175       0x0001; // access
176       #81; // name_cpx
177       #59; // sig_cpx
178       [1] { // Attributes
179         Attr(#39, 17) { // Code at 0x051A
180           1; // max_stack
181           1; // max_locals
182           Bytes[5]{
183             0x2AB70006B1;
184           }
185           [0] { // Traps
186           } // end Traps
187           [0] { // Attributes
188           } // Attributes
189         } // end Code
190       } // Attributes
191     } // Member
192     ;
193     { // Member at 0x0531
194       0x0009; // access
195       #70; // name_cpx
196       #34; // sig_cpx
197       [1] { // Attributes
198         Attr(#39, 23) { // Code at 0x0539
199           2; // max_stack
200           3; // max_locals
201           Bytes[11]{
202             0xB2000C1202B60009;
203             0x1201B0;
204           }
205           [0] { // Traps
206           } // end Traps
207           [0] { // Attributes
208           } // Attributes
209         } // end Code
210       } // Attributes
211     } // Member
212     ;
213     { // Member at 0x0556
214       0x0009; // access
215       #58; // name_cpx
216       #67; // sig_cpx
217       [1] { // Attributes
218         Attr(#39, 23) { // Code at 0x055E
219           2; // max_stack
220           0; // max_locals
221           Bytes[11]{
222             0xB2000C1203B60009;
223             0x1064AC;
224           }
225           [0] { // Traps
226           } // end Traps
227           [0] { // Attributes
228           } // Attributes
229         } // end Code
230       } // Attributes
231     } // Member
232     ;
233     { // Member at 0x057B
234       0x0009; // access
235       #37; // name_cpx
236       #60; // sig_cpx
237       [1] { // Attributes
238         Attr(#39, 29) { // Code at 0x0583
239           4; // max_stack
240           0; // max_locals
241           Bytes[17]{
242             0xB8000F12051204B2;
243             0x000AB8000BB6000E;
244             0xB0;
245           }
246           [0] { // Traps
247           } // end Traps
248           [0] { // Attributes
249           } // Attributes
250         } // end Code
251       } // Attributes
252     } // Member
253     ;
254     { // Member at 0x05A6
255       0x0009; // access
256       #32; // name_cpx
257       #69; // sig_cpx
258       [1] { // Attributes
259         Attr(#39, 23) { // Code at 0x05AE
260           3; // max_stack
261           3; // max_locals
262           Bytes[11]{
263             0xBB001259B80008B7;
264             0x000DB0;
265           }
266           [0] { // Traps
267           } // end Traps
268           [0] { // Attributes
269           } // Attributes
270         } // end Code
271       } // Attributes
272     } // Member
273     ;
274     { // Member at 0x05CB
275       0x0009; // access
276       #24; // name_cpx
277       #67; // sig_cpx
278       [1] { // Attributes
279         Attr(#39, 21) { // Code at 0x05D3
280           2; // max_stack
281           0; // max_locals
282           Bytes[9]{
283             0x130011BA00070000;
284             0xAC;
285           }
286           [0] { // Traps
287           } // end Traps
288           [0] { // Attributes
289           } // Attributes
290         } // end Code
291       } // Attributes
292     } // Member
293     ;
294     { // Member at 0x05EE
295       0x0009; // access
296       #64; // name_cpx
297       #41; // sig_cpx
298       [1] { // Attributes
299         Attr(#39, 16) { // Code at 0x05F6
300           1; // max_stack
301           1; // max_locals
302           Bytes[4]{
303             0xB80010B1;
304           }
305           [0] { // Traps
306           } // end Traps
307           [0] { // Attributes
308           } // Attributes
309         } // end Code
310       } // Attributes
311     } // Member
312   } // methods
313 
314   [2] { // Attributes
315     Attr(#27, 2) { // SourceFile at 0x060E
316       #30;
317     } // end SourceFile
318     ;
319     Attr(#43, 10) { // BootstrapMethods at 0x0616
320       [2] { // bootstrap_methods
321         {  //  bootstrap_method
322           #65; // bootstrap_method_ref
323           [0] { // bootstrap_arguments
324           }  //  bootstrap_arguments
325         }  //  bootstrap_method
326         ;
327         {  //  bootstrap_method
328           #74; // bootstrap_method_ref
329           [0] { // bootstrap_arguments
330           }  //  bootstrap_arguments
331         }  //  bootstrap_method
332       }
333     } // end BootstrapMethods
334   } // Attributes
335 } // end class IndyUsesCondyBSM