Mercurial > hg > truffle
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()); |