src/hotspot/share/prims/jni.cpp
changeset 53418 bc2bb4eee477
parent 53197 c92f4465fff1
child 53533 bce458ffed11
equal deleted inserted replaced
53417:126c5e7b97b1 53418:bc2bb4eee477
  2426 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
  2426 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
  2427   JNIWrapper("GetStringLength");
  2427   JNIWrapper("GetStringLength");
  2428   HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string);
  2428   HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string);
  2429   jsize ret = 0;
  2429   jsize ret = 0;
  2430   oop s = JNIHandles::resolve_non_null(string);
  2430   oop s = JNIHandles::resolve_non_null(string);
  2431   if (java_lang_String::value(s) != NULL) {
  2431   ret = java_lang_String::length(s);
  2432     ret = java_lang_String::length(s);
       
  2433   }
       
  2434  HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
  2432  HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
  2435   return ret;
  2433   return ret;
  2436 JNI_END
  2434 JNI_END
  2437 
  2435 
  2438 
  2436 
  2442  HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
  2440  HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
  2443   jchar* buf = NULL;
  2441   jchar* buf = NULL;
  2444   oop s = JNIHandles::resolve_non_null(string);
  2442   oop s = JNIHandles::resolve_non_null(string);
  2445   typeArrayOop s_value = java_lang_String::value(s);
  2443   typeArrayOop s_value = java_lang_String::value(s);
  2446   if (s_value != NULL) {
  2444   if (s_value != NULL) {
  2447     int s_len = java_lang_String::length(s);
  2445     int s_len = java_lang_String::length(s, s_value);
  2448     bool is_latin1 = java_lang_String::is_latin1(s);
  2446     bool is_latin1 = java_lang_String::is_latin1(s);
  2449     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2447     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2450     /* JNI Specification states return NULL on OOM */
  2448     /* JNI Specification states return NULL on OOM */
  2451     if (buf != NULL) {
  2449     if (buf != NULL) {
  2452       if (s_len > 0) {
  2450       if (s_len > 0) {
  2502 
  2500 
  2503 
  2501 
  2504 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
  2502 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
  2505   JNIWrapper("GetStringUTFLength");
  2503   JNIWrapper("GetStringUTFLength");
  2506  HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(env, string);
  2504  HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(env, string);
  2507   jsize ret = 0;
       
  2508   oop java_string = JNIHandles::resolve_non_null(string);
  2505   oop java_string = JNIHandles::resolve_non_null(string);
  2509   if (java_lang_String::value(java_string) != NULL) {
  2506   jsize ret = java_lang_String::utf8_length(java_string);
  2510     ret = java_lang_String::utf8_length(java_string);
       
  2511   }
       
  2512   HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(ret);
  2507   HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(ret);
  2513   return ret;
  2508   return ret;
  2514 JNI_END
  2509 JNI_END
  2515 
  2510 
  2516 
  2511 
  2517 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
  2512 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
  2518   JNIWrapper("GetStringUTFChars");
  2513   JNIWrapper("GetStringUTFChars");
  2519  HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
  2514  HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
  2520   char* result = NULL;
  2515   char* result = NULL;
  2521   oop java_string = JNIHandles::resolve_non_null(string);
  2516   oop java_string = JNIHandles::resolve_non_null(string);
  2522   if (java_lang_String::value(java_string) != NULL) {
  2517   typeArrayOop s_value = java_lang_String::value(java_string);
  2523     size_t length = java_lang_String::utf8_length(java_string);
  2518   if (s_value != NULL) {
       
  2519     size_t length = java_lang_String::utf8_length(java_string, s_value);
  2524     /* JNI Specification states return NULL on OOM */
  2520     /* JNI Specification states return NULL on OOM */
  2525     result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL);
  2521     result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL);
  2526     if (result != NULL) {
  2522     if (result != NULL) {
  2527       java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
  2523       java_lang_String::as_utf8_string(java_string, s_value, result, (int) length + 1);
  2528       if (isCopy != NULL) {
  2524       if (isCopy != NULL) {
  2529         *isCopy = JNI_TRUE;
  2525         *isCopy = JNI_TRUE;
  2530       }
  2526       }
  2531     }
  2527     }
  2532   }
  2528   }
  3095 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
  3091 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
  3096   JNIWrapper("GetStringRegion");
  3092   JNIWrapper("GetStringRegion");
  3097  HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
  3093  HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
  3098   DT_VOID_RETURN_MARK(GetStringRegion);
  3094   DT_VOID_RETURN_MARK(GetStringRegion);
  3099   oop s = JNIHandles::resolve_non_null(string);
  3095   oop s = JNIHandles::resolve_non_null(string);
  3100   int s_len = java_lang_String::length(s);
  3096   typeArrayOop s_value = java_lang_String::value(s);
       
  3097   int s_len = java_lang_String::length(s, s_value);
  3101   if (start < 0 || len < 0 || start > s_len - len) {
  3098   if (start < 0 || len < 0 || start > s_len - len) {
  3102     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3099     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3103   } else {
  3100   } else {
  3104     if (len > 0) {
  3101     if (len > 0) {
  3105       typeArrayOop s_value = java_lang_String::value(s);
       
  3106       bool is_latin1 = java_lang_String::is_latin1(s);
  3102       bool is_latin1 = java_lang_String::is_latin1(s);
  3107       if (!is_latin1) {
  3103       if (!is_latin1) {
  3108         ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset<jchar>(start),
  3104         ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset<jchar>(start),
  3109                                            buf, len);
  3105                                            buf, len);
  3110       } else {
  3106       } else {
  3122 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
  3118 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
  3123   JNIWrapper("GetStringUTFRegion");
  3119   JNIWrapper("GetStringUTFRegion");
  3124  HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
  3120  HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
  3125   DT_VOID_RETURN_MARK(GetStringUTFRegion);
  3121   DT_VOID_RETURN_MARK(GetStringUTFRegion);
  3126   oop s = JNIHandles::resolve_non_null(string);
  3122   oop s = JNIHandles::resolve_non_null(string);
  3127   int s_len = java_lang_String::length(s);
  3123   typeArrayOop s_value = java_lang_String::value(s);
       
  3124   int s_len = java_lang_String::length(s, s_value);
  3128   if (start < 0 || len < 0 || start > s_len - len) {
  3125   if (start < 0 || len < 0 || start > s_len - len) {
  3129     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3126     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
  3130   } else {
  3127   } else {
  3131     //%note jni_7
  3128     //%note jni_7
  3132     if (len > 0) {
  3129     if (len > 0) {
  3133       // Assume the buffer is large enough as the JNI spec. does not require user error checking
  3130       // Assume the buffer is large enough as the JNI spec. does not require user error checking
  3134       java_lang_String::as_utf8_string(s, start, len, buf, INT_MAX);
  3131       java_lang_String::as_utf8_string(s, s_value, start, len, buf, INT_MAX);
  3135       // as_utf8_string null-terminates the result string
  3132       // as_utf8_string null-terminates the result string
  3136     } else {
  3133     } else {
  3137       // JDK null-terminates the buffer even in len is zero
  3134       // JDK null-terminates the buffer even in len is zero
  3138       if (buf != NULL) {
  3135       if (buf != NULL) {
  3139         buf[0] = 0;
  3136         buf[0] = 0;
  3201   jchar* ret;
  3198   jchar* ret;
  3202   if (!is_latin1) {
  3199   if (!is_latin1) {
  3203     ret = (jchar*) s_value->base(T_CHAR);
  3200     ret = (jchar*) s_value->base(T_CHAR);
  3204   } else {
  3201   } else {
  3205     // Inflate latin1 encoded string to UTF16
  3202     // Inflate latin1 encoded string to UTF16
  3206     int s_len = java_lang_String::length(s);
  3203     int s_len = java_lang_String::length(s, s_value);
  3207     ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  3204     ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  3208     /* JNI Specification states return NULL on OOM */
  3205     /* JNI Specification states return NULL on OOM */
  3209     if (ret != NULL) {
  3206     if (ret != NULL) {
  3210       for (int i = 0; i < s_len; i++) {
  3207       for (int i = 0; i < s_len; i++) {
  3211         ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
  3208         ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;