81 "adapter_prim_to_prim/d2f", |
81 "adapter_prim_to_prim/d2f", |
82 "adapter_prim_to_prim/i2l", |
82 "adapter_prim_to_prim/i2l", |
83 "adapter_prim_to_prim/f2d", |
83 "adapter_prim_to_prim/f2d", |
84 "adapter_ref_to_prim/unboxi", |
84 "adapter_ref_to_prim/unboxi", |
85 "adapter_ref_to_prim/unboxl", |
85 "adapter_ref_to_prim/unboxl", |
86 "adapter_spread_args/0", |
86 |
87 "adapter_spread_args/1", |
87 // return value handlers for collect/filter/fold adapters: |
88 "adapter_spread_args/more", |
88 "return/ref", |
|
89 "return/int", |
|
90 "return/long", |
|
91 "return/float", |
|
92 "return/double", |
|
93 "return/void", |
|
94 "return/S0/ref", |
|
95 "return/S1/ref", |
|
96 "return/S2/ref", |
|
97 "return/S3/ref", |
|
98 "return/S4/ref", |
|
99 "return/S5/ref", |
|
100 "return/any", |
|
101 |
|
102 // spreading (array length cases 0, 1, ...) |
|
103 "adapter_spread/0", |
|
104 "adapter_spread/1/ref", |
|
105 "adapter_spread/2/ref", |
|
106 "adapter_spread/3/ref", |
|
107 "adapter_spread/4/ref", |
|
108 "adapter_spread/5/ref", |
|
109 "adapter_spread/ref", |
|
110 "adapter_spread/byte", |
|
111 "adapter_spread/char", |
|
112 "adapter_spread/short", |
|
113 "adapter_spread/int", |
|
114 "adapter_spread/long", |
|
115 "adapter_spread/float", |
|
116 "adapter_spread/double", |
|
117 |
|
118 // blocking filter/collect conversions: |
|
119 "adapter_collect/ref", |
|
120 "adapter_collect/int", |
|
121 "adapter_collect/long", |
|
122 "adapter_collect/float", |
|
123 "adapter_collect/double", |
|
124 "adapter_collect/void", |
|
125 "adapter_collect/0/ref", |
|
126 "adapter_collect/1/ref", |
|
127 "adapter_collect/2/ref", |
|
128 "adapter_collect/3/ref", |
|
129 "adapter_collect/4/ref", |
|
130 "adapter_collect/5/ref", |
|
131 "adapter_filter/S0/ref", |
|
132 "adapter_filter/S1/ref", |
|
133 "adapter_filter/S2/ref", |
|
134 "adapter_filter/S3/ref", |
|
135 "adapter_filter/S4/ref", |
|
136 "adapter_filter/S5/ref", |
|
137 "adapter_collect/2/S0/ref", |
|
138 "adapter_collect/2/S1/ref", |
|
139 "adapter_collect/2/S2/ref", |
|
140 "adapter_collect/2/S3/ref", |
|
141 "adapter_collect/2/S4/ref", |
|
142 "adapter_collect/2/S5/ref", |
|
143 |
|
144 // blocking fold conversions: |
|
145 "adapter_fold/ref", |
|
146 "adapter_fold/int", |
|
147 "adapter_fold/long", |
|
148 "adapter_fold/float", |
|
149 "adapter_fold/double", |
|
150 "adapter_fold/void", |
|
151 "adapter_fold/1/ref", |
|
152 "adapter_fold/2/ref", |
|
153 "adapter_fold/3/ref", |
|
154 "adapter_fold/4/ref", |
|
155 "adapter_fold/5/ref", |
89 |
156 |
90 NULL |
157 NULL |
91 }; |
158 }; |
92 |
159 |
93 // Adapters. |
160 // Adapters. |
94 MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL; |
161 MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL; |
95 int MethodHandles::_adapter_code_size = StubRoutines::method_handles_adapters_code_size; |
162 int MethodHandles::_adapter_code_size = StubRoutines::method_handles_adapters_code_size; |
96 |
163 |
97 jobject MethodHandles::_raise_exception_method; |
164 jobject MethodHandles::_raise_exception_method; |
|
165 |
|
166 address MethodHandles::_adapter_return_handlers[CONV_TYPE_MASK+1]; |
98 |
167 |
99 #ifdef ASSERT |
168 #ifdef ASSERT |
100 bool MethodHandles::spot_check_entry_names() { |
169 bool MethodHandles::spot_check_entry_names() { |
101 assert(!strcmp(entry_name(_invokestatic_mh), "invokestatic"), ""); |
170 assert(!strcmp(entry_name(_invokestatic_mh), "invokestatic"), ""); |
102 assert(!strcmp(entry_name(_bound_ref_mh), "bound_ref"), ""); |
171 assert(!strcmp(entry_name(_bound_ref_mh), "bound_ref"), ""); |
103 assert(!strcmp(entry_name(_adapter_retype_only), "adapter_retype_only"), ""); |
172 assert(!strcmp(entry_name(_adapter_retype_only), "adapter_retype_only"), ""); |
104 assert(!strcmp(entry_name(_adapter_ricochet), "adapter_ricochet"), ""); |
173 assert(!strcmp(entry_name(_adapter_fold_args), "adapter_fold_args"), ""); |
105 assert(!strcmp(entry_name(_adapter_opt_unboxi), "adapter_ref_to_prim/unboxi"), ""); |
174 assert(!strcmp(entry_name(_adapter_opt_unboxi), "adapter_ref_to_prim/unboxi"), ""); |
|
175 assert(!strcmp(entry_name(_adapter_opt_spread_char), "adapter_spread/char"), ""); |
|
176 assert(!strcmp(entry_name(_adapter_opt_spread_double), "adapter_spread/double"), ""); |
|
177 assert(!strcmp(entry_name(_adapter_opt_collect_int), "adapter_collect/int"), ""); |
|
178 assert(!strcmp(entry_name(_adapter_opt_collect_0_ref), "adapter_collect/0/ref"), ""); |
|
179 assert(!strcmp(entry_name(_adapter_opt_collect_2_S3_ref), "adapter_collect/2/S3/ref"), ""); |
|
180 assert(!strcmp(entry_name(_adapter_opt_filter_S5_ref), "adapter_filter/S5/ref"), ""); |
|
181 assert(!strcmp(entry_name(_adapter_opt_fold_3_ref), "adapter_fold/3/ref"), ""); |
|
182 assert(!strcmp(entry_name(_adapter_opt_fold_void), "adapter_fold/void"), ""); |
106 return true; |
183 return true; |
107 } |
184 } |
108 #endif |
185 #endif |
109 |
186 |
110 |
187 |
111 //------------------------------------------------------------------------------ |
188 //------------------------------------------------------------------------------ |
112 // MethodHandles::generate_adapters |
189 // MethodHandles::generate_adapters |
113 // |
190 // |
114 void MethodHandles::generate_adapters() { |
191 void MethodHandles::generate_adapters() { |
|
192 #ifdef TARGET_ARCH_NYI_6939861 |
|
193 if (FLAG_IS_DEFAULT(UseRicochetFrames)) UseRicochetFrames = false; |
|
194 #endif |
115 if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return; |
195 if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return; |
116 |
196 |
117 assert(_adapter_code == NULL, "generate only once"); |
197 assert(_adapter_code == NULL, "generate only once"); |
118 |
198 |
119 ResourceMark rm; |
199 ResourceMark rm; |
124 CodeBuffer code(_adapter_code); |
204 CodeBuffer code(_adapter_code); |
125 MethodHandlesAdapterGenerator g(&code); |
205 MethodHandlesAdapterGenerator g(&code); |
126 g.generate(); |
206 g.generate(); |
127 } |
207 } |
128 |
208 |
129 |
|
130 //------------------------------------------------------------------------------ |
209 //------------------------------------------------------------------------------ |
131 // MethodHandlesAdapterGenerator::generate |
210 // MethodHandlesAdapterGenerator::generate |
132 // |
211 // |
133 void MethodHandlesAdapterGenerator::generate() { |
212 void MethodHandlesAdapterGenerator::generate() { |
134 // Generate generic method handle adapters. |
213 // Generate generic method handle adapters. |
135 for (MethodHandles::EntryKind ek = MethodHandles::_EK_FIRST; |
214 for (MethodHandles::EntryKind ek = MethodHandles::_EK_FIRST; |
136 ek < MethodHandles::_EK_LIMIT; |
215 ek < MethodHandles::_EK_LIMIT; |
137 ek = MethodHandles::EntryKind(1 + (int)ek)) { |
216 ek = MethodHandles::EntryKind(1 + (int)ek)) { |
138 StubCodeMark mark(this, "MethodHandle", MethodHandles::entry_name(ek)); |
217 if (MethodHandles::ek_supported(ek)) { |
139 MethodHandles::generate_method_handle_stub(_masm, ek); |
218 StubCodeMark mark(this, "MethodHandle", MethodHandles::entry_name(ek)); |
140 } |
219 MethodHandles::generate_method_handle_stub(_masm, ek); |
|
220 } |
|
221 } |
|
222 } |
|
223 |
|
224 |
|
225 #ifdef TARGET_ARCH_NYI_6939861 |
|
226 // these defs belong in methodHandles_<arch>.cpp |
|
227 frame MethodHandles::ricochet_frame_sender(const frame& fr, RegisterMap *map) { |
|
228 ShouldNotCallThis(); |
|
229 return fr; |
|
230 } |
|
231 void MethodHandles::ricochet_frame_oops_do(const frame& fr, OopClosure* f, const RegisterMap* reg_map) { |
|
232 ShouldNotCallThis(); |
|
233 } |
|
234 #endif //TARGET_ARCH_NYI_6939861 |
|
235 |
|
236 |
|
237 //------------------------------------------------------------------------------ |
|
238 // MethodHandles::ek_supported |
|
239 // |
|
240 bool MethodHandles::ek_supported(MethodHandles::EntryKind ek) { |
|
241 MethodHandles::EntryKind ek_orig = MethodHandles::ek_original_kind(ek); |
|
242 switch (ek_orig) { |
|
243 case _adapter_unused_13: |
|
244 return false; // not defined yet |
|
245 case _adapter_prim_to_ref: |
|
246 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_REF); |
|
247 case _adapter_collect_args: |
|
248 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_COLLECT_ARGS); |
|
249 case _adapter_fold_args: |
|
250 return UseRicochetFrames && conv_op_supported(java_lang_invoke_AdapterMethodHandle::OP_FOLD_ARGS); |
|
251 case _adapter_opt_return_any: |
|
252 return UseRicochetFrames; |
|
253 #ifdef TARGET_ARCH_NYI_6939861 |
|
254 // ports before 6939861 supported only three kinds of spread ops |
|
255 case _adapter_spread_args: |
|
256 // restrict spreads to three kinds: |
|
257 switch (ek) { |
|
258 case _adapter_opt_spread_0: |
|
259 case _adapter_opt_spread_1: |
|
260 case _adapter_opt_spread_more: |
|
261 break; |
|
262 default: |
|
263 return false; |
|
264 break; |
|
265 } |
|
266 break; |
|
267 #endif //TARGET_ARCH_NYI_6939861 |
|
268 } |
|
269 return true; |
141 } |
270 } |
142 |
271 |
143 |
272 |
144 void MethodHandles::set_enabled(bool z) { |
273 void MethodHandles::set_enabled(bool z) { |
145 if (_enabled != z) { |
274 if (_enabled != z) { |
1767 |
1894 |
1768 Handle argument(THREAD, java_lang_invoke_AdapterMethodHandle::argument(mh())); |
1895 Handle argument(THREAD, java_lang_invoke_AdapterMethodHandle::argument(mh())); |
1769 Handle target(THREAD, java_lang_invoke_AdapterMethodHandle::vmtarget(mh())); |
1896 Handle target(THREAD, java_lang_invoke_AdapterMethodHandle::vmtarget(mh())); |
1770 Handle src_mtype(THREAD, java_lang_invoke_MethodHandle::type(mh())); |
1897 Handle src_mtype(THREAD, java_lang_invoke_MethodHandle::type(mh())); |
1771 Handle dst_mtype(THREAD, java_lang_invoke_MethodHandle::type(target())); |
1898 Handle dst_mtype(THREAD, java_lang_invoke_MethodHandle::type(target())); |
|
1899 Handle arg_mtype; |
1772 |
1900 |
1773 const char* err = NULL; |
1901 const char* err = NULL; |
1774 |
1902 |
1775 if (err == NULL) { |
1903 if (err == NULL) { |
1776 // Check that the correct argument is supplied, but only if it is required. |
1904 // Check that the correct argument is supplied, but only if it is required. |
1777 switch (ek) { |
1905 switch (ek) { |
1778 case _adapter_check_cast: // target type of cast |
1906 case _adapter_check_cast: // target type of cast |
1779 case _adapter_ref_to_prim: // wrapper type from which to unbox |
1907 case _adapter_ref_to_prim: // wrapper type from which to unbox |
1780 case _adapter_prim_to_ref: // wrapper type to box into |
|
1781 case _adapter_collect_args: // array type to collect into |
|
1782 case _adapter_spread_args: // array type to spread from |
1908 case _adapter_spread_args: // array type to spread from |
1783 if (!java_lang_Class::is_instance(argument()) |
1909 if (!java_lang_Class::is_instance(argument()) |
1784 || java_lang_Class::is_primitive(argument())) |
1910 || java_lang_Class::is_primitive(argument())) |
1785 { err = "adapter requires argument of type java.lang.Class"; break; } |
1911 { err = "adapter requires argument of type java.lang.Class"; break; } |
1786 if (ek == _adapter_collect_args || |
1912 if (ek == _adapter_spread_args) { |
1787 ek == _adapter_spread_args) { |
|
1788 // Make sure it is a suitable collection type. (Array, for now.) |
1913 // Make sure it is a suitable collection type. (Array, for now.) |
1789 Klass* ak = Klass::cast(java_lang_Class::as_klassOop(argument())); |
1914 Klass* ak = Klass::cast(java_lang_Class::as_klassOop(argument())); |
1790 if (!ak->oop_is_objArray()) { |
1915 if (!ak->oop_is_array()) |
1791 { err = "adapter requires argument of type java.lang.Class<Object[]>"; break; } |
1916 { err = "spread adapter requires argument representing an array class"; break; } |
1792 } |
1917 BasicType et = arrayKlass::cast(ak->as_klassOop())->element_type(); |
|
1918 if (et != dest && stack_move <= 0) |
|
1919 { err = "spread adapter requires array class argument of correct type"; break; } |
1793 } |
1920 } |
1794 break; |
1921 break; |
1795 case _adapter_flyby: |
1922 case _adapter_prim_to_ref: // boxer MH to use |
1796 case _adapter_ricochet: |
1923 case _adapter_collect_args: // method handle which collects the args |
|
1924 case _adapter_fold_args: // method handle which collects the args |
|
1925 if (!UseRicochetFrames) { |
|
1926 { err = "box/collect/fold operators are not supported"; break; } |
|
1927 } |
1797 if (!java_lang_invoke_MethodHandle::is_instance(argument())) |
1928 if (!java_lang_invoke_MethodHandle::is_instance(argument())) |
1798 { err = "MethodHandle adapter argument required"; break; } |
1929 { err = "MethodHandle adapter argument required"; break; } |
|
1930 arg_mtype = Handle(THREAD, java_lang_invoke_MethodHandle::type(argument())); |
1799 break; |
1931 break; |
1800 default: |
1932 default: |
1801 if (argument.not_null()) |
1933 if (argument.not_null()) |
1802 { err = "adapter has spurious argument"; break; } |
1934 { err = "adapter has spurious argument"; break; } |
1803 break; |
1935 break; |
1804 } |
1936 } |
1805 } |
1937 } |
1806 |
1938 |
1807 if (err == NULL) { |
1939 if (err == NULL) { |
1808 // Check that the src/dest types are supplied if needed. |
1940 // Check that the src/dest types are supplied if needed. |
|
1941 // Also check relevant parameter or return types. |
1809 switch (ek) { |
1942 switch (ek) { |
1810 case _adapter_check_cast: |
1943 case _adapter_check_cast: |
1811 if (src != T_OBJECT || dest != T_OBJECT) { |
1944 if (src != T_OBJECT || dest != T_OBJECT) { |
1812 err = "adapter requires object src/dest conversion subfields"; |
1945 err = "adapter requires object src/dest conversion subfields"; |
1813 } |
1946 } |
1826 || argument() != Klass::cast(SystemDictionary::box_klass(dest))->java_mirror()) { |
1959 || argument() != Klass::cast(SystemDictionary::box_klass(dest))->java_mirror()) { |
1827 err = "adapter requires primitive dest conversion subfield"; break; |
1960 err = "adapter requires primitive dest conversion subfield"; break; |
1828 } |
1961 } |
1829 break; |
1962 break; |
1830 case _adapter_prim_to_ref: |
1963 case _adapter_prim_to_ref: |
1831 if (!is_java_primitive(src) || dest != T_OBJECT |
1964 if (!is_java_primitive(src) || dest != T_OBJECT) { |
1832 || argument() != Klass::cast(SystemDictionary::box_klass(src))->java_mirror()) { |
|
1833 err = "adapter requires primitive src conversion subfield"; break; |
1965 err = "adapter requires primitive src conversion subfield"; break; |
1834 } |
1966 } |
1835 break; |
1967 break; |
1836 case _adapter_swap_args: |
1968 case _adapter_swap_args: |
1837 case _adapter_rot_args: |
1969 case _adapter_rot_args: |
1838 { |
1970 { |
1839 if (!src || src != dest) { |
1971 if (!src || src != dest) { |
1840 err = "adapter requires src/dest conversion subfields for swap"; break; |
1972 err = "adapter requires src/dest conversion subfields for swap"; break; |
1841 } |
1973 } |
1842 int swap_size = type2size[src]; |
1974 int swap_size = type2size[src]; |
1843 oop src_mtype = java_lang_invoke_AdapterMethodHandle::type(mh()); |
1975 int slot_limit = java_lang_invoke_MethodHandle::vmslots(target()); |
1844 oop dest_mtype = java_lang_invoke_AdapterMethodHandle::type(target()); |
|
1845 int slot_limit = java_lang_invoke_AdapterMethodHandle::vmslots(target()); |
|
1846 int src_slot = argslot; |
1976 int src_slot = argslot; |
1847 int dest_slot = vminfo; |
1977 int dest_slot = vminfo; |
1848 bool rotate_up = (src_slot > dest_slot); // upward rotation |
1978 bool rotate_up = (src_slot > dest_slot); // upward rotation |
1849 int src_arg = argnum; |
1979 int src_arg = argnum; |
1850 int dest_arg = argument_slot_to_argnum(dest_mtype, dest_slot); |
1980 int dest_arg = argument_slot_to_argnum(dst_mtype(), dest_slot); |
1851 verify_vmargslot(mh, dest_arg, dest_slot, CHECK); |
1981 verify_vmargslot(mh, dest_arg, dest_slot, CHECK); |
1852 if (!(dest_slot >= src_slot + swap_size) && |
1982 if (!(dest_slot >= src_slot + swap_size) && |
1853 !(src_slot >= dest_slot + swap_size)) { |
1983 !(src_slot >= dest_slot + swap_size)) { |
1854 err = "source, destination slots must be distinct"; |
1984 err = "source, destination slots must be distinct"; |
1855 } else if (ek == _adapter_swap_args && !(src_slot > dest_slot)) { |
1985 } else if (ek == _adapter_swap_args && !(src_slot > dest_slot)) { |
1856 err = "source of swap must be deeper in stack"; |
1986 err = "source of swap must be deeper in stack"; |
1857 } else if (ek == _adapter_swap_args) { |
1987 } else if (ek == _adapter_swap_args) { |
1858 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype, dest_arg), |
1988 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), dest_arg), |
1859 java_lang_invoke_MethodType::ptype(dest_mtype, src_arg), |
1989 java_lang_invoke_MethodType::ptype(dst_mtype(), src_arg), |
1860 dest_arg); |
1990 dest_arg); |
1861 } else if (ek == _adapter_rot_args) { |
1991 } else if (ek == _adapter_rot_args) { |
1862 if (rotate_up) { |
1992 if (rotate_up) { |
1863 assert((src_slot > dest_slot) && (src_arg < dest_arg), ""); |
1993 assert((src_slot > dest_slot) && (src_arg < dest_arg), ""); |
1864 // rotate up: [dest_slot..src_slot-ss] --> [dest_slot+ss..src_slot] |
1994 // rotate up: [dest_slot..src_slot-ss] --> [dest_slot+ss..src_slot] |
1865 // that is: [src_arg+1..dest_arg] --> [src_arg..dest_arg-1] |
1995 // that is: [src_arg+1..dest_arg] --> [src_arg..dest_arg-1] |
1866 for (int i = src_arg+1; i <= dest_arg && err == NULL; i++) { |
1996 for (int i = src_arg+1; i <= dest_arg && err == NULL; i++) { |
1867 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype, i), |
1997 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), |
1868 java_lang_invoke_MethodType::ptype(dest_mtype, i-1), |
1998 java_lang_invoke_MethodType::ptype(dst_mtype(), i-1), |
1869 i); |
1999 i); |
1870 } |
2000 } |
1871 } else { // rotate down |
2001 } else { // rotate down |
1872 assert((src_slot < dest_slot) && (src_arg > dest_arg), ""); |
2002 assert((src_slot < dest_slot) && (src_arg > dest_arg), ""); |
1873 // rotate down: [src_slot+ss..dest_slot] --> [src_slot..dest_slot-ss] |
2003 // rotate down: [src_slot+ss..dest_slot] --> [src_slot..dest_slot-ss] |
1874 // that is: [dest_arg..src_arg-1] --> [dst_arg+1..src_arg] |
2004 // that is: [dest_arg..src_arg-1] --> [dst_arg+1..src_arg] |
1875 for (int i = dest_arg; i <= src_arg-1 && err == NULL; i++) { |
2005 for (int i = dest_arg; i <= src_arg-1 && err == NULL; i++) { |
1876 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype, i), |
2006 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), i), |
1877 java_lang_invoke_MethodType::ptype(dest_mtype, i+1), |
2007 java_lang_invoke_MethodType::ptype(dst_mtype(), i+1), |
1878 i); |
2008 i); |
1879 } |
2009 } |
1880 } |
2010 } |
1881 } |
2011 } |
1882 if (err == NULL) |
2012 if (err == NULL) |
1883 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype, src_arg), |
2013 err = check_argument_type_change(java_lang_invoke_MethodType::ptype(src_mtype(), src_arg), |
1884 java_lang_invoke_MethodType::ptype(dest_mtype, dest_arg), |
2014 java_lang_invoke_MethodType::ptype(dst_mtype(), dest_arg), |
1885 src_arg); |
2015 src_arg); |
1886 } |
2016 } |
1887 break; |
2017 break; |
|
2018 case _adapter_spread_args: |
1888 case _adapter_collect_args: |
2019 case _adapter_collect_args: |
1889 case _adapter_spread_args: |
2020 case _adapter_fold_args: |
1890 { |
2021 { |
1891 BasicType coll_type = (ek == _adapter_collect_args) ? dest : src; |
2022 bool is_spread = (ek == _adapter_spread_args); |
1892 BasicType elem_type = (ek == _adapter_collect_args) ? src : dest; |
2023 bool is_fold = (ek == _adapter_fold_args); |
1893 if (coll_type != T_OBJECT || elem_type != T_OBJECT) { |
2024 BasicType coll_type = is_spread ? src : dest; |
1894 err = "adapter requires src/dest subfields"; break; |
2025 BasicType elem_type = is_spread ? dest : src; |
1895 // later: |
2026 // coll_type is type of args in collected form (or T_VOID if none) |
1896 // - consider making coll be a primitive array |
2027 // elem_type is common type of args in spread form (or T_VOID if missing or heterogeneous) |
1897 // - consider making coll be a heterogeneous collection |
2028 if (coll_type == 0 || elem_type == 0) { |
|
2029 err = "adapter requires src/dest subfields for spread or collect"; break; |
|
2030 } |
|
2031 if (is_spread && coll_type != T_OBJECT) { |
|
2032 err = "spread adapter requires object type for argument bundle"; break; |
|
2033 } |
|
2034 Handle spread_mtype = (is_spread ? dst_mtype : src_mtype); |
|
2035 int spread_slot = argslot; |
|
2036 int spread_arg = argnum; |
|
2037 int slots_pushed = stack_move / stack_move_unit(); |
|
2038 int coll_slot_count = type2size[coll_type]; |
|
2039 int spread_slot_count = (is_spread ? slots_pushed : -slots_pushed) + coll_slot_count; |
|
2040 if (is_fold) spread_slot_count = argument_slot_count(arg_mtype()); |
|
2041 if (!is_spread) { |
|
2042 int init_slots = argument_slot_count(src_mtype()); |
|
2043 int coll_slots = argument_slot_count(arg_mtype()); |
|
2044 if (spread_slot_count > init_slots || |
|
2045 spread_slot_count != coll_slots) { |
|
2046 err = "collect adapter has inconsistent arg counts"; break; |
|
2047 } |
|
2048 int next_slots = argument_slot_count(dst_mtype()); |
|
2049 int unchanged_slots_in = (init_slots - spread_slot_count); |
|
2050 int unchanged_slots_out = (next_slots - coll_slot_count - (is_fold ? spread_slot_count : 0)); |
|
2051 if (unchanged_slots_in != unchanged_slots_out) { |
|
2052 err = "collect adapter continuation has inconsistent arg counts"; break; |
|
2053 } |
1898 } |
2054 } |
1899 } |
2055 } |
1900 break; |
2056 break; |
1901 default: |
2057 default: |
1902 if (src != 0 || dest != 0) { |
2058 if (src != 0 || dest != 0) { |
1948 err = "stack_move conversion subfield must be multiple of stack_move_unit"; |
2105 err = "stack_move conversion subfield must be multiple of stack_move_unit"; |
1949 } |
2106 } |
1950 } |
2107 } |
1951 |
2108 |
1952 if (err == NULL) { |
2109 if (err == NULL) { |
1953 // Make sure this adapter does not push too deeply. |
2110 // Make sure this adapter's stack pushing is accurately recorded. |
1954 int slots_pushed = stack_move / stack_move_unit(); |
2111 int slots_pushed = stack_move / stack_move_unit(); |
1955 int this_vmslots = java_lang_invoke_MethodHandle::vmslots(mh()); |
2112 int this_vmslots = java_lang_invoke_MethodHandle::vmslots(mh()); |
1956 int target_vmslots = java_lang_invoke_MethodHandle::vmslots(target()); |
2113 int target_vmslots = java_lang_invoke_MethodHandle::vmslots(target()); |
|
2114 int target_pushes = decode_MethodHandle_stack_pushes(target()); |
1957 if (slots_pushed != (target_vmslots - this_vmslots)) { |
2115 if (slots_pushed != (target_vmslots - this_vmslots)) { |
1958 err = "stack_move inconsistent with previous and current MethodType vmslots"; |
2116 err = "stack_move inconsistent with previous and current MethodType vmslots"; |
1959 } else if (slots_pushed > 0) { |
2117 } else { |
1960 // verify stack_move against MethodHandlePushLimit |
2118 int this_pushes = decode_MethodHandle_stack_pushes(mh()); |
1961 int target_pushes = decode_MethodHandle_stack_pushes(target()); |
2119 if (slots_pushed + target_pushes != this_pushes) { |
1962 // do not blow the stack; use a Java-based adapter if this limit is exceeded |
2120 if (this_pushes == 0) |
1963 if (slots_pushed + target_pushes > MethodHandlePushLimit) { |
2121 err = "adapter push count not initialized"; |
1964 err = "adapter pushes too many parameters"; |
2122 else |
|
2123 err = "adapter push count is wrong"; |
1965 } |
2124 } |
1966 } |
2125 } |
1967 |
2126 |
1968 // While we're at it, check that the stack motion decoder works: |
2127 // While we're at it, check that the stack motion decoder works: |
1969 DEBUG_ONLY(int target_pushes = decode_MethodHandle_stack_pushes(target())); |
|
1970 DEBUG_ONLY(int this_pushes = decode_MethodHandle_stack_pushes(mh())); |
2128 DEBUG_ONLY(int this_pushes = decode_MethodHandle_stack_pushes(mh())); |
1971 assert(this_pushes == slots_pushed + target_pushes, "AMH stack motion must be correct"); |
2129 assert(this_pushes == slots_pushed + target_pushes, "AMH stack motion must be correct"); |
1972 } |
2130 } |
1973 |
2131 |
1974 if (err == NULL && vminfo != 0) { |
2132 if (err == NULL && vminfo != 0) { |
1975 switch (ek) { |
2133 switch (ek) { |
1976 case _adapter_swap_args: |
2134 case _adapter_swap_args: |
1977 case _adapter_rot_args: |
2135 case _adapter_rot_args: |
1978 break; // OK |
2136 case _adapter_prim_to_ref: |
|
2137 case _adapter_collect_args: |
|
2138 case _adapter_fold_args: |
|
2139 break; // OK |
1979 default: |
2140 default: |
1980 err = "vminfo subfield is reserved to the JVM"; |
2141 err = "vminfo subfield is reserved to the JVM"; |
1981 } |
2142 } |
1982 } |
2143 } |
1983 |
2144 |
2024 jint conv_op = adapter_conversion_op(conversion); |
2185 jint conv_op = adapter_conversion_op(conversion); |
2025 |
2186 |
2026 // adjust the adapter code to the internal EntryKind enumeration: |
2187 // adjust the adapter code to the internal EntryKind enumeration: |
2027 EntryKind ek_orig = adapter_entry_kind(conv_op); |
2188 EntryKind ek_orig = adapter_entry_kind(conv_op); |
2028 EntryKind ek_opt = ek_orig; // may be optimized |
2189 EntryKind ek_opt = ek_orig; // may be optimized |
|
2190 EntryKind ek_try; // temp |
2029 |
2191 |
2030 // Finalize the vmtarget field (Java initialized it to null). |
2192 // Finalize the vmtarget field (Java initialized it to null). |
2031 if (!java_lang_invoke_MethodHandle::is_instance(target())) { |
2193 if (!java_lang_invoke_MethodHandle::is_instance(target())) { |
2032 throw_InternalError_for_bad_conversion(conversion, "bad target", THREAD); |
2194 throw_InternalError_for_bad_conversion(conversion, "bad target", THREAD); |
2033 return; |
2195 return; |
2034 } |
2196 } |
2035 java_lang_invoke_AdapterMethodHandle::set_vmtarget(mh(), target()); |
2197 java_lang_invoke_AdapterMethodHandle::set_vmtarget(mh(), target()); |
2036 |
2198 |
2037 if (VerifyMethodHandles) { |
|
2038 verify_AdapterMethodHandle(mh, argnum, CHECK); |
|
2039 } |
|
2040 |
|
2041 int stack_move = adapter_conversion_stack_move(conversion); |
2199 int stack_move = adapter_conversion_stack_move(conversion); |
2042 BasicType src = adapter_conversion_src_type(conversion); |
2200 BasicType src = adapter_conversion_src_type(conversion); |
2043 BasicType dest = adapter_conversion_dest_type(conversion); |
2201 BasicType dest = adapter_conversion_dest_type(conversion); |
2044 int vminfo = adapter_conversion_vminfo(conversion); // should be zero |
2202 int vminfo = adapter_conversion_vminfo(conversion); // should be zero |
2045 |
2203 |
|
2204 int slots_pushed = stack_move / stack_move_unit(); |
|
2205 |
|
2206 if (VerifyMethodHandles) { |
|
2207 verify_AdapterMethodHandle(mh, argnum, CHECK); |
|
2208 } |
|
2209 |
2046 const char* err = NULL; |
2210 const char* err = NULL; |
|
2211 |
|
2212 if (!conv_op_supported(conv_op)) { |
|
2213 err = "adapter not yet implemented in the JVM"; |
|
2214 } |
2047 |
2215 |
2048 // Now it's time to finish the case analysis and pick a MethodHandleEntry. |
2216 // Now it's time to finish the case analysis and pick a MethodHandleEntry. |
2049 switch (ek_orig) { |
2217 switch (ek_orig) { |
2050 case _adapter_retype_only: |
2218 case _adapter_retype_only: |
2051 case _adapter_retype_raw: |
2219 case _adapter_retype_raw: |
2134 break; |
2339 break; |
2135 } |
2340 } |
2136 } |
2341 } |
2137 break; |
2342 break; |
2138 |
2343 |
2139 case _adapter_collect_args: |
|
2140 goto throw_not_impl; // allocates, hence could block |
|
2141 |
|
2142 case _adapter_spread_args: |
2344 case _adapter_spread_args: |
2143 { |
2345 { |
|
2346 #ifdef TARGET_ARCH_NYI_6939861 |
|
2347 // ports before 6939861 supported only three kinds of spread ops |
|
2348 if (!UseRicochetFrames) { |
|
2349 int array_size = slots_pushed + 1; |
|
2350 assert(array_size >= 0, ""); |
|
2351 vminfo = array_size; |
|
2352 switch (array_size) { |
|
2353 case 0: ek_opt = _adapter_opt_spread_0; break; |
|
2354 case 1: ek_opt = _adapter_opt_spread_1; break; |
|
2355 default: ek_opt = _adapter_opt_spread_more; break; |
|
2356 } |
|
2357 break; |
|
2358 } |
|
2359 #endif //TARGET_ARCH_NYI_6939861 |
2144 // vminfo will be the required length of the array |
2360 // vminfo will be the required length of the array |
2145 int slots_pushed = stack_move / stack_move_unit(); |
2361 int array_size = (slots_pushed + 1) / (type2size[dest] == 2 ? 2 : 1); |
2146 int array_size = slots_pushed + 1; |
|
2147 assert(array_size >= 0, ""); |
|
2148 vminfo = array_size; |
2362 vminfo = array_size; |
2149 switch (array_size) { |
2363 // general case |
2150 case 0: ek_opt = _adapter_opt_spread_0; break; |
2364 switch (dest) { |
2151 case 1: ek_opt = _adapter_opt_spread_1; break; |
2365 case T_BOOLEAN : // fall through to T_BYTE: |
2152 default: ek_opt = _adapter_opt_spread_more; break; |
2366 case T_BYTE : ek_opt = _adapter_opt_spread_byte; break; |
2153 } |
2367 case T_CHAR : ek_opt = _adapter_opt_spread_char; break; |
2154 if ((vminfo & CONV_VMINFO_MASK) != vminfo) |
2368 case T_SHORT : ek_opt = _adapter_opt_spread_short; break; |
2155 goto throw_not_impl; // overflow |
2369 case T_INT : ek_opt = _adapter_opt_spread_int; break; |
|
2370 case T_LONG : ek_opt = _adapter_opt_spread_long; break; |
|
2371 case T_FLOAT : ek_opt = _adapter_opt_spread_float; break; |
|
2372 case T_DOUBLE : ek_opt = _adapter_opt_spread_double; break; |
|
2373 case T_OBJECT : ek_opt = _adapter_opt_spread_ref; break; |
|
2374 case T_VOID : if (array_size != 0) goto throw_not_impl; |
|
2375 ek_opt = _adapter_opt_spread_ref; break; |
|
2376 default : goto throw_not_impl; |
|
2377 } |
|
2378 assert(array_size == 0 || // it doesn't matter what the spreader is |
|
2379 (ek_adapter_opt_spread_count(ek_opt) == -1 && |
|
2380 (ek_adapter_opt_spread_type(ek_opt) == dest || |
|
2381 (ek_adapter_opt_spread_type(ek_opt) == T_BYTE && dest == T_BOOLEAN))), |
|
2382 err_msg("dest=%d ek_opt=%d", dest, ek_opt)); |
|
2383 |
|
2384 if (array_size <= 0) { |
|
2385 // since the general case does not handle length 0, this case is required: |
|
2386 ek_opt = _adapter_opt_spread_0; |
|
2387 break; |
|
2388 } |
|
2389 if (dest == T_OBJECT) { |
|
2390 ek_try = EntryKind(_adapter_opt_spread_1_ref - 1 + array_size); |
|
2391 if (ek_try < _adapter_opt_spread_LAST && |
|
2392 ek_adapter_opt_spread_count(ek_try) == array_size) { |
|
2393 assert(ek_adapter_opt_spread_type(ek_try) == dest, ""); |
|
2394 ek_opt = ek_try; |
|
2395 break; |
|
2396 } |
|
2397 } |
|
2398 break; |
2156 } |
2399 } |
2157 break; |
2400 break; |
2158 |
2401 |
2159 case _adapter_flyby: |
2402 case _adapter_collect_args: |
2160 case _adapter_ricochet: |
2403 { |
2161 goto throw_not_impl; // runs Java code, hence could block |
2404 assert(UseRicochetFrames, "else don't come here"); |
|
2405 int elem_slots = argument_slot_count( |
|
2406 java_lang_invoke_MethodHandle::type( |
|
2407 java_lang_invoke_AdapterMethodHandle::argument(mh()) ) ); |
|
2408 // vminfo will be the location to insert the return value |
|
2409 vminfo = argslot; |
|
2410 ensure_vmlayout_field(target, CHECK); |
|
2411 |
|
2412 // general case: |
|
2413 switch (dest) { |
|
2414 default : if (!is_subword_type(dest)) goto throw_not_impl; |
|
2415 // else fall through: |
|
2416 case T_INT : ek_opt = _adapter_opt_collect_int; break; |
|
2417 case T_LONG : ek_opt = _adapter_opt_collect_long; break; |
|
2418 case T_FLOAT : ek_opt = _adapter_opt_collect_float; break; |
|
2419 case T_DOUBLE : ek_opt = _adapter_opt_collect_double; break; |
|
2420 case T_OBJECT : ek_opt = _adapter_opt_collect_ref; break; |
|
2421 case T_VOID : ek_opt = _adapter_opt_collect_void; break; |
|
2422 } |
|
2423 assert(ek_adapter_opt_collect_slot(ek_opt) == -1 && |
|
2424 ek_adapter_opt_collect_count(ek_opt) == -1 && |
|
2425 (ek_adapter_opt_collect_type(ek_opt) == dest || |
|
2426 ek_adapter_opt_collect_type(ek_opt) == T_INT && is_subword_type(dest)), |
|
2427 ""); |
|
2428 |
|
2429 if (dest == T_OBJECT && elem_slots == 1 && OptimizeMethodHandles) { |
|
2430 // filter operation on a ref |
|
2431 ek_try = EntryKind(_adapter_opt_filter_S0_ref + argslot); |
|
2432 if (ek_try < _adapter_opt_collect_LAST && |
|
2433 ek_adapter_opt_collect_slot(ek_try) == argslot) { |
|
2434 assert(ek_adapter_opt_collect_count(ek_try) == elem_slots && |
|
2435 ek_adapter_opt_collect_type(ek_try) == dest, ""); |
|
2436 ek_opt = ek_try; |
|
2437 break; |
|
2438 } |
|
2439 ek_opt = _adapter_opt_collect_1_ref; |
|
2440 break; |
|
2441 } |
|
2442 |
|
2443 if (dest == T_OBJECT && elem_slots == 2 && OptimizeMethodHandles) { |
|
2444 // filter of two arguments |
|
2445 ek_try = EntryKind(_adapter_opt_collect_2_S0_ref + argslot); |
|
2446 if (ek_try < _adapter_opt_collect_LAST && |
|
2447 ek_adapter_opt_collect_slot(ek_try) == argslot) { |
|
2448 assert(ek_adapter_opt_collect_count(ek_try) == elem_slots && |
|
2449 ek_adapter_opt_collect_type(ek_try) == dest, ""); |
|
2450 ek_opt = ek_try; |
|
2451 break; |
|
2452 } |
|
2453 ek_opt = _adapter_opt_collect_2_ref; |
|
2454 break; |
|
2455 } |
|
2456 |
|
2457 if (dest == T_OBJECT && OptimizeMethodHandles) { |
|
2458 // try to use a fixed length adapter |
|
2459 ek_try = EntryKind(_adapter_opt_collect_0_ref + elem_slots); |
|
2460 if (ek_try < _adapter_opt_collect_LAST && |
|
2461 ek_adapter_opt_collect_count(ek_try) == elem_slots) { |
|
2462 assert(ek_adapter_opt_collect_slot(ek_try) == -1 && |
|
2463 ek_adapter_opt_collect_type(ek_try) == dest, ""); |
|
2464 ek_opt = ek_try; |
|
2465 break; |
|
2466 } |
|
2467 } |
|
2468 |
|
2469 break; |
|
2470 } |
|
2471 |
|
2472 case _adapter_fold_args: |
|
2473 { |
|
2474 assert(UseRicochetFrames, "else don't come here"); |
|
2475 int elem_slots = argument_slot_count( |
|
2476 java_lang_invoke_MethodHandle::type( |
|
2477 java_lang_invoke_AdapterMethodHandle::argument(mh()) ) ); |
|
2478 // vminfo will be the location to insert the return value |
|
2479 vminfo = argslot + elem_slots; |
|
2480 ensure_vmlayout_field(target, CHECK); |
|
2481 |
|
2482 switch (dest) { |
|
2483 default : if (!is_subword_type(dest)) goto throw_not_impl; |
|
2484 // else fall through: |
|
2485 case T_INT : ek_opt = _adapter_opt_fold_int; break; |
|
2486 case T_LONG : ek_opt = _adapter_opt_fold_long; break; |
|
2487 case T_FLOAT : ek_opt = _adapter_opt_fold_float; break; |
|
2488 case T_DOUBLE : ek_opt = _adapter_opt_fold_double; break; |
|
2489 case T_OBJECT : ek_opt = _adapter_opt_fold_ref; break; |
|
2490 case T_VOID : ek_opt = _adapter_opt_fold_void; break; |
|
2491 } |
|
2492 assert(ek_adapter_opt_collect_slot(ek_opt) == -1 && |
|
2493 ek_adapter_opt_collect_count(ek_opt) == -1 && |
|
2494 (ek_adapter_opt_collect_type(ek_opt) == dest || |
|
2495 ek_adapter_opt_collect_type(ek_opt) == T_INT && is_subword_type(dest)), |
|
2496 ""); |
|
2497 |
|
2498 if (dest == T_OBJECT && elem_slots == 0 && OptimizeMethodHandles) { |
|
2499 // if there are no args, just pretend it's a collect |
|
2500 ek_opt = _adapter_opt_collect_0_ref; |
|
2501 break; |
|
2502 } |
|
2503 |
|
2504 if (dest == T_OBJECT && OptimizeMethodHandles) { |
|
2505 // try to use a fixed length adapter |
|
2506 ek_try = EntryKind(_adapter_opt_fold_1_ref - 1 + elem_slots); |
|
2507 if (ek_try < _adapter_opt_fold_LAST && |
|
2508 ek_adapter_opt_collect_count(ek_try) == elem_slots) { |
|
2509 assert(ek_adapter_opt_collect_slot(ek_try) == -1 && |
|
2510 ek_adapter_opt_collect_type(ek_try) == dest, ""); |
|
2511 ek_opt = ek_try; |
|
2512 break; |
|
2513 } |
|
2514 } |
|
2515 |
|
2516 break; |
|
2517 } |
2162 |
2518 |
2163 default: |
2519 default: |
2164 // should have failed much earlier; must be a missing case here |
2520 // should have failed much earlier; must be a missing case here |
2165 assert(false, "incomplete switch"); |
2521 assert(false, "incomplete switch"); |
2166 // and fall through: |
2522 // and fall through: |
2167 |
2523 |
2168 throw_not_impl: |
2524 throw_not_impl: |
2169 // FIXME: these adapters are NYI |
2525 if (err == NULL) |
2170 err = "adapter not yet implemented in the JVM"; |
2526 err = "unknown adapter type"; |
2171 break; |
2527 break; |
|
2528 } |
|
2529 |
|
2530 if (err != NULL && (vminfo & CONV_VMINFO_MASK) != vminfo) { |
|
2531 // should not happen, since vminfo is used to encode arg/slot indexes < 255 |
|
2532 err = "vminfo overflow"; |
|
2533 } |
|
2534 |
|
2535 if (err != NULL && !have_entry(ek_opt)) { |
|
2536 err = "adapter stub for this kind of method handle is missing"; |
2172 } |
2537 } |
2173 |
2538 |
2174 if (err != NULL) { |
2539 if (err != NULL) { |
2175 throw_InternalError_for_bad_conversion(conversion, err, THREAD); |
2540 throw_InternalError_for_bad_conversion(conversion, err, THREAD); |
2176 return; |
2541 return; |
2186 java_lang_invoke_MethodHandle::set_vmentry(mh(), entry(ek_opt)); |
2551 java_lang_invoke_MethodHandle::set_vmentry(mh(), entry(ek_opt)); |
2187 |
2552 |
2188 // There should be enough memory barriers on exit from native methods |
2553 // There should be enough memory barriers on exit from native methods |
2189 // to ensure that the MH is fully initialized to all threads before |
2554 // to ensure that the MH is fully initialized to all threads before |
2190 // Java code can publish it in global data structures. |
2555 // Java code can publish it in global data structures. |
|
2556 } |
|
2557 |
|
2558 void MethodHandles::ensure_vmlayout_field(Handle target, TRAPS) { |
|
2559 Handle mtype(THREAD, java_lang_invoke_MethodHandle::type(target())); |
|
2560 Handle mtform(THREAD, java_lang_invoke_MethodType::form(mtype())); |
|
2561 if (mtform.is_null()) { THROW(vmSymbols::java_lang_InternalError()); } |
|
2562 if (java_lang_invoke_MethodTypeForm::vmlayout_offset_in_bytes() > 0) { |
|
2563 if (java_lang_invoke_MethodTypeForm::vmlayout(mtform()) == NULL) { |
|
2564 // fill it in |
|
2565 Handle erased_mtype(THREAD, java_lang_invoke_MethodTypeForm::erasedType(mtform())); |
|
2566 TempNewSymbol erased_signature |
|
2567 = java_lang_invoke_MethodType::as_signature(erased_mtype(), /*intern:*/true, CHECK); |
|
2568 methodOop cookie |
|
2569 = SystemDictionary::find_method_handle_invoke(vmSymbols::invokeExact_name(), |
|
2570 erased_signature, |
|
2571 SystemDictionaryHandles::Object_klass(), |
|
2572 THREAD); |
|
2573 java_lang_invoke_MethodTypeForm::init_vmlayout(mtform(), cookie); |
|
2574 } |
|
2575 } |
2191 } |
2576 } |
2192 |
2577 |
2193 // |
2578 // |
2194 // Here are the native methods on sun.invoke.MethodHandleImpl. |
2579 // Here are the native methods on sun.invoke.MethodHandleImpl. |
2195 // They are the private interface between this JVM and the HotSpot-specific |
2580 // They are the private interface between this JVM and the HotSpot-specific |
2383 template(java_lang_invoke_AdapterMethodHandle,OP_ROT_ARGS) \ |
2770 template(java_lang_invoke_AdapterMethodHandle,OP_ROT_ARGS) \ |
2384 template(java_lang_invoke_AdapterMethodHandle,OP_DUP_ARGS) \ |
2771 template(java_lang_invoke_AdapterMethodHandle,OP_DUP_ARGS) \ |
2385 template(java_lang_invoke_AdapterMethodHandle,OP_DROP_ARGS) \ |
2772 template(java_lang_invoke_AdapterMethodHandle,OP_DROP_ARGS) \ |
2386 template(java_lang_invoke_AdapterMethodHandle,OP_COLLECT_ARGS) \ |
2773 template(java_lang_invoke_AdapterMethodHandle,OP_COLLECT_ARGS) \ |
2387 template(java_lang_invoke_AdapterMethodHandle,OP_SPREAD_ARGS) \ |
2774 template(java_lang_invoke_AdapterMethodHandle,OP_SPREAD_ARGS) \ |
2388 template(java_lang_invoke_AdapterMethodHandle,OP_FLYBY) \ |
2775 /* hold back this one until JDK stabilizes */ \ |
2389 template(java_lang_invoke_AdapterMethodHandle,OP_RICOCHET) \ |
2776 /*template(java_lang_invoke_AdapterMethodHandle,CONV_OP_LIMIT)*/ \ |
2390 template(java_lang_invoke_AdapterMethodHandle,CONV_OP_LIMIT) \ |
|
2391 template(java_lang_invoke_AdapterMethodHandle,CONV_OP_MASK) \ |
2777 template(java_lang_invoke_AdapterMethodHandle,CONV_OP_MASK) \ |
2392 template(java_lang_invoke_AdapterMethodHandle,CONV_VMINFO_MASK) \ |
2778 template(java_lang_invoke_AdapterMethodHandle,CONV_VMINFO_MASK) \ |
2393 template(java_lang_invoke_AdapterMethodHandle,CONV_VMINFO_SHIFT) \ |
2779 template(java_lang_invoke_AdapterMethodHandle,CONV_VMINFO_SHIFT) \ |
2394 template(java_lang_invoke_AdapterMethodHandle,CONV_OP_SHIFT) \ |
2780 template(java_lang_invoke_AdapterMethodHandle,CONV_OP_SHIFT) \ |
2395 template(java_lang_invoke_AdapterMethodHandle,CONV_DEST_TYPE_SHIFT) \ |
2781 template(java_lang_invoke_AdapterMethodHandle,CONV_DEST_TYPE_SHIFT) \ |