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 |