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