< prev index next >

src/hotspot/share/runtime/deoptimization.cpp

Print this page




 852   PrimitiveType _low;
 853   PrimitiveType _high;
 854   jobject _cache;
 855 protected:
 856   static BoxCache<PrimitiveType, CacheType, BoxType> *_singleton;
 857   BoxCache(Thread* thread) {
 858     InstanceKlass* ik = BoxCacheBase<CacheType>::find_cache_klass(CacheType::symbol(), thread);
 859     objArrayOop cache = CacheType::cache(ik);
 860     assert(cache->length() > 0, "Empty cache");
 861     _low = BoxType::value(cache->obj_at(0));
 862     _high = _low + cache->length() - 1;
 863     _cache = JNIHandles::make_global(Handle(thread, cache));
 864   }
 865   ~BoxCache() {
 866     JNIHandles::destroy_global(_cache);
 867   }
 868 public:
 869   static BoxCache<PrimitiveType, CacheType, BoxType>* singleton(Thread* thread) {
 870     if (_singleton == NULL) {
 871       BoxCache<PrimitiveType, CacheType, BoxType>* s = new BoxCache<PrimitiveType, CacheType, BoxType>(thread);
 872       if (!Atomic::replace_if_null(s, &_singleton)) {
 873         delete s;
 874       }
 875     }
 876     return _singleton;
 877   }
 878   oop lookup(PrimitiveType value) {
 879     if (_low <= value && value <= _high) {
 880       int offset = value - _low;
 881       return objArrayOop(JNIHandles::resolve_non_null(_cache))->obj_at(offset);
 882     }
 883     return NULL;
 884   }
 885   oop lookup_raw(intptr_t raw_value) {
 886     // Have to cast to avoid little/big-endian problems.
 887     if (sizeof(PrimitiveType) > sizeof(jint)) {
 888       jlong value = (jlong)raw_value;
 889       return lookup(value);
 890     }
 891     PrimitiveType value = (PrimitiveType)*((jint*)&raw_value);
 892     return lookup(value);


 906 template<> BoxCache<jbyte, java_lang_Byte_ByteCache, java_lang_Byte>* BoxCache<jbyte, java_lang_Byte_ByteCache, java_lang_Byte>::_singleton = NULL;
 907 
 908 class BooleanBoxCache : public BoxCacheBase<java_lang_Boolean> {
 909   jobject _true_cache;
 910   jobject _false_cache;
 911 protected:
 912   static BooleanBoxCache *_singleton;
 913   BooleanBoxCache(Thread *thread) {
 914     InstanceKlass* ik = find_cache_klass(java_lang_Boolean::symbol(), thread);
 915     _true_cache = JNIHandles::make_global(Handle(thread, java_lang_Boolean::get_TRUE(ik)));
 916     _false_cache = JNIHandles::make_global(Handle(thread, java_lang_Boolean::get_FALSE(ik)));
 917   }
 918   ~BooleanBoxCache() {
 919     JNIHandles::destroy_global(_true_cache);
 920     JNIHandles::destroy_global(_false_cache);
 921   }
 922 public:
 923   static BooleanBoxCache* singleton(Thread* thread) {
 924     if (_singleton == NULL) {
 925       BooleanBoxCache* s = new BooleanBoxCache(thread);
 926       if (!Atomic::replace_if_null(s, &_singleton)) {
 927         delete s;
 928       }
 929     }
 930     return _singleton;
 931   }
 932   oop lookup_raw(intptr_t raw_value) {
 933     // Have to cast to avoid little/big-endian problems.
 934     jboolean value = (jboolean)*((jint*)&raw_value);
 935     return lookup(value);
 936   }
 937   oop lookup(jboolean value) {
 938     if (value != 0) {
 939       return JNIHandles::resolve_non_null(_true_cache);
 940     }
 941     return JNIHandles::resolve_non_null(_false_cache);
 942   }
 943 };
 944 
 945 BooleanBoxCache* BooleanBoxCache::_singleton = NULL;
 946 




 852   PrimitiveType _low;
 853   PrimitiveType _high;
 854   jobject _cache;
 855 protected:
 856   static BoxCache<PrimitiveType, CacheType, BoxType> *_singleton;
 857   BoxCache(Thread* thread) {
 858     InstanceKlass* ik = BoxCacheBase<CacheType>::find_cache_klass(CacheType::symbol(), thread);
 859     objArrayOop cache = CacheType::cache(ik);
 860     assert(cache->length() > 0, "Empty cache");
 861     _low = BoxType::value(cache->obj_at(0));
 862     _high = _low + cache->length() - 1;
 863     _cache = JNIHandles::make_global(Handle(thread, cache));
 864   }
 865   ~BoxCache() {
 866     JNIHandles::destroy_global(_cache);
 867   }
 868 public:
 869   static BoxCache<PrimitiveType, CacheType, BoxType>* singleton(Thread* thread) {
 870     if (_singleton == NULL) {
 871       BoxCache<PrimitiveType, CacheType, BoxType>* s = new BoxCache<PrimitiveType, CacheType, BoxType>(thread);
 872       if (!Atomic::replace_if_null(&_singleton, s)) {
 873         delete s;
 874       }
 875     }
 876     return _singleton;
 877   }
 878   oop lookup(PrimitiveType value) {
 879     if (_low <= value && value <= _high) {
 880       int offset = value - _low;
 881       return objArrayOop(JNIHandles::resolve_non_null(_cache))->obj_at(offset);
 882     }
 883     return NULL;
 884   }
 885   oop lookup_raw(intptr_t raw_value) {
 886     // Have to cast to avoid little/big-endian problems.
 887     if (sizeof(PrimitiveType) > sizeof(jint)) {
 888       jlong value = (jlong)raw_value;
 889       return lookup(value);
 890     }
 891     PrimitiveType value = (PrimitiveType)*((jint*)&raw_value);
 892     return lookup(value);


 906 template<> BoxCache<jbyte, java_lang_Byte_ByteCache, java_lang_Byte>* BoxCache<jbyte, java_lang_Byte_ByteCache, java_lang_Byte>::_singleton = NULL;
 907 
 908 class BooleanBoxCache : public BoxCacheBase<java_lang_Boolean> {
 909   jobject _true_cache;
 910   jobject _false_cache;
 911 protected:
 912   static BooleanBoxCache *_singleton;
 913   BooleanBoxCache(Thread *thread) {
 914     InstanceKlass* ik = find_cache_klass(java_lang_Boolean::symbol(), thread);
 915     _true_cache = JNIHandles::make_global(Handle(thread, java_lang_Boolean::get_TRUE(ik)));
 916     _false_cache = JNIHandles::make_global(Handle(thread, java_lang_Boolean::get_FALSE(ik)));
 917   }
 918   ~BooleanBoxCache() {
 919     JNIHandles::destroy_global(_true_cache);
 920     JNIHandles::destroy_global(_false_cache);
 921   }
 922 public:
 923   static BooleanBoxCache* singleton(Thread* thread) {
 924     if (_singleton == NULL) {
 925       BooleanBoxCache* s = new BooleanBoxCache(thread);
 926       if (!Atomic::replace_if_null(&_singleton, s)) {
 927         delete s;
 928       }
 929     }
 930     return _singleton;
 931   }
 932   oop lookup_raw(intptr_t raw_value) {
 933     // Have to cast to avoid little/big-endian problems.
 934     jboolean value = (jboolean)*((jint*)&raw_value);
 935     return lookup(value);
 936   }
 937   oop lookup(jboolean value) {
 938     if (value != 0) {
 939       return JNIHandles::resolve_non_null(_true_cache);
 940     }
 941     return JNIHandles::resolve_non_null(_false_cache);
 942   }
 943 };
 944 
 945 BooleanBoxCache* BooleanBoxCache::_singleton = NULL;
 946 


< prev index next >