hotspot/src/share/vm/prims/jni.cpp
changeset 33628 09241459a8b8
parent 33470 0ce01b662ff2
child 34174 4db2fb26dc49
child 33638 ef49ed90010b
equal deleted inserted replaced
33627:c5b7455f846e 33628:09241459a8b8
  2472   jchar* buf = NULL;
  2472   jchar* buf = NULL;
  2473   oop s = JNIHandles::resolve_non_null(string);
  2473   oop s = JNIHandles::resolve_non_null(string);
  2474   typeArrayOop s_value = java_lang_String::value(s);
  2474   typeArrayOop s_value = java_lang_String::value(s);
  2475   if (s_value != NULL) {
  2475   if (s_value != NULL) {
  2476     int s_len = java_lang_String::length(s);
  2476     int s_len = java_lang_String::length(s);
  2477     int s_offset = java_lang_String::offset(s);
  2477     bool is_latin1 = java_lang_String::is_latin1(s);
  2478     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2478     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2479     /* JNI Specification states return NULL on OOM */
  2479     /* JNI Specification states return NULL on OOM */
  2480     if (buf != NULL) {
  2480     if (buf != NULL) {
  2481       if (s_len > 0) {
  2481       if (s_len > 0) {
  2482         memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
  2482         if (!is_latin1) {
       
  2483           memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len);
       
  2484         } else {
       
  2485           for (int i = 0; i < s_len; i++) {
       
  2486             buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
       
  2487           }
       
  2488         }
  2483       }
  2489       }
  2484       buf[s_len] = 0;
  2490       buf[s_len] = 0;
  2485       //%note jni_5
  2491       //%note jni_5
  2486       if (isCopy != NULL) {
  2492       if (isCopy != NULL) {
  2487         *isCopy = JNI_TRUE;
  2493         *isCopy = JNI_TRUE;
  3116   int s_len = java_lang_String::length(s);
  3122   int s_len = java_lang_String::length(s);
  3117   if (start < 0 || len < 0 || start + len > s_len) {
  3123   if (start < 0 || len < 0 || start + len > s_len) {
  3118     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3124     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3119   } else {
  3125   } else {
  3120     if (len > 0) {
  3126     if (len > 0) {
  3121       int s_offset = java_lang_String::offset(s);
       
  3122       typeArrayOop s_value = java_lang_String::value(s);
  3127       typeArrayOop s_value = java_lang_String::value(s);
  3123       memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
  3128       bool is_latin1 = java_lang_String::is_latin1(s);
       
  3129       if (!is_latin1) {
       
  3130         memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len);
       
  3131       } else {
       
  3132         for (int i = 0; i < len; i++) {
       
  3133           buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
       
  3134         }
       
  3135       }
  3124     }
  3136     }
  3125   }
  3137   }
  3126 JNI_END
  3138 JNI_END
  3127 
  3139 
  3128 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
  3140 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
  3184 
  3196 
  3185 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
  3197 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
  3186   JNIWrapper("GetStringCritical");
  3198   JNIWrapper("GetStringCritical");
  3187   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
  3199   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
  3188   GC_locker::lock_critical(thread);
  3200   GC_locker::lock_critical(thread);
       
  3201   oop s = JNIHandles::resolve_non_null(string);
       
  3202   typeArrayOop s_value = java_lang_String::value(s);
       
  3203   bool is_latin1 = java_lang_String::is_latin1(s);
  3189   if (isCopy != NULL) {
  3204   if (isCopy != NULL) {
  3190     *isCopy = JNI_FALSE;
  3205     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
  3191   }
  3206   }
  3192   oop s = JNIHandles::resolve_non_null(string);
       
  3193   int s_len = java_lang_String::length(s);
       
  3194   typeArrayOop s_value = java_lang_String::value(s);
       
  3195   int s_offset = java_lang_String::offset(s);
       
  3196   const jchar* ret;
  3207   const jchar* ret;
  3197   if (s_len > 0) {
  3208   if (!is_latin1) {
  3198     ret = s_value->char_at_addr(s_offset);
  3209     ret = s_value->char_at_addr(0);
  3199   } else {
  3210   } else {
  3200     ret = (jchar*) s_value->base(T_CHAR);
  3211     // Inflate latin1 encoded string to UTF16
       
  3212     int s_len = java_lang_String::length(s);
       
  3213     jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal);
       
  3214     for (int i = 0; i < s_len; i++) {
       
  3215       buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
       
  3216     }
       
  3217     ret = &buf[0];
  3201   }
  3218   }
  3202  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
  3219  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
  3203   return ret;
  3220   return ret;
  3204 JNI_END
  3221 JNI_END
  3205 
  3222 
  3206 
  3223 
  3207 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
  3224 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
  3208   JNIWrapper("ReleaseStringCritical");
  3225   JNIWrapper("ReleaseStringCritical");
  3209   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
  3226   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
  3210   // The str and chars arguments are ignored
  3227   // The str and chars arguments are ignored for UTF16 strings
       
  3228   oop s = JNIHandles::resolve_non_null(str);
       
  3229   bool is_latin1 = java_lang_String::is_latin1(s);
       
  3230   if (is_latin1) {
       
  3231     // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
       
  3232     // This assumes that ReleaseStringCritical bookends GetStringCritical.
       
  3233     FREE_C_HEAP_ARRAY(jchar, chars);
       
  3234   }
  3211   GC_locker::unlock_critical(thread);
  3235   GC_locker::unlock_critical(thread);
  3212 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
  3236 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
  3213 JNI_END
  3237 JNI_END
  3214 
  3238 
  3215 
  3239