960 // complete. |
960 // complete. |
961 newcm->set_is_conc_safe(true); |
961 newcm->set_is_conc_safe(true); |
962 return newm; |
962 return newm; |
963 } |
963 } |
964 |
964 |
965 vmIntrinsics::ID methodOopDesc::compute_intrinsic_id() const { |
965 vmSymbols::SID methodOopDesc::klass_id_for_intrinsics(klassOop holder) { |
966 assert(vmIntrinsics::_none == 0, "correct coding of default case"); |
|
967 const uintptr_t max_cache_uint = right_n_bits((int)(sizeof(_intrinsic_id_cache) * BitsPerByte)); |
|
968 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_cache_uint, "else fix cache size"); |
|
969 // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics |
966 // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics |
970 // because we are not loading from core libraries |
967 // because we are not loading from core libraries |
971 if (instanceKlass::cast(method_holder())->class_loader() != NULL) return vmIntrinsics::_none; |
968 if (instanceKlass::cast(holder)->class_loader() != NULL) |
|
969 return vmSymbols::NO_SID; // regardless of name, no intrinsics here |
972 |
970 |
973 // see if the klass name is well-known: |
971 // see if the klass name is well-known: |
974 symbolOop klass_name = instanceKlass::cast(method_holder())->name(); |
972 symbolOop klass_name = instanceKlass::cast(holder)->name(); |
975 vmSymbols::SID klass_id = vmSymbols::find_sid(klass_name); |
973 return vmSymbols::find_sid(klass_name); |
976 if (klass_id == vmSymbols::NO_SID) return vmIntrinsics::_none; |
974 } |
|
975 |
|
976 void methodOopDesc::init_intrinsic_id() { |
|
977 assert(_intrinsic_id == vmIntrinsics::_none, "do this just once"); |
|
978 const uintptr_t max_id_uint = right_n_bits((int)(sizeof(_intrinsic_id) * BitsPerByte)); |
|
979 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size"); |
|
980 |
|
981 // the klass name is well-known: |
|
982 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder()); |
|
983 assert(klass_id != vmSymbols::NO_SID, "caller responsibility"); |
977 |
984 |
978 // ditto for method and signature: |
985 // ditto for method and signature: |
979 vmSymbols::SID name_id = vmSymbols::find_sid(name()); |
986 vmSymbols::SID name_id = vmSymbols::find_sid(name()); |
980 if (name_id == vmSymbols::NO_SID) return vmIntrinsics::_none; |
987 if (name_id == vmSymbols::NO_SID) return; |
981 vmSymbols::SID sig_id = vmSymbols::find_sid(signature()); |
988 vmSymbols::SID sig_id = vmSymbols::find_sid(signature()); |
982 if (sig_id == vmSymbols::NO_SID) return vmIntrinsics::_none; |
989 if (sig_id == vmSymbols::NO_SID) return; |
983 jshort flags = access_flags().as_short(); |
990 jshort flags = access_flags().as_short(); |
|
991 |
|
992 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); |
|
993 if (id != vmIntrinsics::_none) { |
|
994 set_intrinsic_id(id); |
|
995 return; |
|
996 } |
984 |
997 |
985 // A few slightly irregular cases: |
998 // A few slightly irregular cases: |
986 switch (klass_id) { |
999 switch (klass_id) { |
987 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath): |
1000 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath): |
988 // Second chance: check in regular Math. |
1001 // Second chance: check in regular Math. |
990 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name): |
1003 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name): |
991 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name): |
1004 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name): |
992 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name): |
1005 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name): |
993 // pretend it is the corresponding method in the non-strict class: |
1006 // pretend it is the corresponding method in the non-strict class: |
994 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); |
1007 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math); |
|
1008 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); |
995 break; |
1009 break; |
996 } |
1010 } |
997 } |
1011 } |
998 |
1012 |
999 // return intrinsic id if any |
1013 if (id != vmIntrinsics::_none) { |
1000 return vmIntrinsics::find_id(klass_id, name_id, sig_id, flags); |
1014 // Set up its iid. It is an alias method. |
1001 } |
1015 set_intrinsic_id(id); |
1002 |
1016 return; |
|
1017 } |
|
1018 } |
1003 |
1019 |
1004 // These two methods are static since a GC may move the methodOopDesc |
1020 // These two methods are static since a GC may move the methodOopDesc |
1005 bool methodOopDesc::load_signature_classes(methodHandle m, TRAPS) { |
1021 bool methodOopDesc::load_signature_classes(methodHandle m, TRAPS) { |
1006 bool sig_is_loaded = true; |
1022 bool sig_is_loaded = true; |
1007 Handle class_loader(THREAD, instanceKlass::cast(m->method_holder())->class_loader()); |
1023 Handle class_loader(THREAD, instanceKlass::cast(m->method_holder())->class_loader()); |