annotate src/share/vm/prims/methodHandles.hpp @ 3762:5c0a3c1858b1

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