Mercurial > hg > truffle
comparison src/share/vm/interpreter/linkResolver.hpp @ 6266:1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>
author | twisti |
---|---|
date | Tue, 24 Jul 2012 10:51:00 -0700 |
parents | 1d1603768966 |
children | da91efe96a93 |
comparison
equal
deleted
inserted
replaced
6241:aba91a731143 | 6266:1d7922586cf6 |
---|---|
73 KlassHandle _resolved_klass; // static receiver klass | 73 KlassHandle _resolved_klass; // static receiver klass |
74 KlassHandle _selected_klass; // dynamic receiver class (same as static, or subklass) | 74 KlassHandle _selected_klass; // dynamic receiver class (same as static, or subklass) |
75 methodHandle _resolved_method; // static target method | 75 methodHandle _resolved_method; // static target method |
76 methodHandle _selected_method; // dynamic (actual) target method | 76 methodHandle _selected_method; // dynamic (actual) target method |
77 int _vtable_index; // vtable index of selected method | 77 int _vtable_index; // vtable index of selected method |
78 Handle _resolved_appendix; // extra argument in constant pool (if CPCE::has_appendix) | |
78 | 79 |
79 void set_static( KlassHandle resolved_klass, methodHandle resolved_method , TRAPS); | 80 void set_static( KlassHandle resolved_klass, methodHandle resolved_method , TRAPS); |
80 void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method , TRAPS); | 81 void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method , TRAPS); |
81 void set_virtual( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); | 82 void set_virtual( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); |
82 void set_dynamic( methodHandle resolved_method, TRAPS); | 83 void set_handle( methodHandle resolved_method, Handle resolved_appendix, TRAPS); |
83 void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); | 84 void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS); |
84 | 85 |
85 friend class LinkResolver; | 86 friend class LinkResolver; |
86 | 87 |
87 public: | 88 public: |
88 KlassHandle resolved_klass() const { return _resolved_klass; } | 89 KlassHandle resolved_klass() const { return _resolved_klass; } |
89 KlassHandle selected_klass() const { return _selected_klass; } | 90 KlassHandle selected_klass() const { return _selected_klass; } |
90 methodHandle resolved_method() const { return _resolved_method; } | 91 methodHandle resolved_method() const { return _resolved_method; } |
91 methodHandle selected_method() const { return _selected_method; } | 92 methodHandle selected_method() const { return _selected_method; } |
93 Handle resolved_appendix() const { return _resolved_appendix; } | |
92 | 94 |
93 BasicType result_type() const { return selected_method()->result_type(); } | 95 BasicType result_type() const { return selected_method()->result_type(); } |
94 bool has_vtable_index() const { return _vtable_index >= 0; } | 96 bool has_vtable_index() const { return _vtable_index >= 0; } |
95 bool is_statically_bound() const { return _vtable_index == methodOopDesc::nonvirtual_vtable_index; } | 97 bool is_statically_bound() const { return _vtable_index == methodOopDesc::nonvirtual_vtable_index; } |
96 int vtable_index() const { | 98 int vtable_index() const { |
108 class LinkResolver: AllStatic { | 110 class LinkResolver: AllStatic { |
109 private: | 111 private: |
110 static void lookup_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); | 112 static void lookup_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); |
111 static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); | 113 static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); |
112 static void lookup_method_in_interfaces (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); | 114 static void lookup_method_in_interfaces (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); |
113 static void lookup_implicit_method (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, | 115 static void lookup_polymorphic_method (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, |
114 KlassHandle current_klass, TRAPS); | 116 KlassHandle current_klass, Handle* appendix_result_or_null, TRAPS); |
115 | 117 |
116 static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); | 118 static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); |
117 | 119 |
118 static void resolve_klass (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); | 120 static void resolve_klass (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); |
119 static void resolve_klass_no_update (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); // no update of constantPool entry | 121 static void resolve_klass_no_update (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); // no update of constantPool entry |
137 | 139 |
138 public: | 140 public: |
139 // constant pool resolving | 141 // constant pool resolving |
140 static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS); | 142 static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS); |
141 | 143 |
142 // static resolving for all calls except interface calls | 144 // static resolving calls (will not run any Java code); used only from Bytecode_invoke::static_target |
143 static void resolve_method (methodHandle& method_result, KlassHandle& klass_result, constantPoolHandle pool, int index, TRAPS); | 145 static void resolve_method_statically(methodHandle& method_result, KlassHandle& klass_result, |
144 static void resolve_dynamic_method (methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS); | 146 Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS); |
145 static void resolve_interface_method(methodHandle& method_result, KlassHandle& klass_result, constantPoolHandle pool, int index, TRAPS); | |
146 | 147 |
147 // runtime/static resolving for fields | 148 // runtime/static resolving for fields |
148 static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS); | 149 static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS); |
149 // takes an extra bool argument "update_pool" to decide whether to update the constantPool during klass resolution. | 150 // takes an extra bool argument "update_pool" to decide whether to update the constantPool during klass resolution. |
150 static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS); | 151 static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS); |
154 // current_klass = sending method holder (i.e., class containing the method containing the call being resolved) | 155 // current_klass = sending method holder (i.e., class containing the method containing the call being resolved) |
155 static void resolve_static_call (CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool initialize_klass, TRAPS); | 156 static void resolve_static_call (CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool initialize_klass, TRAPS); |
156 static void resolve_special_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS); | 157 static void resolve_special_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS); |
157 static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); | 158 static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); |
158 static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); | 159 static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS); |
160 static void resolve_handle_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS); | |
161 static void resolve_dynamic_call (CallInfo& result, Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS); | |
159 | 162 |
160 // same as above for compile-time resolution; but returns null handle instead of throwing an exception on error | 163 // same as above for compile-time resolution; but returns null handle instead of throwing an exception on error |
161 // also, does not initialize klass (i.e., no side effects) | 164 // also, does not initialize klass (i.e., no side effects) |
162 static methodHandle resolve_virtual_call_or_null (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass); | 165 static methodHandle resolve_virtual_call_or_null (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass); |
163 static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass); | 166 static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass); |
175 static void resolve_invokestatic (CallInfo& result, constantPoolHandle pool, int index, TRAPS); | 178 static void resolve_invokestatic (CallInfo& result, constantPoolHandle pool, int index, TRAPS); |
176 static void resolve_invokespecial (CallInfo& result, constantPoolHandle pool, int index, TRAPS); | 179 static void resolve_invokespecial (CallInfo& result, constantPoolHandle pool, int index, TRAPS); |
177 static void resolve_invokevirtual (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); | 180 static void resolve_invokevirtual (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); |
178 static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); | 181 static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS); |
179 static void resolve_invokedynamic (CallInfo& result, constantPoolHandle pool, int index, TRAPS); | 182 static void resolve_invokedynamic (CallInfo& result, constantPoolHandle pool, int index, TRAPS); |
183 static void resolve_invokehandle (CallInfo& result, constantPoolHandle pool, int index, TRAPS); | |
180 | 184 |
181 static void resolve_invoke (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS); | 185 static void resolve_invoke (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS); |
182 }; | 186 }; |
183 | 187 |
184 #endif // SHARE_VM_INTERPRETER_LINKRESOLVER_HPP | 188 #endif // SHARE_VM_INTERPRETER_LINKRESOLVER_HPP |