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; |