< prev index next >
src/hotspot/share/prims/jni.cpp
Print this page
rev 50331 : 8198285: More consistent Access API for arraycopy
rev 50332 : [mq]: JDK-8203232-2.patch
rev 50333 : [mq]: JDK-8198285-3.patch
*** 2464,2474 ****
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;
}
}
--- 2464,2475 ----
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) {
! ArrayAccess<>::arraycopy_to_native<>(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
! buf, s_len);
} else {
for (int i = 0; i < s_len; i++) {
buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
}
}
*** 2720,2730 ****
} else { \
/* JNI Specification states return NULL on OOM */ \
result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
if (result != NULL) { \
/* copy the array to the c chunk */ \
! memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
if (isCopy) { \
*isCopy = JNI_TRUE; \
} \
} \
} \
--- 2721,2732 ----
} else { \
/* JNI Specification states return NULL on OOM */ \
result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
if (result != NULL) { \
/* copy the array to the c chunk */ \
! ArrayAccess<>::arraycopy_to_native<>(a, typeArrayOopDesc::element_offset<ElementType>(0), \
! result, len); \
if (isCopy) { \
*isCopy = JNI_TRUE; \
} \
} \
} \
*** 2769,2779 ****
EntryProbe; \
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
int len = a->length(); \
if (len != 0) { /* Empty array: nothing to free or copy. */ \
if ((mode == 0) || (mode == JNI_COMMIT)) { \
! memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
} \
if ((mode == 0) || (mode == JNI_ABORT)) { \
FreeHeap(buf); \
} \
} \
--- 2771,2781 ----
EntryProbe; \
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
int len = a->length(); \
if (len != 0) { /* Empty array: nothing to free or copy. */ \
if ((mode == 0) || (mode == JNI_COMMIT)) { \
! ArrayAccess<>::arraycopy_from_native<>(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), len); \
} \
if ((mode == 0) || (mode == JNI_ABORT)) { \
FreeHeap(buf); \
} \
} \
*** 2820,2833 ****
typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
if (start < 0 || len < 0 || (start > src->length() - len)) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
! int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
! memcpy((u_char*) buf, \
! (u_char*) src->Tag##_at_addr(start), \
! len << sc); \
} \
} \
JNI_END
DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
--- 2822,2832 ----
typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
if (start < 0 || len < 0 || (start > src->length() - len)) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
! ArrayAccess<>::arraycopy_to_native<>(src, typeArrayOopDesc::element_offset<ElementType>(start), buf, len); \
} \
} \
JNI_END
DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
*** 2870,2883 ****
typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
if (start < 0 || len < 0 || (start > dst->length() - len)) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
! int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
! memcpy((u_char*) dst->Tag##_at_addr(start), \
! (u_char*) buf, \
! len << sc); \
} \
} \
JNI_END
DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
--- 2869,2879 ----
typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
if (start < 0 || len < 0 || (start > dst->length() - len)) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
! ArrayAccess<>::arraycopy_from_native<>(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), len); \
} \
} \
JNI_END
DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
*** 3109,3119 ****
} 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;
}
}
--- 3105,3116 ----
} else {
if (len > 0) {
typeArrayOop s_value = java_lang_String::value(s);
bool is_latin1 = java_lang_String::is_latin1(s);
if (!is_latin1) {
! ArrayAccess<>::arraycopy_to_native<>(s_value, typeArrayOopDesc::element_offset<jchar>(start),
! buf, len);
} else {
for (int i = 0; i < len; i++) {
buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
}
}
< prev index next >