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