annotate src/share/vm/prims/methodHandles.hpp @ 3917:eca1193ca245

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