Mercurial > hg > graal-compiler
annotate src/share/vm/prims/methodHandles.hpp @ 3917:eca1193ca245
4965777: GC changes to support use of discovered field for pending references
Summary: If and when the reference handler thread is able to use the discovered field to link reference objects in its pending list, so will GC. In that case, GC will scan through this field once a reference object has been placed on the pending list, but not scan that field before that stage, as the field is used by the concurrent GC thread to link discovered objects. When ReferenceHandleR thread does not use the discovered field for the purpose of linking the elements in the pending list, as would be the case in older JDKs, the JVM will fall back to the old behaviour of using the next field for that purpose.
Reviewed-by: jcoomes, mchung, stefank
author | ysr |
---|---|
date | Wed, 07 Sep 2011 13:55:42 -0700 |
parents | ddd894528dbc |
children | c26de9aef2ed |
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 |
710 | 221 static bool ek_valid(EntryKind ek) { return (uint)ek < (uint)_EK_LIMIT; } |
222 static bool conv_op_valid(int op) { return (uint)op < (uint)CONV_OP_LIMIT; } | |
223 | |
224 public: | |
225 static bool have_entry(EntryKind ek) { return ek_valid(ek) && _entries[ek] != NULL; } | |
226 static MethodHandleEntry* entry(EntryKind ek) { assert(ek_valid(ek), "initialized"); | |
227 return _entries[ek]; } | |
228 static const char* entry_name(EntryKind ek) { assert(ek_valid(ek), "oob"); | |
229 return _entry_names[ek]; } | |
230 static EntryKind adapter_entry_kind(int op) { assert(conv_op_valid(op), "oob"); | |
231 return EntryKind(_adapter_mh_first + op); } | |
232 | |
233 static void init_entry(EntryKind ek, MethodHandleEntry* me) { | |
234 assert(ek_valid(ek), "oob"); | |
235 assert(_entries[ek] == NULL, "no double initialization"); | |
236 _entries[ek] = me; | |
237 } | |
238 | |
1304 | 239 // Some adapter helper functions. |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
240 static EntryKind ek_original_kind(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
241 if (ek <= _adapter_mh_last) return ek; |
1304 | 242 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
243 case _adapter_opt_swap_1: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
244 case _adapter_opt_swap_2: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
245 return _adapter_swap_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
246 case _adapter_opt_rot_1_up: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
247 case _adapter_opt_rot_1_down: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
248 case _adapter_opt_rot_2_up: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
249 case _adapter_opt_rot_2_down: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
250 return _adapter_rot_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
251 case _adapter_opt_i2i: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
252 case _adapter_opt_l2i: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
253 case _adapter_opt_d2f: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
254 case _adapter_opt_i2l: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
255 case _adapter_opt_f2d: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
256 return _adapter_prim_to_prim; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
257 case _adapter_opt_unboxi: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
258 case _adapter_opt_unboxl: |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
259 return _adapter_ref_to_prim; |
1304 | 260 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
261 if (ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
262 return _adapter_spread_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
263 if (ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
264 return _adapter_collect_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
265 if (ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
266 return _adapter_fold_args; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
267 if (ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
268 return _adapter_opt_return_any; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
269 assert(false, "oob"); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
270 return _EK_LIMIT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
271 } |
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 static bool ek_supported(MethodHandles::EntryKind ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
274 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
275 static BasicType ek_bound_mh_arg_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
276 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
277 case _bound_int_mh : // fall-thru |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
278 case _bound_int_direct_mh : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
279 case _bound_long_mh : // fall-thru |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
280 case _bound_long_direct_mh : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
281 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
282 } |
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 static int ek_adapter_opt_swap_slots(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
286 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
287 case _adapter_opt_swap_1 : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
288 case _adapter_opt_swap_2 : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
289 case _adapter_opt_rot_1_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
290 case _adapter_opt_rot_1_down : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
291 case _adapter_opt_rot_2_up : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
292 case _adapter_opt_rot_2_down : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
293 default : ShouldNotReachHere(); return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
294 } |
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 static int ek_adapter_opt_swap_mode(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
298 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
299 case _adapter_opt_swap_1 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
300 case _adapter_opt_swap_2 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
301 case _adapter_opt_rot_1_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
302 case _adapter_opt_rot_1_down : return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
303 case _adapter_opt_rot_2_up : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
304 case _adapter_opt_rot_2_down : return -1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
305 default : ShouldNotReachHere(); return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
306 } |
1304 | 307 } |
308 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
309 static int ek_adapter_opt_collect_count(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
310 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
311 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
1304 | 312 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
313 case _adapter_opt_collect_0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
314 case _adapter_opt_filter_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
315 case _adapter_opt_filter_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
316 case _adapter_opt_filter_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
317 case _adapter_opt_filter_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
318 case _adapter_opt_filter_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
319 case _adapter_opt_filter_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
320 case _adapter_opt_fold_1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
321 case _adapter_opt_collect_1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
322 case _adapter_opt_collect_2_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
323 case _adapter_opt_collect_2_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
324 case _adapter_opt_collect_2_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
325 case _adapter_opt_collect_2_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
326 case _adapter_opt_collect_2_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
327 case _adapter_opt_collect_2_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
328 case _adapter_opt_fold_2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
329 case _adapter_opt_collect_2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
330 case _adapter_opt_fold_3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
331 case _adapter_opt_collect_3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
332 case _adapter_opt_fold_4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
333 case _adapter_opt_collect_4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
334 case _adapter_opt_fold_5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
335 case _adapter_opt_collect_5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
336 default : return -1; // sentinel value for "variable" |
1304 | 337 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
338 } |
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 static int ek_adapter_opt_collect_slot(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
341 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
342 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
343 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
344 case _adapter_opt_collect_2_S0_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
345 case _adapter_opt_filter_S0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
346 case _adapter_opt_collect_2_S1_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
347 case _adapter_opt_filter_S1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
348 case _adapter_opt_collect_2_S2_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
349 case _adapter_opt_filter_S2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
350 case _adapter_opt_collect_2_S3_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
351 case _adapter_opt_filter_S3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
352 case _adapter_opt_collect_2_S4_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
353 case _adapter_opt_filter_S4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
354 case _adapter_opt_collect_2_S5_ref : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
355 case _adapter_opt_filter_S5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
356 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
357 } |
1304 | 358 } |
359 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
360 static BasicType ek_adapter_opt_collect_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
361 assert(ek >= _adapter_opt_collect_FIRST && ek <= _adapter_opt_collect_LAST || |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
362 ek >= _adapter_opt_fold_FIRST && ek <= _adapter_opt_fold_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
363 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
364 case _adapter_opt_fold_int : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
365 case _adapter_opt_collect_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
366 case _adapter_opt_fold_long : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
367 case _adapter_opt_collect_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
368 case _adapter_opt_fold_float : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
369 case _adapter_opt_collect_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
370 case _adapter_opt_fold_double : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
371 case _adapter_opt_collect_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
372 case _adapter_opt_fold_void : |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
373 case _adapter_opt_collect_void : return T_VOID; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
374 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
375 } |
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 static int ek_adapter_opt_return_slot(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
379 assert(ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
380 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
381 case _adapter_opt_return_S0_ref : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
382 case _adapter_opt_return_S1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
383 case _adapter_opt_return_S2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
384 case _adapter_opt_return_S3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
385 case _adapter_opt_return_S4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
386 case _adapter_opt_return_S5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
387 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
388 } |
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 static BasicType ek_adapter_opt_return_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
392 assert(ek >= _adapter_opt_return_FIRST && ek <= _adapter_opt_return_LAST, ""); |
1304 | 393 switch (ek) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
394 case _adapter_opt_return_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
395 case _adapter_opt_return_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
396 case _adapter_opt_return_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
397 case _adapter_opt_return_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
398 case _adapter_opt_return_void : return T_VOID; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
399 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
|
400 default : return T_OBJECT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
401 } |
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 static int ek_adapter_opt_spread_count(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
405 assert(ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
406 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
407 case _adapter_opt_spread_0 : return 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
408 case _adapter_opt_spread_1_ref : return 1; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
409 case _adapter_opt_spread_2_ref : return 2; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
410 case _adapter_opt_spread_3_ref : return 3; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
411 case _adapter_opt_spread_4_ref : return 4; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
412 case _adapter_opt_spread_5_ref : return 5; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
413 default : return -1; // sentinel value for "variable" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
414 } |
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 static BasicType ek_adapter_opt_spread_type(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
418 assert(ek >= _adapter_opt_spread_FIRST && ek <= _adapter_opt_spread_LAST, ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
419 switch (ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
420 // (there is no _adapter_opt_spread_boolean; we use byte) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
421 case _adapter_opt_spread_byte : return T_BYTE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
422 case _adapter_opt_spread_char : return T_CHAR; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
423 case _adapter_opt_spread_short : return T_SHORT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
424 case _adapter_opt_spread_int : return T_INT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
425 case _adapter_opt_spread_long : return T_LONG; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
426 case _adapter_opt_spread_float : return T_FLOAT; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
427 case _adapter_opt_spread_double : return T_DOUBLE; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
428 default : return T_OBJECT; |
1304 | 429 } |
430 } | |
431 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
432 static methodOop raise_exception_method() { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
433 oop rem = JNIHandles::resolve(_raise_exception_method); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
434 assert(rem == NULL || rem->is_method(), ""); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
435 return (methodOop) rem; |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
436 } |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
437 static void set_raise_exception_method(methodOop rem) { |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
438 assert(_raise_exception_method == NULL, ""); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
439 _raise_exception_method = JNIHandles::make_global(Handle(rem)); |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
440 } |
3744
60b8287df30e
7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents:
3385
diff
changeset
|
441 static methodOop resolve_raise_exception_method(TRAPS); |
60b8287df30e
7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents:
3385
diff
changeset
|
442 // call raise_exception_method from C code: |
60b8287df30e
7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents:
3385
diff
changeset
|
443 static void raise_exception(int code, oop actual, oop required, TRAPS); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
444 |
710 | 445 static jint adapter_conversion(int conv_op, BasicType src, BasicType dest, |
446 int stack_move = 0, int vminfo = 0) { | |
447 assert(conv_op_valid(conv_op), "oob"); | |
448 jint conv = ((conv_op << CONV_OP_SHIFT) | |
449 | (src << CONV_SRC_TYPE_SHIFT) | |
450 | (dest << CONV_DEST_TYPE_SHIFT) | |
451 | (stack_move << CONV_STACK_MOVE_SHIFT) | |
452 | (vminfo << CONV_VMINFO_SHIFT) | |
453 ); | |
454 assert(adapter_conversion_op(conv) == conv_op, "decode conv_op"); | |
455 assert(adapter_conversion_src_type(conv) == src, "decode src"); | |
456 assert(adapter_conversion_dest_type(conv) == dest, "decode dest"); | |
457 assert(adapter_conversion_stack_move(conv) == stack_move, "decode stack_move"); | |
458 assert(adapter_conversion_vminfo(conv) == vminfo, "decode vminfo"); | |
459 return conv; | |
460 } | |
461 static int adapter_conversion_op(jint conv) { | |
462 return ((conv >> CONV_OP_SHIFT) & 0xF); | |
463 } | |
464 static BasicType adapter_conversion_src_type(jint conv) { | |
465 return (BasicType)((conv >> CONV_SRC_TYPE_SHIFT) & 0xF); | |
466 } | |
467 static BasicType adapter_conversion_dest_type(jint conv) { | |
468 return (BasicType)((conv >> CONV_DEST_TYPE_SHIFT) & 0xF); | |
469 } | |
470 static int adapter_conversion_stack_move(jint conv) { | |
471 return (conv >> CONV_STACK_MOVE_SHIFT); | |
472 } | |
473 static int adapter_conversion_vminfo(jint conv) { | |
474 return (conv >> CONV_VMINFO_SHIFT) & CONV_VMINFO_MASK; | |
475 } | |
476 | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
477 // Bit mask of conversion_op values. May vary by platform. |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
478 static int adapter_conversion_ops_supported_mask(); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
479 |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
480 static bool conv_op_supported(int conv_op) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
481 assert(conv_op_valid(conv_op), ""); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
482 return ((adapter_conversion_ops_supported_mask() & nth_bit(conv_op)) != 0); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
483 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
484 |
710 | 485 // Offset in words that the interpreter stack pointer moves when an argument is pushed. |
486 // The stack_move value must always be a multiple of this. | |
487 static int stack_move_unit() { | |
1506 | 488 return frame::interpreter_frame_expression_stack_direction() * Interpreter::stackElementWords; |
710 | 489 } |
490 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
491 // Adapter frame traversal. (Implementation-specific.) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
492 static frame ricochet_frame_sender(const frame& fr, RegisterMap* reg_map); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
493 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
|
494 |
710 | 495 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
|
496 // 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
|
497 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
|
498 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
|
499 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
|
500 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
|
501 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
|
502 return 0; // case T_INT |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
503 } |
5beba6174298
6987555: JSR 292 unboxing to a boolean value fails on big-endian SPARC
twisti
parents:
1793
diff
changeset
|
504 // 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
|
505 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
|
506 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
|
507 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
|
508 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
|
509 if (dest == T_SHORT) return (BitsPerInt - BitsPerShort) | CONV_VMINFO_SIGN_FLAG; |
710 | 510 return 0; // case T_INT |
511 } | |
512 // Here is the transformation the i2i adapter must perform: | |
513 static int truncate_subword_from_vminfo(jint value, int vminfo) { | |
514 jint tem = value << vminfo; | |
515 if ((vminfo & CONV_VMINFO_SIGN_FLAG) != 0) { | |
516 return (jint)tem >> vminfo; | |
517 } else { | |
518 return (juint)tem >> vminfo; | |
519 } | |
520 } | |
521 | |
522 static inline address from_compiled_entry(EntryKind ek); | |
523 static inline address from_interpreted_entry(EntryKind ek); | |
524 | |
525 // helpers for decode_method. | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
526 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
|
527 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
|
528 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
|
529 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
|
530 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
|
531 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
|
532 static methodHandle decode_AdapterMethodHandle(oop mh, KlassHandle& receiver_limit_result, int& decode_flags_result); |
710 | 533 |
534 // Find out how many stack slots an mh pushes or pops. | |
535 // The result is *not* reported as a multiple of stack_move_unit(); | |
536 // It is a signed net number of pushes (a difference in vmslots). | |
537 // To compare with a stack_move value, first multiply by stack_move_unit(). | |
538 static int decode_MethodHandle_stack_pushes(oop mh); | |
539 | |
540 public: | |
541 // working with member names | |
542 static void resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type | |
543 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
|
544 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName |
710 | 545 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
|
546 static void init_MemberName(oop mname_oop, methodOop m, bool do_dispatch = true); |
710 | 547 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
|
548 static int find_MemberNames(klassOop k, Symbol* name, Symbol* sig, |
710 | 549 int mflags, klassOop caller, |
550 int skip, objArrayOop results); | |
551 // bit values for suppress argument to expand_MemberName: | |
552 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 }; | |
553 | |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
554 // Generate MethodHandles adapters. |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
555 static void generate_adapters(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
556 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
557 // Called from InterpreterGenerator and MethodHandlesAdapterGenerator. |
710 | 558 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
|
559 static void generate_method_handle_stub(MacroAssembler* _masm, EntryKind ek); |
710 | 560 |
561 // argument list parsing | |
562 static int argument_slot(oop method_type, int arg); | |
563 static int argument_slot_count(oop method_type) { return argument_slot(method_type, -1); } | |
564 static int argument_slot_to_argnum(oop method_type, int argslot); | |
565 | |
566 // Runtime support | |
567 enum { // bit-encoded flags from decode_method or decode_vmref | |
568 _dmf_has_receiver = 0x01, // target method has leading reference argument | |
569 _dmf_does_dispatch = 0x02, // method handle performs virtual or interface dispatch | |
570 _dmf_from_interface = 0x04, // peforms interface dispatch | |
571 _DMF_DIRECT_MASK = (_dmf_from_interface*2 - _dmf_has_receiver), | |
572 _dmf_binds_method = 0x08, | |
573 _dmf_binds_argument = 0x10, | |
574 _DMF_BOUND_MASK = (_dmf_binds_argument*2 - _dmf_binds_method), | |
575 _dmf_adapter_lsb = 0x20, | |
576 _DMF_ADAPTER_MASK = (_dmf_adapter_lsb << CONV_OP_LIMIT) - _dmf_adapter_lsb | |
577 }; | |
3274
2a23b1b5a0a8
7018355: JSR 292: VM crash in DefNewGeneration::copy_to_survivor_space
twisti
parents:
2357
diff
changeset
|
578 static methodHandle decode_method(oop x, KlassHandle& receiver_limit_result, int& decode_flags_result); |
710 | 579 enum { |
580 // format of query to getConstant: | |
581 GC_JVM_PUSH_LIMIT = 0, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
582 GC_JVM_STACK_MOVE_UNIT = 1, |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
583 GC_CONV_OP_IMPLEMENTED_MASK = 2, |
3757
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
584 GC_OP_ROT_ARGS_DOWN_LIMIT_BIAS = 3, |
710 | 585 |
586 // format of result from getTarget / encode_target: | |
587 ETF_HANDLE_OR_METHOD_NAME = 0, // all available data (immediate MH or method) | |
588 ETF_DIRECT_HANDLE = 1, // ultimate method handle (will be a DMH, may be self) | |
589 ETF_METHOD_NAME = 2, // ultimate method as MemberName | |
3757
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
590 ETF_REFLECT_METHOD = 3, // ultimate method as java.lang.reflect object (sans refClass) |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3757
diff
changeset
|
591 ETF_FORCE_DIRECT_HANDLE = 64, |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3757
diff
changeset
|
592 ETF_COMPILE_DIRECT_HANDLE = 65, |
3757
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
593 |
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
594 // ad hoc constants |
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
595 OP_ROT_ARGS_DOWN_LIMIT_BIAS = -1 |
710 | 596 }; |
597 static int get_named_constant(int which, Handle name_box, TRAPS); | |
598 static oop encode_target(Handle mh, int format, TRAPS); // report vmtarget (to Java code) | |
599 static bool class_cast_needed(klassOop src, klassOop dst); | |
600 | |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
601 static instanceKlassHandle resolve_instance_klass(oop java_mirror_oop, TRAPS); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
602 static instanceKlassHandle resolve_instance_klass(jclass java_mirror_jh, TRAPS) { |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
603 return resolve_instance_klass(JNIHandles::resolve(java_mirror_jh), THREAD); |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
604 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
605 |
710 | 606 private: |
607 // These checkers operate on a pair of whole MethodTypes: | |
608 static const char* check_method_type_change(oop src_mtype, int src_beg, int src_end, | |
609 int insert_argnum, oop insert_type, | |
610 int change_argnum, oop change_type, | |
611 int delete_argnum, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
612 oop dst_mtype, int dst_beg, int dst_end, |
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
613 bool raw = false); |
710 | 614 static const char* check_method_type_insertion(oop src_mtype, |
615 int insert_argnum, oop insert_type, | |
616 oop dst_mtype) { | |
617 oop no_ref = NULL; | |
618 return check_method_type_change(src_mtype, 0, -1, | |
619 insert_argnum, insert_type, | |
620 -1, no_ref, -1, dst_mtype, 0, -1); | |
621 } | |
622 static const char* check_method_type_conversion(oop src_mtype, | |
623 int change_argnum, oop change_type, | |
624 oop dst_mtype) { | |
625 oop no_ref = NULL; | |
626 return check_method_type_change(src_mtype, 0, -1, -1, no_ref, | |
627 change_argnum, change_type, | |
628 -1, dst_mtype, 0, -1); | |
629 } | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
630 static const char* check_method_type_passthrough(oop src_mtype, oop dst_mtype, bool raw) { |
710 | 631 oop no_ref = NULL; |
632 return check_method_type_change(src_mtype, 0, -1, | |
633 -1, no_ref, -1, no_ref, -1, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
634 dst_mtype, 0, -1, raw); |
710 | 635 } |
636 | |
637 // These checkers operate on pairs of argument or return types: | |
638 static const char* check_argument_type_change(BasicType src_type, klassOop src_klass, | |
639 BasicType dst_type, klassOop dst_klass, | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
640 int argnum, bool raw = false); |
710 | 641 |
642 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
|
643 int argnum, bool raw = false) { |
710 | 644 klassOop src_klass = NULL, dst_klass = NULL; |
645 BasicType src_bt = java_lang_Class::as_BasicType(src_type, &src_klass); | |
646 BasicType dst_bt = java_lang_Class::as_BasicType(dst_type, &dst_klass); | |
647 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
|
648 dst_bt, dst_klass, argnum, raw); |
710 | 649 } |
650 | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
651 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
|
652 return check_argument_type_change(src_type, dst_type, -1, raw); |
710 | 653 } |
654 | |
655 static const char* check_return_type_change(BasicType src_type, klassOop src_klass, | |
656 BasicType dst_type, klassOop dst_klass) { | |
657 return check_argument_type_change(src_type, src_klass, dst_type, dst_klass, -1); | |
658 } | |
659 | |
660 static const char* check_method_receiver(methodOop m, klassOop passed_recv_type); | |
661 | |
662 // These verifiers can block, and will throw an error if the checking fails: | |
663 static void verify_vmslots(Handle mh, TRAPS); | |
664 static void verify_vmargslot(Handle mh, int argnum, int argslot, TRAPS); | |
665 | |
666 static void verify_method_type(methodHandle m, Handle mtype, | |
667 bool has_bound_oop, | |
668 KlassHandle bound_oop_type, | |
669 TRAPS); | |
670 | |
671 static void verify_method_signature(methodHandle m, Handle mtype, | |
672 int first_ptype_pos, | |
673 KlassHandle insert_ptype, TRAPS); | |
674 | |
675 static void verify_DirectMethodHandle(Handle mh, methodHandle m, TRAPS); | |
676 static void verify_BoundMethodHandle(Handle mh, Handle target, int argnum, | |
677 bool direct_to_method, TRAPS); | |
678 static void verify_BoundMethodHandle_with_receiver(Handle mh, methodHandle m, TRAPS); | |
679 static void verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS); | |
680 | |
681 public: | |
682 | |
683 // Fill in the fields of a DirectMethodHandle mh. (MH.type must be pre-filled.) | |
684 static void init_DirectMethodHandle(Handle mh, methodHandle method, bool do_dispatch, TRAPS); | |
685 | |
686 // Fill in the fields of a BoundMethodHandle mh. (MH.type, BMH.argument must be pre-filled.) | |
687 static void init_BoundMethodHandle(Handle mh, Handle target, int argnum, TRAPS); | |
688 static void init_BoundMethodHandle_with_receiver(Handle mh, | |
689 methodHandle original_m, | |
690 KlassHandle receiver_limit, | |
691 int decode_flags, | |
692 TRAPS); | |
693 | |
694 // Fill in the fields of an AdapterMethodHandle mh. (MH.type must be pre-filled.) | |
695 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
|
696 static void ensure_vmlayout_field(Handle target, TRAPS); |
710 | 697 |
698 #ifdef ASSERT | |
699 static bool spot_check_entry_names(); | |
700 #endif | |
701 | |
702 private: | |
703 static methodHandle dispatch_decoded_method(methodHandle m, | |
704 KlassHandle receiver_limit, | |
705 int decode_flags, | |
706 KlassHandle receiver_klass, | |
707 TRAPS); | |
708 | |
3371
fabcf26ee72f
6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents:
3363
diff
changeset
|
709 public: |
fabcf26ee72f
6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents:
3363
diff
changeset
|
710 static bool is_float_fixed_reinterpretation_cast(BasicType src, BasicType dst); |
710 | 711 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
|
712 bool raw = false, |
710 | 713 bool for_return = false); |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
714 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
|
715 return same_basic_type_for_arguments(src, dst, raw, true); |
710 | 716 } |
717 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
718 static Symbol* convert_to_signature(oop type_str, bool polymorphic, TRAPS); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
719 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
720 #ifdef TARGET_ARCH_x86 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
721 # include "methodHandles_x86.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_sparc |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
724 # include "methodHandles_sparc.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_zero |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
727 # include "methodHandles_zero.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 #ifdef TARGET_ARCH_arm |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
730 # include "methodHandles_arm.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
731 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
732 #ifdef TARGET_ARCH_ppc |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
733 # include "methodHandles_ppc.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
734 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
735 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
736 #ifdef TARGET_ARCH_NYI_6939861 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
737 // 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
|
738 #define _adapter_flyby (_EK_LIMIT + 10) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
739 #define _adapter_ricochet (_EK_LIMIT + 11) |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
740 #define _adapter_opt_spread_1 _adapter_opt_spread_1_ref |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
741 #define _adapter_opt_spread_more _adapter_opt_spread_ref |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
742 enum { |
710 | 743 _INSERT_NO_MASK = -1, |
744 _INSERT_REF_MASK = 0, | |
745 _INSERT_INT_MASK = 1, | |
746 _INSERT_LONG_MASK = 3 | |
747 }; | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
748 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
|
749 arg_type = ek_bound_mh_arg_type(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
750 arg_mask = 0; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
751 arg_slots = type2size[arg_type];; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
752 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
753 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
|
754 int swap_slots = ek_adapter_opt_swap_slots(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
755 rotate = ek_adapter_opt_swap_mode(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
756 swap_bytes = swap_slots * Interpreter::stackElementSize; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
757 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
758 static int get_ek_adapter_opt_spread_info(EntryKind ek) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
759 return ek_adapter_opt_spread_count(ek); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
760 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
761 |
710 | 762 static void insert_arg_slots(MacroAssembler* _masm, |
763 RegisterOrConstant arg_slots, | |
764 int arg_mask, | |
1304 | 765 Register argslot_reg, |
1503 | 766 Register temp_reg, Register temp2_reg, Register temp3_reg = noreg); |
710 | 767 |
768 static void remove_arg_slots(MacroAssembler* _masm, | |
769 RegisterOrConstant arg_slots, | |
1304 | 770 Register argslot_reg, |
1503 | 771 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
|
772 |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
773 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
|
774 #endif //TARGET_ARCH_NYI_6939861 |
710 | 775 }; |
776 | |
777 | |
2357
8033953d67ff
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
2177
diff
changeset
|
778 // Access methods for the "entry" field of a java.lang.invoke.MethodHandle. |
710 | 779 // The field is primarily a jump target for compiled calls. |
780 // However, we squirrel away some nice pointers for other uses, | |
781 // just before the jump target. | |
782 // Aspects of a method handle entry: | |
783 // - from_compiled_entry - stub used when compiled code calls the MH | |
784 // - from_interpreted_entry - stub used when the interpreter calls the MH | |
785 // - type_checking_entry - stub for runtime casting between MHForm siblings (NYI) | |
786 class MethodHandleEntry { | |
787 public: | |
788 class Data { | |
789 friend class MethodHandleEntry; | |
790 size_t _total_size; // size including Data and code stub | |
791 MethodHandleEntry* _type_checking_entry; | |
792 address _from_interpreted_entry; | |
793 MethodHandleEntry* method_entry() { return (MethodHandleEntry*)(this + 1); } | |
794 }; | |
795 | |
796 Data* data() { return (Data*)this - 1; } | |
797 | |
798 address start_address() { return (address) data(); } | |
799 address end_address() { return start_address() + data()->_total_size; } | |
800 | |
801 address from_compiled_entry() { return (address) this; } | |
802 | |
803 address from_interpreted_entry() { return data()->_from_interpreted_entry; } | |
804 void set_from_interpreted_entry(address e) { data()->_from_interpreted_entry = e; } | |
805 | |
806 MethodHandleEntry* type_checking_entry() { return data()->_type_checking_entry; } | |
807 void set_type_checking_entry(MethodHandleEntry* e) { data()->_type_checking_entry = e; } | |
808 | |
809 void set_end_address(address end_addr) { | |
810 size_t total_size = end_addr - start_address(); | |
811 assert(total_size > 0 && total_size < 0x1000, "reasonable end address"); | |
812 data()->_total_size = total_size; | |
813 } | |
814 | |
815 // Compiler support: | |
816 static int from_interpreted_entry_offset_in_bytes() { | |
817 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) ); | |
818 } | |
819 static int type_checking_entry_offset_in_bytes() { | |
820 return (int)( offset_of(Data, _from_interpreted_entry) - sizeof(Data) ); | |
821 } | |
822 | |
823 static address start_compiled_entry(MacroAssembler* _masm, | |
824 address interpreted_entry = NULL); | |
825 static MethodHandleEntry* finish_compiled_entry(MacroAssembler* masm, address start_addr); | |
826 }; | |
827 | |
828 address MethodHandles::from_compiled_entry(EntryKind ek) { return entry(ek)->from_compiled_entry(); } | |
829 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
|
830 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
831 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
832 //------------------------------------------------------------------------------ |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
833 // MethodHandlesAdapterGenerator |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
834 // |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
835 class MethodHandlesAdapterGenerator : public StubCodeGenerator { |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
836 public: |
3757
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
837 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code, PrintMethodHandleStubs) {} |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
838 |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
839 void generate(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
840 }; |
1972 | 841 |
842 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP |