src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6817525 Sdiff src/share/vm/interpreter

src/share/vm/interpreter/linkResolver.cpp

Print this page




 159 
 160 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 161   klassOop result_oop = pool->klass_ref_at(index, CHECK);
 162   result = KlassHandle(THREAD, result_oop);
 163 }
 164 
 165 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 166   klassOop result_oop =
 167          constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK);
 168   result = KlassHandle(THREAD, result_oop);
 169 }
 170 
 171 
 172 //------------------------------------------------------------------------------------------------------------------------
 173 // Method resolution
 174 //
 175 // According to JVM spec. $5.4.3c & $5.4.3d
 176 
 177 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 178   methodOop result_oop = klass->uncached_lookup_method(name, signature);
 179   if (EnableMethodHandles && result_oop != NULL) {
 180     switch (result_oop->intrinsic_id()) {
 181     case vmIntrinsics::_invokeExact:
 182     case vmIntrinsics::_invokeGeneric:
 183     case vmIntrinsics::_invokeDynamic:
 184       // Do not link directly to these.  The VM must produce a synthetic one using lookup_implicit_method.
 185       return;
 186     }
 187   }
 188   result = methodHandle(THREAD, result_oop);
 189 }
 190 
 191 // returns first instance method
 192 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 193   methodOop result_oop = klass->uncached_lookup_method(name, signature);
 194   result = methodHandle(THREAD, result_oop);
 195   while (!result.is_null() && result->is_static()) {
 196     klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super());
 197     result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
 198   }
 199 }
 200 
 201 
 202 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 203   ResourceMark rm(THREAD);
 204   klassVtable *vt = instanceKlass::cast(klass())->vtable();
 205   return vt->index_of_miranda(name, signature);
 206 }
 207 
 208 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 209   instanceKlass *ik = instanceKlass::cast(klass());
 210   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature));
 211 }
 212 
 213 void LinkResolver::lookup_implicit_method(methodHandle& result,
 214                                           KlassHandle klass, Symbol* name, Symbol* signature,
 215                                           KlassHandle current_klass,
 216                                           TRAPS) {
 217   if (EnableMethodHandles &&
 218       klass() == SystemDictionary::MethodHandle_klass() &&
 219       methodOopDesc::is_method_handle_invoke_name(name)) {
 220     if (!THREAD->is_Compiler_thread() && !MethodHandles::enabled()) {
 221       // Make sure the Java part of the runtime has been booted up.
 222       klassOop natives = SystemDictionary::MethodHandleNatives_klass();
 223       if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
 224         Symbol* natives_name = vmSymbols::java_lang_invoke_MethodHandleNatives();
 225         if (natives != NULL && AllowTransitionalJSR292)  natives_name = Klass::cast(natives)->name();
 226         SystemDictionary::resolve_or_fail(natives_name,
 227                                           Handle(),
 228                                           Handle(),
 229                                           true,
 230                                           CHECK);
 231       }
 232     }
 233     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
 234                                                                        signature,
 235                                                                        current_klass,
 236                                                                        CHECK);
 237     if (result_oop != NULL) {




 159 
 160 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 161   klassOop result_oop = pool->klass_ref_at(index, CHECK);
 162   result = KlassHandle(THREAD, result_oop);
 163 }
 164 
 165 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
 166   klassOop result_oop =
 167          constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK);
 168   result = KlassHandle(THREAD, result_oop);
 169 }
 170 
 171 
 172 //------------------------------------------------------------------------------------------------------------------------
 173 // Method resolution
 174 //
 175 // According to JVM spec. $5.4.3c & $5.4.3d
 176 
 177 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 178   methodOop result_oop = klass->uncached_lookup_method(name, signature);
 179   if (EnableInvokeDynamic && result_oop != NULL) {
 180     switch (result_oop->intrinsic_id()) {
 181     case vmIntrinsics::_invokeExact:
 182     case vmIntrinsics::_invokeGeneric:
 183     case vmIntrinsics::_invokeDynamic:
 184       // Do not link directly to these.  The VM must produce a synthetic one using lookup_implicit_method.
 185       return;
 186     }
 187   }
 188   result = methodHandle(THREAD, result_oop);
 189 }
 190 
 191 // returns first instance method
 192 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 193   methodOop result_oop = klass->uncached_lookup_method(name, signature);
 194   result = methodHandle(THREAD, result_oop);
 195   while (!result.is_null() && result->is_static()) {
 196     klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super());
 197     result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
 198   }
 199 }
 200 
 201 
 202 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 203   ResourceMark rm(THREAD);
 204   klassVtable *vt = instanceKlass::cast(klass())->vtable();
 205   return vt->index_of_miranda(name, signature);
 206 }
 207 
 208 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
 209   instanceKlass *ik = instanceKlass::cast(klass());
 210   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature));
 211 }
 212 
 213 void LinkResolver::lookup_implicit_method(methodHandle& result,
 214                                           KlassHandle klass, Symbol* name, Symbol* signature,
 215                                           KlassHandle current_klass,
 216                                           TRAPS) {
 217   if (EnableInvokeDynamic &&
 218       klass() == SystemDictionary::MethodHandle_klass() &&
 219       methodOopDesc::is_method_handle_invoke_name(name)) {
 220     if (!THREAD->is_Compiler_thread() && !MethodHandles::enabled()) {
 221       // Make sure the Java part of the runtime has been booted up.
 222       klassOop natives = SystemDictionary::MethodHandleNatives_klass();
 223       if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
 224         Symbol* natives_name = vmSymbols::java_lang_invoke_MethodHandleNatives();
 225         if (natives != NULL && AllowTransitionalJSR292)  natives_name = Klass::cast(natives)->name();
 226         SystemDictionary::resolve_or_fail(natives_name,
 227                                           Handle(),
 228                                           Handle(),
 229                                           true,
 230                                           CHECK);
 231       }
 232     }
 233     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
 234                                                                        signature,
 235                                                                        current_klass,
 236                                                                        CHECK);
 237     if (result_oop != NULL) {


src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File