hotspot/src/share/vm/prims/jni.cpp
changeset 35162 65d0237246b1
parent 35061 be6025ebffea
child 35219 b9ef87beb87c
equal deleted inserted replaced
35080:b9dd459157f0 35162:65d0237246b1
  3192   typeArrayOop s_value = java_lang_String::value(s);
  3192   typeArrayOop s_value = java_lang_String::value(s);
  3193   bool is_latin1 = java_lang_String::is_latin1(s);
  3193   bool is_latin1 = java_lang_String::is_latin1(s);
  3194   if (isCopy != NULL) {
  3194   if (isCopy != NULL) {
  3195     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
  3195     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
  3196   }
  3196   }
  3197   const jchar* ret;
  3197   jchar* ret;
  3198   if (!is_latin1) {
  3198   if (!is_latin1) {
  3199     ret = s_value->char_at_addr(0);
  3199     ret = (jchar*) s_value->base(T_CHAR);
  3200   } else {
  3200   } else {
  3201     // Inflate latin1 encoded string to UTF16
  3201     // Inflate latin1 encoded string to UTF16
  3202     int s_len = java_lang_String::length(s);
  3202     int s_len = java_lang_String::length(s);
  3203     jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal);
  3203     ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  3204     for (int i = 0; i < s_len; i++) {
  3204     /* JNI Specification states return NULL on OOM */
  3205       buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
  3205     if (ret != NULL) {
  3206     }
  3206       for (int i = 0; i < s_len; i++) {
  3207     ret = &buf[0];
  3207         ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
       
  3208       }
       
  3209       ret[s_len] = 0;
       
  3210     }
  3208   }
  3211   }
  3209  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
  3212  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
  3210   return ret;
  3213   return ret;
  3211 JNI_END
  3214 JNI_END
  3212 
  3215