Mercurial > hg > truffle
comparison src/share/vm/interpreter/linkResolver.cpp @ 1660:083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
Summary: Add JVM_CONSTANT_InvokeDynamic records to constant pool to determine per-instruction BSMs.
Reviewed-by: twisti
author | jrose |
---|---|
date | Thu, 15 Jul 2010 18:40:45 -0700 |
parents | c18cbe5936b8 |
children | d5d065957597 |
comparison
equal
deleted
inserted
replaced
1649:a528509c992b | 1660:083fde3b838e |
---|---|
65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { | 65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { |
66 assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index"); | 66 assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index"); |
67 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK); | 67 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK); |
68 } | 68 } |
69 | 69 |
70 void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) { | |
71 assert(resolved_method->is_method_handle_invoke(), ""); | |
72 KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); | |
73 assert(resolved_klass == resolved_method->method_holder(), ""); | |
74 int vtable_index = methodOopDesc::nonvirtual_vtable_index; | |
75 assert(resolved_method->vtable_index() == vtable_index, ""); | |
76 set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK); | |
77 } | |
78 | |
70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { | 79 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { |
71 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); | 80 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); |
72 _resolved_klass = resolved_klass; | 81 _resolved_klass = resolved_klass; |
73 _selected_klass = selected_klass; | 82 _selected_klass = selected_klass; |
74 _resolved_method = resolved_method; | 83 _resolved_method = resolved_method; |
174 | 183 |
175 void LinkResolver::lookup_implicit_method(methodHandle& result, | 184 void LinkResolver::lookup_implicit_method(methodHandle& result, |
176 KlassHandle klass, symbolHandle name, symbolHandle signature, | 185 KlassHandle klass, symbolHandle name, symbolHandle signature, |
177 KlassHandle current_klass, | 186 KlassHandle current_klass, |
178 TRAPS) { | 187 TRAPS) { |
179 if (EnableMethodHandles && MethodHandles::enabled() && | 188 if (EnableMethodHandles && |
180 klass() == SystemDictionary::MethodHandle_klass() && | 189 klass() == SystemDictionary::MethodHandle_klass() && |
181 methodOopDesc::is_method_handle_invoke_name(name())) { | 190 methodOopDesc::is_method_handle_invoke_name(name())) { |
191 if (!MethodHandles::enabled()) { | |
192 // Make sure the Java part of the runtime has been booted up. | |
193 klassOop natives = SystemDictionary::MethodHandleNatives_klass(); | |
194 if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) { | |
195 SystemDictionary::resolve_or_fail(vmSymbolHandles::sun_dyn_MethodHandleNatives(), | |
196 Handle(), | |
197 Handle(), | |
198 true, | |
199 CHECK); | |
200 } | |
201 } | |
182 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, | 202 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, |
183 signature, | 203 signature, |
184 current_klass, | 204 current_klass, |
185 CHECK); | 205 CHECK); |
186 if (result_oop != NULL) { | 206 if (result_oop != NULL) { |
1063 KlassHandle current_klass(THREAD, pool->pool_holder()); | 1083 KlassHandle current_klass(THREAD, pool->pool_holder()); |
1064 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); | 1084 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); |
1065 if (resolved_method.is_null()) { | 1085 if (resolved_method.is_null()) { |
1066 THROW(vmSymbols::java_lang_InternalError()); | 1086 THROW(vmSymbols::java_lang_InternalError()); |
1067 } | 1087 } |
1068 result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK); | 1088 result.set_dynamic(resolved_method, CHECK); |
1069 } | 1089 } |
1070 | 1090 |
1071 //------------------------------------------------------------------------------------------------------------------------ | 1091 //------------------------------------------------------------------------------------------------------------------------ |
1072 #ifndef PRODUCT | 1092 #ifndef PRODUCT |
1073 | 1093 |