Mercurial > hg > truffle
annotate src/share/vm/prims/methodHandles.hpp @ 3762:5c0a3c1858b1
7048782: CMS: assert(last_chunk_index_to_check<= last_chunk_index) failed: parCardTableModRefBS.cpp:359
Summary: The LNC array is sized before the start of a scavenge, while the heap may expand during a scavenge. With CMS, the last block of an arbitrary suffice of the LNC array may expand due to coalition with the expansion delta. We now take care not to attempt access past the end of the LNC array. LNC array code will be cleaned up and suitably encapsulated as part of the forthcoming performance RFE 7043675.
Reviewed-by: brutisso
author | ysr |
---|---|
date | Thu, 02 Jun 2011 10:23:36 -0700 |
parents | 33ae33516634 |
children | ba550512d3b2 |
rev | line source |
---|---|
710 | 1 /* |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. |
710 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
21 * questions. |
710 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_PRIMS_METHODHANDLES_HPP |
26 #define SHARE_VM_PRIMS_METHODHANDLES_HPP | |
27 | |
28 #include "classfile/javaClasses.hpp" | |
29 #include "classfile/vmSymbols.hpp" | |
30 #include "runtime/frame.inline.hpp" | |
31 #include "runtime/globals.hpp" | |
32 #include "runtime/interfaceSupport.hpp" | |
33 | |
710 | 34 class MacroAssembler; |
35 class Label; | |
36 class MethodHandleEntry; | |
37 | |
38 class MethodHandles: AllStatic { | |
39 // JVM support for MethodHandle, MethodType, and related types | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
40 // in java.lang.invoke and sun.invoke. |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
41 // See also javaClasses for layouts java_lang_invoke_Method{Handle,Type,Type::Form}. |
710 | 42 public: |
43 enum EntryKind { | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
44 _raise_exception, // stub for error generation from other stubs |
710 | 45 _invokestatic_mh, // how a MH emulates invokestatic |
46 _invokespecial_mh, // ditto for the other invokes... | |
47 _invokevirtual_mh, | |
48 _invokeinterface_mh, | |
49 _bound_ref_mh, // reference argument is bound | |
50 _bound_int_mh, // int argument is bound (via an Integer or Float) | |
51 _bound_long_mh, // long argument is bound (via a Long or Double) | |
52 _bound_ref_direct_mh, // same as above, with direct linkage to methodOop | |
53 _bound_int_direct_mh, | |
54 _bound_long_direct_mh, | |
55 | |
56 _adapter_mh_first, // adapter sequence goes here... | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
57 _adapter_retype_only = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
58 _adapter_retype_raw = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
59 _adapter_check_cast = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
60 _adapter_prim_to_prim = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
61 _adapter_ref_to_prim = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
62 _adapter_prim_to_ref = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
63 _adapter_swap_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
64 _adapter_rot_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
65 _adapter_dup_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
66 _adapter_drop_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
67 _adapter_collect_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
68 _adapter_spread_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS, |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
69 _adapter_fold_args = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::OP_FOLD_ARGS, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
70 _adapter_unused_13 = _adapter_mh_first + 13, //hole in the CONV_OP enumeration |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
71 _adapter_mh_last = _adapter_mh_first + java_lang_invoke_AdapterMethodHandle::CONV_OP_LIMIT - 1, |
710 | 72 |
73 // Optimized adapter types | |
74 | |
75 // argument list reordering | |
76 _adapter_opt_swap_1, | |
77 _adapter_opt_swap_2, | |
78 _adapter_opt_rot_1_up, | |
79 _adapter_opt_rot_1_down, | |
80 _adapter_opt_rot_2_up, | |
81 _adapter_opt_rot_2_down, | |
82 // primitive single to single: | |
83 _adapter_opt_i2i, // i2c, i2z, i2b, i2s | |
84 // primitive double to single: | |
85 _adapter_opt_l2i, | |
86 _adapter_opt_d2f, | |
87 // primitive single to double: | |
88 _adapter_opt_i2l, | |
89 _adapter_opt_f2d, | |
90 // conversion between floating point and integer type is handled by Java | |
91 | |
92 // reference to primitive: | |
93 _adapter_opt_unboxi, | |
94 _adapter_opt_unboxl, | |
95 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
96 // %% Maybe tame the following with a VM_SYMBOLS_DO type macro? |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
97 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
98 // how a blocking adapter returns (platform-dependent) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
99 _adapter_opt_return_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
100 _adapter_opt_return_int, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
101 _adapter_opt_return_long, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
102 _adapter_opt_return_float, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
103 _adapter_opt_return_double, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
104 _adapter_opt_return_void, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
105 _adapter_opt_return_S0_ref, // return ref to S=0 (last slot) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
106 _adapter_opt_return_S1_ref, // return ref to S=1 (2nd-to-last slot) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
107 _adapter_opt_return_S2_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
108 _adapter_opt_return_S3_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
109 _adapter_opt_return_S4_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
110 _adapter_opt_return_S5_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
111 _adapter_opt_return_any, // dynamically select r/i/l/f/d |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
112 _adapter_opt_return_FIRST = _adapter_opt_return_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
113 _adapter_opt_return_LAST = _adapter_opt_return_any, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
114 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
115 // spreading (array length cases 0, 1, ...) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
116 _adapter_opt_spread_0, // spread empty array to N=0 arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
117 _adapter_opt_spread_1_ref, // spread Object[] to N=1 argument |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
118 _adapter_opt_spread_2_ref, // spread Object[] to N=2 arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
119 _adapter_opt_spread_3_ref, // spread Object[] to N=3 arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
120 _adapter_opt_spread_4_ref, // spread Object[] to N=4 arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
121 _adapter_opt_spread_5_ref, // spread Object[] to N=5 arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
122 _adapter_opt_spread_ref, // spread Object[] to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
123 _adapter_opt_spread_byte, // spread byte[] or boolean[] to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
124 _adapter_opt_spread_char, // spread char[], etc., to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
125 _adapter_opt_spread_short, // spread short[], etc., to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
126 _adapter_opt_spread_int, // spread int[], short[], etc., to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
127 _adapter_opt_spread_long, // spread long[] to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
128 _adapter_opt_spread_float, // spread float[] to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
129 _adapter_opt_spread_double, // spread double[] to N arguments |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
130 _adapter_opt_spread_FIRST = _adapter_opt_spread_0, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
131 _adapter_opt_spread_LAST = _adapter_opt_spread_double, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
132 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
133 // blocking filter/collect conversions |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
134 // These collect N arguments and replace them (at slot S) by a return value |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
135 // which is passed to the final target, along with the unaffected arguments. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
136 // collect_{N}_{T} collects N arguments at any position into a T value |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
137 // collect_{N}_S{S}_{T} collects N arguments at slot S into a T value |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
138 // collect_{T} collects any number of arguments at any position |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
139 // filter_S{S}_{T} is the same as collect_1_S{S}_{T} (a unary collection) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
140 // (collect_2 is also usable as a filter, with long or double arguments) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
141 _adapter_opt_collect_ref, // combine N arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
142 _adapter_opt_collect_int, // combine N arguments, replace with an int, short, etc. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
143 _adapter_opt_collect_long, // combine N arguments, replace with a long |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
144 _adapter_opt_collect_float, // combine N arguments, replace with a float |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
145 _adapter_opt_collect_double, // combine N arguments, replace with a double |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
146 _adapter_opt_collect_void, // combine N arguments, replace with nothing |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
147 // if there is a small fixed number to push, do so without a loop: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
148 _adapter_opt_collect_0_ref, // collect N=0 arguments, insert a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
149 _adapter_opt_collect_1_ref, // collect N=1 argument, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
150 _adapter_opt_collect_2_ref, // combine N=2 arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
151 _adapter_opt_collect_3_ref, // combine N=3 arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
152 _adapter_opt_collect_4_ref, // combine N=4 arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
153 _adapter_opt_collect_5_ref, // combine N=5 arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
154 // filters are an important special case because they never move arguments: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
155 _adapter_opt_filter_S0_ref, // filter N=1 argument at S=0, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
156 _adapter_opt_filter_S1_ref, // filter N=1 argument at S=1, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
157 _adapter_opt_filter_S2_ref, // filter N=1 argument at S=2, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
158 _adapter_opt_filter_S3_ref, // filter N=1 argument at S=3, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
159 _adapter_opt_filter_S4_ref, // filter N=1 argument at S=4, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
160 _adapter_opt_filter_S5_ref, // filter N=1 argument at S=5, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
161 // these move arguments, but they are important for boxing |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
162 _adapter_opt_collect_2_S0_ref, // combine last N=2 arguments, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
163 _adapter_opt_collect_2_S1_ref, // combine N=2 arguments at S=1, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
164 _adapter_opt_collect_2_S2_ref, // combine N=2 arguments at S=2, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
165 _adapter_opt_collect_2_S3_ref, // combine N=2 arguments at S=3, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
166 _adapter_opt_collect_2_S4_ref, // combine N=2 arguments at S=4, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
167 _adapter_opt_collect_2_S5_ref, // combine N=2 arguments at S=5, replace with a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
168 _adapter_opt_collect_FIRST = _adapter_opt_collect_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
169 _adapter_opt_collect_LAST = _adapter_opt_collect_2_S5_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
170 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
171 // blocking folding conversions |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
172 // these are like collects, but retain all the N arguments for the final target |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
173 //_adapter_opt_fold_0_ref, // same as _adapter_opt_collect_0_ref |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
174 // fold_{N}_{T} processes N arguments at any position into a T value, which it inserts |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
175 // fold_{T} processes any number of arguments at any position |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
176 _adapter_opt_fold_ref, // process N arguments, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
177 _adapter_opt_fold_int, // process N arguments, prepend an int, short, etc. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
178 _adapter_opt_fold_long, // process N arguments, prepend a long |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
179 _adapter_opt_fold_float, // process N arguments, prepend a float |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
180 _adapter_opt_fold_double, // process N arguments, prepend a double |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
181 _adapter_opt_fold_void, // process N arguments, but leave the list unchanged |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
182 _adapter_opt_fold_1_ref, // process N=1 argument, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
183 _adapter_opt_fold_2_ref, // process N=2 arguments, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
184 _adapter_opt_fold_3_ref, // process N=3 arguments, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
185 _adapter_opt_fold_4_ref, // process N=4 arguments, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
186 _adapter_opt_fold_5_ref, // process N=5 arguments, prepend a reference |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
187 _adapter_opt_fold_FIRST = _adapter_opt_fold_ref, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
188 _adapter_opt_fold_LAST = _adapter_opt_fold_5_ref, |
710 | 189 |
190 _EK_LIMIT, | |
191 _EK_FIRST = 0 | |
192 }; | |
193 | |
194 public: | |
195 static bool enabled() { return _enabled; } | |
196 static void set_enabled(bool z); | |
197 | |
198 private: | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
199 enum { // import java_lang_invoke_AdapterMethodHandle::CONV_OP_* |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
200 CONV_OP_LIMIT = java_lang_invoke_AdapterMethodHandle::CONV_OP_LIMIT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
201 CONV_OP_MASK = java_lang_invoke_AdapterMethodHandle::CONV_OP_MASK, |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
202 CONV_TYPE_MASK = java_lang_invoke_AdapterMethodHandle::CONV_TYPE_MASK, |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
203 CONV_VMINFO_MASK = java_lang_invoke_AdapterMethodHandle::CONV_VMINFO_MASK, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
204 CONV_VMINFO_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_VMINFO_SHIFT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
205 CONV_OP_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_OP_SHIFT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
206 CONV_DEST_TYPE_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_DEST_TYPE_SHIFT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
207 CONV_SRC_TYPE_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_SRC_TYPE_SHIFT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
208 CONV_STACK_MOVE_SHIFT = java_lang_invoke_AdapterMethodHandle::CONV_STACK_MOVE_SHIFT, |
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
209 CONV_STACK_MOVE_MASK = java_lang_invoke_AdapterMethodHandle::CONV_STACK_MOVE_MASK |
710 | 210 }; |
211 | |
212 static bool _enabled; | |
213 static MethodHandleEntry* _entries[_EK_LIMIT]; | |
214 static const char* _entry_names[_EK_LIMIT+1]; | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
215 static jobject _raise_exception_method; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
216 static address _adapter_return_handlers[CONV_TYPE_MASK+1]; |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
217 |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
218 // Adapters. |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
219 static MethodHandlesAdapterBlob* _adapter_code; |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
220 static int _adapter_code_size; |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
221 |
710 | 222 static bool ek_valid(EntryKind ek) { return (uint)ek < (uint)_EK_LIMIT; } |
223 static bool conv_op_valid(int op) { return (uint)op < (uint)CONV_OP_LIMIT; } | |
224 | |
225 public: | |
226 static bool have_entry(EntryKind ek) { return ek_valid(ek) && _entries[ek] != NULL; } | |
227 static MethodHandleEntry* entry(EntryKind ek) { assert(ek_valid(ek), "initialized"); | |
228 return _entries[ek]; } | |
229 static const char* entry_name(EntryKind ek) { assert(ek_valid(ek), "oob"); | |
230 return _entry_names[ek]; } | |
231 static EntryKind adapter_entry_kind(int op) { assert(conv_op_valid(op), "oob"); | |
232 return EntryKind(_adapter_mh_first + op); } | |
233 | |
234 static void init_entry(EntryKind ek, MethodHandleEntry* me) { | |
235 assert(ek_valid(ek), "oob"); | |
236 assert(_entries[ek] == NULL, "no double initialization"); | |
237 _entries[ek] = me; | |
238 } | |
239 | |
1304 | 240 // Some adapter helper functions. |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
241 static EntryKind ek_original_kind(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
242 if (ek <= _adapter_mh_last) return ek; |
1304 | 243 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
244 case _adapter_opt_swap_1: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
245 case _adapter_opt_swap_2: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
246 return _adapter_swap_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
247 case _adapter_opt_rot_1_up: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
248 case _adapter_opt_rot_1_down: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
249 case _adapter_opt_rot_2_up: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
250 case _adapter_opt_rot_2_down: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
251 return _adapter_rot_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
252 case _adapter_opt_i2i: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
253 case _adapter_opt_l2i: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
254 case _adapter_opt_d2f: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
255 case _adapter_opt_i2l: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
256 case _adapter_opt_f2d: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
257 return _adapter_prim_to_prim; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
258 case _adapter_opt_unboxi: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
259 case _adapter_opt_unboxl: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
260 return _adapter_ref_to_prim; |
1304 | 261 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
262 if (ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
263 return _adapter_spread_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
264 if (ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
265 return _adapter_collect_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
266 if (ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
267 return _adapter_fold_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
268 if (ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
269 return _adapter_opt_return_any; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
270 assert(false, "oob"); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
271 return _EK_LIMIT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
272 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
273 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
274 static bool ek_supported(MethodHandles::EntryKind ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
275 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
276 static BasicType ek_bound_mh_arg_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
277 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
278 case _bound_int_mh : // fall-thru |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
279 case _bound_int_direct_mh : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
280 case _bound_long_mh : // fall-thru |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
281 case _bound_long_direct_mh : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
282 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
283 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
284 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
285 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
286 static int ek_adapter_opt_swap_slots(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
287 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
288 case _adapter_opt_swap_1 : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
289 case _adapter_opt_swap_2 : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
290 case _adapter_opt_rot_1_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
291 case _adapter_opt_rot_1_down : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
292 case _adapter_opt_rot_2_up : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
293 case _adapter_opt_rot_2_down : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
294 default : ShouldNotReachHere(); return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
295 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
296 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
297 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
298 static int ek_adapter_opt_swap_mode(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
299 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
300 case _adapter_opt_swap_1 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
301 case _adapter_opt_swap_2 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
302 case _adapter_opt_rot_1_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
303 case _adapter_opt_rot_1_down : return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
304 case _adapter_opt_rot_2_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
305 case _adapter_opt_rot_2_down : return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
306 default : ShouldNotReachHere(); return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
307 } |
1304 | 308 } |
309 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
310 static int ek_adapter_opt_collect_count(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
311 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
312 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
1304 | 313 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
314 case _adapter_opt_collect_0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
315 case _adapter_opt_filter_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
316 case _adapter_opt_filter_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
317 case _adapter_opt_filter_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
318 case _adapter_opt_filter_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
319 case _adapter_opt_filter_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
320 case _adapter_opt_filter_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
321 case _adapter_opt_fold_1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
322 case _adapter_opt_collect_1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
323 case _adapter_opt_collect_2_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
324 case _adapter_opt_collect_2_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
325 case _adapter_opt_collect_2_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
326 case _adapter_opt_collect_2_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
327 case _adapter_opt_collect_2_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
328 case _adapter_opt_collect_2_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
329 case _adapter_opt_fold_2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
330 case _adapter_opt_collect_2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
331 case _adapter_opt_fold_3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
332 case _adapter_opt_collect_3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
333 case _adapter_opt_fold_4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
334 case _adapter_opt_collect_4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
335 case _adapter_opt_fold_5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
336 case _adapter_opt_collect_5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
337 default : return -1; // sentinel value for "variable" |
1304 | 338 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
339 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
340 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
341 static int ek_adapter_opt_collect_slot(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
342 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
343 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
344 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
345 case _adapter_opt_collect_2_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
346 case _adapter_opt_filter_S0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
347 case _adapter_opt_collect_2_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
348 case _adapter_opt_filter_S1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
349 case _adapter_opt_collect_2_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
350 case _adapter_opt_filter_S2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
351 case _adapter_opt_collect_2_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
352 case _adapter_opt_filter_S3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
353 case _adapter_opt_collect_2_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
354 case _adapter_opt_filter_S4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
355 case _adapter_opt_collect_2_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
356 case _adapter_opt_filter_S5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
357 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
358 } |
1304 | 359 } |
360 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
361 static BasicType ek_adapter_opt_collect_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
362 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
363 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
364 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
365 case _adapter_opt_fold_int : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
366 case _adapter_opt_collect_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
367 case _adapter_opt_fold_long : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
368 case _adapter_opt_collect_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
369 case _adapter_opt_fold_float : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
370 case _adapter_opt_collect_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
371 case _adapter_opt_fold_double : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
372 case _adapter_opt_collect_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
373 case _adapter_opt_fold_void : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
374 case _adapter_opt_collect_void : return T_VOID; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
375 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
376 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
377 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
378 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
379 static int ek_adapter_opt_return_slot(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
380 assert(ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
381 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
382 case _adapter_opt_return_S0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
383 case _adapter_opt_return_S1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
384 case _adapter_opt_return_S2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
385 case _adapter_opt_return_S3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
386 case _adapter_opt_return_S4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
387 case _adapter_opt_return_S5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
388 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
389 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
390 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
391 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
392 static BasicType ek_adapter_opt_return_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
393 assert(ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST, ""); |
1304 | 394 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
395 case _adapter_opt_return_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
396 case _adapter_opt_return_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
397 case _adapter_opt_return_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
398 case _adapter_opt_return_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
399 case _adapter_opt_return_void : return T_VOID; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
400 case _adapter_opt_return_any : return T_CONFLICT; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
401 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
402 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
403 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
404 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
405 static int ek_adapter_opt_spread_count(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
406 assert(ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
407 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
408 case _adapter_opt_spread_0 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
409 case _adapter_opt_spread_1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
410 case _adapter_opt_spread_2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
411 case _adapter_opt_spread_3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
412 case _adapter_opt_spread_4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
413 case _adapter_opt_spread_5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
414 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
415 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
416 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
417 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
418 static BasicType ek_adapter_opt_spread_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
419 assert(ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
420 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
421 // (there is no _adapter_opt_spread_boolean; we use byte) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
422 case _adapter_opt_spread_byte : return T_BYTE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
423 case _adapter_opt_spread_char : return T_CHAR; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
424 case _adapter_opt_spread_short : return T_SHORT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
425 case _adapter_opt_spread_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
426 case _adapter_opt_spread_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
427 case _adapter_opt_spread_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
428 case _adapter_opt_spread_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
429 default : return T_OBJECT; |
1304 | 430 } |
431 } | |
432 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
433 static methodOop raise_exception_method() { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
434 oop rem = JNIHandles::resolve(_raise_exception_method); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
435 assert(rem == NULL || rem->is_method(), ""); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
436 return (methodOop) rem; |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
437 } |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
438 static void set_raise_exception_method(methodOop rem) { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
439 assert(_raise_exception_method == NULL, ""); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
440 _raise_exception_method = JNIHandles::make_global(Handle(rem)); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
441 } |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
442 |
710 | 443 static jint adapter_conversion(int conv_op, BasicType src, BasicType dest, |
444 int stack_move = 0, int vminfo = 0) { | |
445 assert(conv_op_valid(conv_op), "oob"); | |
446 jint conv = ((conv_op << CONV_OP_SHIFT) | |
447 | (src << CONV_SRC_TYPE_SHIFT) | |
448 | (dest << CONV_DEST_TYPE_SHIFT) | |
449 | (stack_move << CONV_STACK_MOVE_SHIFT) | |
450 | (vminfo << CONV_VMINFO_SHIFT) | |
451 ); | |
452 assert(adapter_conversion_op(conv) == conv_op, "decode conv_op"); | |
453 assert(adapter_conversion_src_type(conv) == src, "decode src"); | |
454 assert(adapter_conversion_dest_type(conv) == dest, "decode dest"); | |
455 assert(adapter_conversion_stack_move(conv) == stack_move, "decode stack_move"); | |
456 assert(adapter_conversion_vminfo(conv) == vminfo, "decode vminfo"); | |
457 return conv; | |
458 } | |
459 static int adapter_conversion_op(jint conv) { | |
460 return ((conv >> CONV_OP_SHIFT) & 0xF); | |
461 } | |
462 static BasicType adapter_conversion_src_type(jint conv) { | |
463 return (BasicType)((conv >> CONV_SRC_TYPE_SHIFT) & 0xF); | |
464 } | |
465 static BasicType adapter_conversion_dest_type(jint conv) { | |
466 return (BasicType)((conv >> CONV_DEST_TYPE_SHIFT) & 0xF); | |
467 } | |
468 static int adapter_conversion_stack_move(jint conv) { | |
469 return (conv >> CONV_STACK_MOVE_SHIFT); | |
470 } | |
471 static int adapter_conversion_vminfo(jint conv) { | |
472 return (conv >> CONV_VMINFO_SHIFT) & CONV_VMINFO_MASK; | |
473 } | |
474 | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
475 // Bit mask of conversion_op values. May vary by platform. |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
476 static int adapter_conversion_ops_supported_mask(); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
477 |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
478 static bool conv_op_supported(int conv_op) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
479 assert(conv_op_valid(conv_op), ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
480 return ((adapter_conversion_ops_supported_mask() & nth_bit(conv_op)) != 0); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
481 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
482 |
710 | 483 // Offset in words that the interpreter stack pointer moves when an argument is pushed. |
484 // The stack_move value must always be a multiple of this. | |
485 static int stack_move_unit() { | |
1506 | 486 return frame::interpreter_frame_expression_stack_direction() * Interpreter::stackElementWords; |
710 | 487 } |
488 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
489 // Adapter frame traversal. (Implementation-specific.) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
490 static frame ricochet_frame_sender(const frame& fr, RegisterMap* reg_map); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
491 static void ricochet_frame_oops_do(const frame& fr, OopClosure* blk, const RegisterMap* reg_map); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
492 |
710 | 493 enum { CONV_VMINFO_SIGN_FLAG = 0x80 }; |
1849
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
494 // Shift values for prim-to-prim conversions. |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
495 static int adapter_prim_to_prim_subword_vminfo(BasicType dest) { |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
496 if (dest == T_BOOLEAN) return (BitsPerInt - 1); // boolean is 1 bit |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
497 if (dest == T_CHAR) return (BitsPerInt - BitsPerShort); |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
498 if (dest == T_BYTE) return (BitsPerInt - BitsPerByte ) | CONV_VMINFO_SIGN_FLAG; |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
499 if (dest == T_SHORT) return (BitsPerInt - BitsPerShort) | CONV_VMINFO_SIGN_FLAG; |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
500 return 0; // case T_INT |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
501 } |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
502 // Shift values for unboxing a primitive. |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
503 static int adapter_unbox_subword_vminfo(BasicType dest) { |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
504 if (dest == T_BOOLEAN) return (BitsPerInt - BitsPerByte ); // implemented as 1 byte |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
505 if (dest == T_CHAR) return (BitsPerInt - BitsPerShort); |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
506 if (dest == T_BYTE) return (BitsPerInt - BitsPerByte ) | CONV_VMINFO_SIGN_FLAG; |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
507 if (dest == T_SHORT) return (BitsPerInt - BitsPerShort) | CONV_VMINFO_SIGN_FLAG; |
710 | 508 return 0; // case T_INT |
509 } | |
510 // Here is the transformation the i2i adapter must perform: | |
511 static int truncate_subword_from_vminfo(jint value, int vminfo) { | |
512 jint tem = value << vminfo; | |
513 if ((vminfo & CONV_VMINFO_SIGN_FLAG) != 0) { | |
514 return (jint)tem >> vminfo; | |
515 } else { | |
516 return (juint)tem >> vminfo; | |
517 } | |
518 } | |
519 | |
520 static inline address from_compiled_entry(EntryKind ek); | |
521 static inline address from_interpreted_entry(EntryKind ek); | |
522 | |
523 // helpers for decode_method. | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
524 static methodOop decode_methodOop(methodOop m, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
525 static methodHandle decode_vmtarget(oop vmtarget, int vmindex, oop mtype, KlassHandle& receiver_limit_result, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
526 static methodHandle decode_MemberName(oop mname, KlassHandle& receiver_limit_result, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
527 static methodHandle decode_MethodHandle(oop mh, KlassHandle& receiver_limit_result, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
528 static methodHandle decode_DirectMethodHandle(oop mh, KlassHandle& receiver_limit_result, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
529 static methodHandle decode_BoundMethodHandle(oop mh, KlassHandle& receiver_limit_result, int& decode_flags_result); |
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
530 static methodHandle decode_AdapterMethodHandle(oop mh, KlassHandle& receiver_limit_result, int& decode_flags_result); |
710 | 531 |
532 // Find out how many stack slots an mh pushes or pops. | |
533 // The result is *not* reported as a multiple of stack_move_unit(); | |
534 // It is a signed net number of pushes (a difference in vmslots). | |
535 // To compare with a stack_move value, first multiply by stack_move_unit(). | |
536 static int decode_MethodHandle_stack_pushes(oop mh); | |
537 | |
538 public: | |
539 // working with member names | |
540 static void resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type | |
541 static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
542 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName |
710 | 543 static void init_MemberName(oop mname_oop, oop target); // compute vmtarget/vmindex from target |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
544 static void init_MemberName(oop mname_oop, methodOop m, bool do_dispatch = true); |
710 | 545 static void init_MemberName(oop mname_oop, klassOop field_holder, AccessFlags mods, int offset); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2116
diff
changeset
|
546 static int find_MemberNames(klassOop k, Symbol* name, Symbol* sig, |
710 | 547 int mflags, klassOop caller, |
548 int skip, objArrayOop results); | |
549 // bit values for suppress argument to expand_MemberName: | |
550 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 }; | |
551 | |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
552 // Generate MethodHandles adapters. |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
553 static void generate_adapters(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
554 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
555 // Called from InterpreterGenerator and MethodHandlesAdapterGenerator. |
710 | 556 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm); |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
557 static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek); |
710 | 558 |
559 // argument list parsing | |
560 static int argument_slot(oop method_type, int arg); | |
561 static int argument_slot_count(oop method_type) { return argument_slot(method_type, -1); } | |
562 static int argument_slot_to_argnum(oop method_type, int argslot); | |
563 | |
564 // Runtime support | |
565 enum { // bit-encoded flags from decode_method or decode_vmref | |
566 _dmf_has_receiver = 0x01, // target method has leading reference argument | |
567 _dmf_does_dispatch = 0x02, // method handle performs virtual or interface dispatch | |
568 _dmf_from_interface = 0x04, // peforms interface dispatch | |
569 _DMF_DIRECT_MASK = (_dmf_from_interface*2 - _dmf_has_receiver), | |
570 _dmf_binds_method = 0x08, | |
571 _dmf_binds_argument = 0x10, | |
572 _DMF_BOUND_MASK = (_dmf_binds_argument*2 - _dmf_binds_method), | |
573 _dmf_adapter_lsb = 0x20, | |
574 _DMF_ADAPTER_MASK = (_dmf_adapter_lsb << CONV_OP_LIMIT) - _dmf_adapter_lsb | |
575 }; | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
576 static methodHandle decode_method(oop x, KlassHandle& receiver_limit_result, int& decode_flags_result); |
710 | 577 enum { |
578 // format of query to getConstant: | |
579 GC_JVM_PUSH_LIMIT = 0, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
580 GC_JVM_STACK_MOVE_UNIT = 1, |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
581 GC_CONV_OP_IMPLEMENTED_MASK = 2, |
710 | 582 |
583 // format of result from getTarget / encode_target: | |
584 ETF_HANDLE_OR_METHOD_NAME = 0, // all available data (immediate MH or method) | |
585 ETF_DIRECT_HANDLE = 1, // ultimate method handle (will be a DMH, may be self) | |
586 ETF_METHOD_NAME = 2, // ultimate method as MemberName | |
587 ETF_REFLECT_METHOD = 3 // ultimate method as java.lang.reflect object (sans refClass) | |
588 }; | |
589 static int get_named_constant(int which, Handle name_box, TRAPS); | |
590 static oop encode_target(Handle mh, int format, TRAPS); // report vmtarget (to Java code) | |
591 static bool class_cast_needed(klassOop src, klassOop dst); | |
592 | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
593 static instanceKlassHandle resolve_instance_klass(oop java_mirror_oop, TRAPS); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
594 static instanceKlassHandle resolve_instance_klass(jclass java_mirror_jh, TRAPS) { |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
595 return resolve_instance_klass(JNIHandles::resolve(java_mirror_jh), THREAD); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
596 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
597 |
710 | 598 private: |
599 // These checkers operate on a pair of whole MethodTypes: | |
600 static const char* check_method_type_change(oop src_mtype, int src_beg, int src_end, | |
601 int insert_argnum, oop insert_type, | |
602 int change_argnum, oop change_type, | |
603 int delete_argnum, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
604 oop dst_mtype, int dst_beg, int dst_end, |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
605 bool raw = false); |
710 | 606 static const char* check_method_type_insertion(oop src_mtype, |
607 int insert_argnum, oop insert_type, | |
608 oop dst_mtype) { | |
609 oop no_ref = NULL; | |
610 return check_method_type_change(src_mtype, 0, -1, | |
611 insert_argnum, insert_type, | |
612 -1, no_ref, -1, dst_mtype, 0, -1); | |
613 } | |
614 static const char* check_method_type_conversion(oop src_mtype, | |
615 int change_argnum, oop change_type, | |
616 oop dst_mtype) { | |
617 oop no_ref = NULL; | |
618 return check_method_type_change(src_mtype, 0, -1, -1, no_ref, | |
619 change_argnum, change_type, | |
620 -1, dst_mtype, 0, -1); | |
621 } | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
622 static const char* check_method_type_passthrough(oop src_mtype, oop dst_mtype, bool raw) { |
710 | 623 oop no_ref = NULL; |
624 return check_method_type_change(src_mtype, 0, -1, | |
625 -1, no_ref, -1, no_ref, -1, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
626 dst_mtype, 0, -1, raw); |
710 | 627 } |
628 | |
629 // These checkers operate on pairs of argument or return types: | |
630 static const char* check_argument_type_change(BasicType src_type, klassOop src_klass, | |
631 BasicType dst_type, klassOop dst_klass, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
632 int argnum, bool raw = false); |
710 | 633 |
634 static const char* check_argument_type_change(oop src_type, oop dst_type, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
635 int argnum, bool raw = false) { |
710 | 636 klassOop src_klass = NULL, dst_klass = NULL; |
637 BasicType src_bt = java_lang_Class::as_BasicType(src_type, &src_klass); | |
638 BasicType dst_bt = java_lang_Class::as_BasicType(dst_type, &dst_klass); | |
639 return check_argument_type_change(src_bt, src_klass, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
640 dst_bt, dst_klass, argnum, raw); |
710 | 641 } |
642 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
643 static const char* check_return_type_change(oop src_type, oop dst_type, bool raw = false) { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
644 return check_argument_type_change(src_type, dst_type, -1, raw); |
710 | 645 } |
646 | |
647 static const char* check_return_type_change(BasicType src_type, klassOop src_klass, | |
648 BasicType dst_type, klassOop dst_klass) { | |
649 return check_argument_type_change(src_type, src_klass, dst_type, dst_klass, -1); | |
650 } | |
651 | |
652 static const char* check_method_receiver(methodOop m, klassOop passed_recv_type); | |
653 | |
654 // These verifiers can block, and will throw an error if the checking fails: | |
655 static void verify_vmslots(Handle mh, TRAPS); | |
656 static void verify_vmargslot(Handle mh, int argnum, int argslot, TRAPS); | |
657 | |
658 static void verify_method_type(methodHandle m, Handle mtype, | |
659 bool has_bound_oop, | |
660 KlassHandle bound_oop_type, | |
661 TRAPS); | |
662 | |
663 static void verify_method_signature(methodHandle m, Handle mtype, | |
664 int first_ptype_pos, | |
665 KlassHandle insert_ptype, TRAPS); | |
666 | |
667 static void verify_DirectMethodHandle(Handle mh, methodHandle m, TRAPS); | |
668 static void verify_BoundMethodHandle(Handle mh, Handle target, int argnum, | |
669 bool direct_to_method, TRAPS); | |
670 static void verify_BoundMethodHandle_with_receiver(Handle mh, methodHandle m, TRAPS); | |
671 static void verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS); | |
672 | |
673 public: | |
674 | |
675 // Fill in the fields of a DirectMethodHandle mh. (MH.type must be pre-filled.) | |
676 static void init_DirectMethodHandle(Handle mh, methodHandle method, bool do_dispatch, TRAPS); | |
677 | |
678 // Fill in the fields of a BoundMethodHandle mh. (MH.type, BMH.argument must be pre-filled.) | |
679 static void init_BoundMethodHandle(Handle mh, Handle target, int argnum, TRAPS); | |
680 static void init_BoundMethodHandle_with_receiver(Handle mh, | |
681 methodHandle original_m, | |
682 KlassHandle receiver_limit, | |
683 int decode_flags, | |
684 TRAPS); | |
685 | |
686 // Fill in the fields of an AdapterMethodHandle mh. (MH.type must be pre-filled.) | |
687 static void init_AdapterMethodHandle(Handle mh, Handle target, int argnum, TRAPS); | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
688 static void ensure_vmlayout_field(Handle target, TRAPS); |
710 | 689 |
690 #ifdef ASSERT | |
691 static bool spot_check_entry_names(); | |
692 #endif | |
693 | |
694 private: | |
695 static methodHandle dispatch_decoded_method(methodHandle m, | |
696 KlassHandle receiver_limit, | |
697 int decode_flags, | |
698 KlassHandle receiver_klass, | |
699 TRAPS); | |
700 | |
3371
fabcf26ee72f
6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents:
3363
diff
changeset
|
701 public: |
fabcf26ee72f
6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents:
3363
diff
changeset
|
702 static bool is_float_fixed_reinterpretation_cast(BasicType src, BasicType dst); |
710 | 703 static bool same_basic_type_for_arguments(BasicType src, BasicType dst, |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
704 bool raw = false, |
710 | 705 bool for_return = false); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
706 static bool same_basic_type_for_returns(BasicType src, BasicType dst, bool raw = false) { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
707 return same_basic_type_for_arguments(src, dst, raw, true); |
710 | 708 } |
709 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
710 static Symbol* convert_to_signature(oop type_str, bool polymorphic, TRAPS); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
711 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
712 #ifdef TARGET_ARCH_x86 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
713 # include "methodHandles_x86.hpp" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
714 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
715 #ifdef TARGET_ARCH_sparc |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
716 #define TARGET_ARCH_NYI_6939861 1 //FIXME |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
717 //# include "methodHandles_sparc.hpp" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
718 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
719 #ifdef TARGET_ARCH_zero |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
720 #define TARGET_ARCH_NYI_6939861 1 //FIXME |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
721 //# include "methodHandles_zero.hpp" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
722 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
723 #ifdef TARGET_ARCH_arm |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
724 # include "methodHandles_arm.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
725 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
726 #ifdef TARGET_ARCH_ppc |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
727 # include "methodHandles_ppc.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
728 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
729 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
730 #ifdef TARGET_ARCH_NYI_6939861 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
731 // Here are some backward compatible declarations until the 6939861 ports are updated. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
732 #define _adapter_flyby (_EK_LIMIT + 10) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
733 #define _adapter_ricochet (_EK_LIMIT + 11) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
734 #define _adapter_opt_spread_1 _adapter_opt_spread_1_ref |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
735 #define _adapter_opt_spread_more _adapter_opt_spread_ref |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
736 enum { |
710 | 737 _INSERT_NO_MASK = -1, |
738 _INSERT_REF_MASK = 0, | |
739 _INSERT_INT_MASK = 1, | |
740 _INSERT_LONG_MASK = 3 | |
741 }; | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
742 static void get_ek_bound_mh_info(EntryKind ek, BasicType& arg_type, int& arg_mask, int& arg_slots) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
743 arg_type = ek_bound_mh_arg_type(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
744 arg_mask = 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
745 arg_slots = type2size[arg_type];; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
746 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
747 static void get_ek_adapter_opt_swap_rot_info(EntryKind ek, int& swap_bytes, int& rotate) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
748 int swap_slots = ek_adapter_opt_swap_slots(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
749 rotate = ek_adapter_opt_swap_mode(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
750 swap_bytes = swap_slots * Interpreter::stackElementSize; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
751 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
752 static int get_ek_adapter_opt_spread_info(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
753 return ek_adapter_opt_spread_count(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
754 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
755 |
710 | 756 static void insert_arg_slots(MacroAssembler* _masm, |
757 RegisterOrConstant arg_slots, | |
758 int arg_mask, | |
1304 | 759 Register argslot_reg, |
1503 | 760 Register temp_reg, Register temp2_reg, Register temp3_reg = noreg); |
710 | 761 |
762 static void remove_arg_slots(MacroAssembler* _masm, | |
763 RegisterOrConstant arg_slots, | |
1304 | 764 Register argslot_reg, |
1503 | 765 Register temp_reg, Register temp2_reg, Register temp3_reg = noreg); |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
766 |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
767 static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
768 #endif //TARGET_ARCH_NYI_6939861 |
710 | 769 }; |
770 | |
771 | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
772 // Access methods for the "entry" field of a java.lang.invoke.MethodHandle. |
710 | 773 // The field is primarily a jump target for compiled calls. |
774 // However, we squirrel away some nice pointers for other uses, | |
775 // just before the jump target. | |
776 // Aspects of a method handle entry: | |
777 // - from_compiled_entry - stub used when compiled code calls the MH | |
778 // - from_interpreted_entry - stub used when the interpreter calls the MH | |
779 // - type_checking_entry - stub for runtime casting between MHForm siblings (NYI) | |
780 class MethodHandleEntry { | |
781 public: | |
782 class Data { | |
783 friend class MethodHandleEntry; | |
784 size_t _total_size; // size including Data and code stub | |
785 MethodHandleEntry* _type_checking_entry; | |
786 address _from_interpreted_entry; | |
787 MethodHandleEntry* method_entry() { return (MethodHandleEntry*)(this + 1); } | |
788 }; | |
789 | |
790 Data* data() { return (Data*)this - 1; } | |
791 | |
792 address start_address() { return (address) data(); } | |
793 address end_address() { return start_address() + data()->_total_size; } | |
794 | |
795 address from_compiled_entry() { return (address) this; } | |
796 | |
797 address from_interpreted_entry() { return data()->_from_interpreted_entry; } | |
798 void set_from_interpreted_entry(address e) { data()->_from_interpreted_entry = e; } | |
799 | |
800 MethodHandleEntry* type_checking_entry() { return data()->_type_checking_entry; } | |
801 void set_type_checking_entry(MethodHandleEntry* e) { data()->_type_checking_entry = e; } | |
802 | |
803 void set_end_address(address end_addr) { | |
804 size_t total_size = end_addr - start_address(); | |
805 assert(total_size > 0 && total_size < 0x1000, "reasonable end address"); | |
806 data()->_total_size = total_size; | |
807 } | |
808 | |
809 // Compiler support: | |
810 static int from_interpreted_entry_offset_in_bytes() { | |
811 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) ); | |
812 } | |
813 static int type_checking_entry_offset_in_bytes() { | |
814 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) ); | |
815 } | |
816 | |
817 static address start_compiled_entry(MacroAssembler* _masm, | |
818 address interpreted_entry = NULL); | |
819 static MethodHandleEntry* finish_compiled_entry(MacroAssembler* masm, address start_addr); | |
820 }; | |
821 | |
822 address MethodHandles::from_compiled_entry(EntryKind ek) { return entry(ek)->from_compiled_entry(); } | |
823 address MethodHandles::from_interpreted_entry(EntryKind ek) { return entry(ek)->from_interpreted_entry(); } | |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
824 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
825 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
826 //------------------------------------------------------------------------------ |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
827 // MethodHandlesAdapterGenerator |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
828 // |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
829 class MethodHandlesAdapterGenerator : public StubCodeGenerator { |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
830 public: |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
831 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code) {} |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
832 |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
833 void generate(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
834 }; |
1972 | 835 |
836 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP |