< prev index next >

src/share/vm/prims/jni.cpp

Print this page

        

*** 2472,2487 **** jchar* buf = NULL; oop s = JNIHandles::resolve_non_null(string); typeArrayOop s_value = java_lang_String::value(s); if (s_value != NULL) { int s_len = java_lang_String::length(s); ! int s_offset = java_lang_String::offset(s); buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination /* JNI Specification states return NULL on OOM */ if (buf != NULL) { if (s_len > 0) { ! memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len); } buf[s_len] = 0; //%note jni_5 if (isCopy != NULL) { *isCopy = JNI_TRUE; --- 2472,2493 ---- jchar* buf = NULL; oop s = JNIHandles::resolve_non_null(string); typeArrayOop s_value = java_lang_String::value(s); if (s_value != NULL) { int s_len = java_lang_String::length(s); ! bool is_latin1 = java_lang_String::is_latin1(s); buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination /* JNI Specification states return NULL on OOM */ if (buf != NULL) { if (s_len > 0) { ! if (!is_latin1) { ! memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len); ! } else { ! for (int i = 0; i < s_len; i++) { ! buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; ! } ! } } buf[s_len] = 0; //%note jni_5 if (isCopy != NULL) { *isCopy = JNI_TRUE;
*** 3116,3128 **** int s_len = java_lang_String::length(s); if (start < 0 || len < 0 || start + len > s_len) { THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); } else { if (len > 0) { - int s_offset = java_lang_String::offset(s); typeArrayOop s_value = java_lang_String::value(s); ! memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len); } } JNI_END DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion --- 3122,3140 ---- int s_len = java_lang_String::length(s); if (start < 0 || len < 0 || start + len > s_len) { THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); } else { if (len > 0) { typeArrayOop s_value = java_lang_String::value(s); ! bool is_latin1 = java_lang_String::is_latin1(s); ! if (!is_latin1) { ! memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len); ! } else { ! for (int i = 0; i < len; i++) { ! buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff; ! } ! } } } JNI_END DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
*** 3184,3215 **** JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)) JNIWrapper("GetStringCritical"); HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy); GC_locker::lock_critical(thread); - if (isCopy != NULL) { - *isCopy = JNI_FALSE; - } oop s = JNIHandles::resolve_non_null(string); - int s_len = java_lang_String::length(s); typeArrayOop s_value = java_lang_String::value(s); ! int s_offset = java_lang_String::offset(s); const jchar* ret; ! if (s_len > 0) { ! ret = s_value->char_at_addr(s_offset); } else { ! ret = (jchar*) s_value->base(T_CHAR); } HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret); return ret; JNI_END JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars)) JNIWrapper("ReleaseStringCritical"); HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars); ! // The str and chars arguments are ignored GC_locker::unlock_critical(thread); HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(); JNI_END --- 3196,3239 ---- JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)) JNIWrapper("GetStringCritical"); HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy); GC_locker::lock_critical(thread); oop s = JNIHandles::resolve_non_null(string); typeArrayOop s_value = java_lang_String::value(s); ! bool is_latin1 = java_lang_String::is_latin1(s); ! if (isCopy != NULL) { ! *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE; ! } const jchar* ret; ! if (!is_latin1) { ! ret = s_value->char_at_addr(0); } else { ! // Inflate latin1 encoded string to UTF16 ! int s_len = java_lang_String::length(s); ! jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal); ! for (int i = 0; i < s_len; i++) { ! buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; ! } ! ret = &buf[0]; } HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret); return ret; JNI_END JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars)) JNIWrapper("ReleaseStringCritical"); HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars); ! // The str and chars arguments are ignored for UTF16 strings ! oop s = JNIHandles::resolve_non_null(str); ! bool is_latin1 = java_lang_String::is_latin1(s); ! if (is_latin1) { ! // For latin1 string, free jchar array allocated by earlier call to GetStringCritical. ! // This assumes that ReleaseStringCritical bookends GetStringCritical. ! FREE_C_HEAP_ARRAY(jchar, chars); ! } GC_locker::unlock_critical(thread); HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(); JNI_END
< prev index next >