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
|