Mercurial > hg > graal-compiler
annotate src/share/vm/prims/methodHandles.hpp @ 8051:12e01444ca2d
8006683: Add WhiteBox API to testing of compiler
Reviewed-by: kvn, vlivanov
author | iignatyev |
---|---|
date | Wed, 13 Feb 2013 08:29:04 -0800 |
parents | 65d07d9ee446 |
children | 6337ca4dcad8 |
rev | line source |
---|---|
710 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. |
710 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
21 * questions. |
710 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_PRIMS_METHODHANDLES_HPP |
26 #define SHARE_VM_PRIMS_METHODHANDLES_HPP | |
27 | |
28 #include "classfile/javaClasses.hpp" | |
29 #include "classfile/vmSymbols.hpp" | |
30 #include "runtime/frame.inline.hpp" | |
31 #include "runtime/globals.hpp" | |
32 #include "runtime/interfaceSupport.hpp" | |
33 | |
710 | 34 class MacroAssembler; |
35 class Label; | |
36 | |
37 class MethodHandles: AllStatic { | |
38 // 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
|
39 // 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
|
40 // See also javaClasses for layouts java_lang_invoke_Method{Handle,Type,Type::Form}. |
710 | 41 public: |
42 public: | |
43 static bool enabled() { return _enabled; } | |
44 static void set_enabled(bool z); | |
45 | |
46 private: | |
47 static bool _enabled; | |
1039
987e948ebbc8
6815692: method handle code needs some cleanup (post-6655638)
jrose
parents:
710
diff
changeset
|
48 |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
49 // Adapters. |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
50 static MethodHandlesAdapterBlob* _adapter_code; |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
51 |
710 | 52 public: |
53 // working with member names | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
54 static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type |
710 | 55 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
|
56 static Handle new_MemberName(TRAPS); // must be followed by init_MemberName |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
57 static oop init_MemberName(oop mname_oop, oop target_oop); // compute vmtarget/vmindex from target |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
58 static oop init_method_MemberName(oop mname_oop, Method* m, bool do_dispatch, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
59 Klass* receiver_limit); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
60 static oop init_field_MemberName(oop mname_oop, Klass* field_holder, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
61 AccessFlags mods, oop type, oop name, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
62 intptr_t offset, bool is_setter = false); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
63 static Handle init_method_MemberName(oop mname_oop, CallInfo& info, TRAPS); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
64 static Handle init_field_MemberName(oop mname_oop, FieldAccessInfo& info, TRAPS); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
65 static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
66 static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
67 int mflags, Klass* caller, |
710 | 68 int skip, objArrayOop results); |
69 // bit values for suppress argument to expand_MemberName: | |
70 enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 }; | |
71 | |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
72 // Generate MethodHandles adapters. |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
73 static void generate_adapters(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
74 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
75 // Called from MethodHandlesAdapterGenerator. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
76 static address generate_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
77 static void generate_method_handle_dispatch(MacroAssembler* _masm, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
78 vmIntrinsics::ID iid, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
79 Register receiver_reg, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
80 Register member_reg, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
81 bool for_compiler_entry); |
710 | 82 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
83 // Queries |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
84 static bool is_signature_polymorphic(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
85 return (iid >= vmIntrinsics::FIRST_MH_SIG_POLY && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
86 iid <= vmIntrinsics::LAST_MH_SIG_POLY); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
87 } |
710 | 88 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
89 static bool is_signature_polymorphic_intrinsic(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
90 assert(is_signature_polymorphic(iid), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
91 // Most sig-poly methods are intrinsics which do not require an |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
92 // appeal to Java for adapter code. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
93 return (iid != vmIntrinsics::_invokeGeneric); |
1507
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
94 } |
cd5dbf694d45
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
1506
diff
changeset
|
95 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
96 static bool is_signature_polymorphic_static(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
97 assert(is_signature_polymorphic(iid), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
98 return (iid >= vmIntrinsics::FIRST_MH_STATIC && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
99 iid <= vmIntrinsics::LAST_MH_SIG_POLY); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
100 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
101 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
102 static bool has_member_arg(vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
103 assert(is_signature_polymorphic(iid), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
104 return (iid >= vmIntrinsics::_linkToVirtual && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
105 iid <= vmIntrinsics::_linkToInterface); |
710 | 106 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
107 static bool has_member_arg(Symbol* klass, Symbol* name) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
108 if ((klass == vmSymbols::java_lang_invoke_MethodHandle()) && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
109 is_signature_polymorphic_name(name)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
110 vmIntrinsics::ID iid = signature_polymorphic_name_id(name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
111 return has_member_arg(iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
112 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
113 return false; |
710 | 114 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
115 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
116 static Symbol* signature_polymorphic_intrinsic_name(vmIntrinsics::ID iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
117 static int signature_polymorphic_intrinsic_ref_kind(vmIntrinsics::ID iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
118 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
119 static vmIntrinsics::ID signature_polymorphic_name_id(Klass* klass, Symbol* name); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
120 static vmIntrinsics::ID signature_polymorphic_name_id(Symbol* name); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
121 static bool is_signature_polymorphic_name(Symbol* name) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
122 return signature_polymorphic_name_id(name) != vmIntrinsics::_none; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
123 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
124 static bool is_method_handle_invoke_name(Klass* klass, Symbol* name); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
125 static bool is_signature_polymorphic_name(Klass* klass, Symbol* name) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
126 return signature_polymorphic_name_id(klass, name) != vmIntrinsics::_none; |
710 | 127 } |
128 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
129 enum { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
130 // format of query to getConstant: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
131 GC_COUNT_GWT = 4, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
132 GC_LAMBDA_SUPPORT = 5 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
133 }; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
134 static int get_named_constant(int which, Handle name_box, TRAPS); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
135 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
136 public: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
137 static Symbol* lookup_signature(oop type_str, bool polymorphic, TRAPS); // use TempNewSymbol |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
138 static Symbol* lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS); // use TempNewSymbol |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
139 static Symbol* lookup_basic_type_signature(Symbol* sig, TRAPS) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
140 return lookup_basic_type_signature(sig, false, THREAD); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
141 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
142 static bool is_basic_type_signature(Symbol* sig); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
143 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
144 static Symbol* lookup_method_type(Symbol* msig, Handle mtype, TRAPS); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
145 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
146 static void print_as_method_type_on(outputStream* st, Symbol* sig) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
147 print_as_basic_type_signature_on(st, sig, true, true); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
148 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
149 static void print_as_basic_type_signature_on(outputStream* st, Symbol* sig, bool keep_arrays = false, bool keep_basic_names = false); |
710 | 150 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
151 // decoding CONSTANT_MethodHandle constants |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
152 enum { JVM_REF_MIN = JVM_REF_getField, JVM_REF_MAX = JVM_REF_invokeInterface }; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
153 static bool ref_kind_is_valid(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
154 return (ref_kind >= JVM_REF_MIN && ref_kind <= JVM_REF_MAX); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
155 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
156 static bool ref_kind_is_field(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
157 assert(ref_kind_is_valid(ref_kind), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
158 return (ref_kind <= JVM_REF_putStatic); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
159 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
160 static bool ref_kind_is_getter(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
161 assert(ref_kind_is_valid(ref_kind), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
162 return (ref_kind <= JVM_REF_getStatic); |
710 | 163 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
164 static bool ref_kind_is_setter(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
165 return ref_kind_is_field(ref_kind) && !ref_kind_is_getter(ref_kind); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
166 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
167 static bool ref_kind_is_method(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
168 return !ref_kind_is_field(ref_kind) && (ref_kind != JVM_REF_newInvokeSpecial); |
710 | 169 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
170 static bool ref_kind_has_receiver(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
171 assert(ref_kind_is_valid(ref_kind), ""); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
172 return (ref_kind & 1) != 0; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
173 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
174 static bool ref_kind_is_static(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
175 return !ref_kind_has_receiver(ref_kind) && (ref_kind != JVM_REF_newInvokeSpecial); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
176 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
177 static bool ref_kind_does_dispatch(int ref_kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
178 return (ref_kind == JVM_REF_invokeVirtual || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4807
diff
changeset
|
179 ref_kind == JVM_REF_invokeInterface); |
710 | 180 } |
181 | |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
182 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
183 #ifdef TARGET_ARCH_x86 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
184 # include "methodHandles_x86.hpp" |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
185 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
186 #ifdef TARGET_ARCH_sparc |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
187 # include "methodHandles_sparc.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
188 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
189 #ifdef TARGET_ARCH_zero |
3753
cba7b5c2d53f
7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents:
3744
diff
changeset
|
190 # include "methodHandles_zero.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
191 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
192 #ifdef TARGET_ARCH_arm |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
193 # include "methodHandles_arm.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
194 #endif |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
195 #ifdef TARGET_ARCH_ppc |
3385
33ae33516634
7045515: ARM assembly code for JSR 292 ricochet frames
bdelsart
parents:
3371
diff
changeset
|
196 # include "methodHandles_ppc.hpp" |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3274
diff
changeset
|
197 #endif |
710 | 198 |
6847
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
199 // Tracing |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
200 static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
201 static void trace_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid) { |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
202 if (TraceMethodHandles) { |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
203 const char* name = vmIntrinsics::name_at(iid); |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
204 if (*name == '_') name += 1; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
205 const size_t len = strlen(name) + 50; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
206 char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal); |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
207 const char* suffix = ""; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
208 if (is_signature_polymorphic(iid)) { |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
209 if (is_signature_polymorphic_static(iid)) |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
210 suffix = "/static"; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
211 else |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
212 suffix = "/private"; |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
213 } |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
214 jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix); |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
215 trace_method_handle(_masm, qname); |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
216 // Note: Don't free the allocated char array because it's used |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
217 // during runtime. |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
218 } |
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6725
diff
changeset
|
219 } |
710 | 220 }; |
221 | |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
222 |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
223 //------------------------------------------------------------------------------ |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
224 // MethodHandlesAdapterGenerator |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
225 // |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
226 class MethodHandlesAdapterGenerator : public StubCodeGenerator { |
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
227 public: |
3757
f8c9417e3571
7052219: JSR 292: Crash in ~BufferBlob::MethodHandles adapters
never
parents:
3753
diff
changeset
|
228 MethodHandlesAdapterGenerator(CodeBuffer* code) : StubCodeGenerator(code, PrintMethodHandleStubs) {} |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
229 |
2116
d810e9a3fc33
7010180: JSR 292 InvokeDynamicPrintArgs fails with: assert(_adapter == NULL) failed: init'd to NULL
twisti
parents:
2088
diff
changeset
|
230 void generate(); |
1299
9eba43136cb5
6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents:
1039
diff
changeset
|
231 }; |
1972 | 232 |
233 #endif // SHARE_VM_PRIMS_METHODHANDLES_HPP |