comparison src/share/vm/oops/methodOop.cpp @ 856:75596850f863

6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics Summary: remove useless lazy evaluation of intrinsics; add LAST_COMPILER_INLINE to help categorize them Reviewed-by: kvn
author jrose
date Tue, 21 Jul 2009 16:56:06 -0700
parents be93aad57795
children 987e948ebbc8
comparison
equal deleted inserted replaced
854:606c988ff684 856:75596850f863
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());