src/hotspot/share/prims/jni.cpp
changeset 50389 7e8c0409a747
parent 50113 caf115bb98ad
child 50429 83aec1d357d4
equal deleted inserted replaced
50388:55fac6146d31 50389:7e8c0409a747
  2464     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2464     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
  2465     /* JNI Specification states return NULL on OOM */
  2465     /* JNI Specification states return NULL on OOM */
  2466     if (buf != NULL) {
  2466     if (buf != NULL) {
  2467       if (s_len > 0) {
  2467       if (s_len > 0) {
  2468         if (!is_latin1) {
  2468         if (!is_latin1) {
  2469           memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len);
  2469           ArrayAccess<>::arraycopy_to_native(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
       
  2470                                              buf, s_len);
  2470         } else {
  2471         } else {
  2471           for (int i = 0; i < s_len; i++) {
  2472           for (int i = 0; i < s_len; i++) {
  2472             buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
  2473             buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
  2473           }
  2474           }
  2474         }
  2475         }
  2720   } else { \
  2721   } else { \
  2721     /* JNI Specification states return NULL on OOM */                    \
  2722     /* JNI Specification states return NULL on OOM */                    \
  2722     result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
  2723     result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
  2723     if (result != NULL) {                                                \
  2724     if (result != NULL) {                                                \
  2724       /* copy the array to the c chunk */                                \
  2725       /* copy the array to the c chunk */                                \
  2725       memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len);      \
  2726       ArrayAccess<>::arraycopy_to_native(a, typeArrayOopDesc::element_offset<ElementType>(0), \
       
  2727                                          result, len);                   \
  2726       if (isCopy) {                                                      \
  2728       if (isCopy) {                                                      \
  2727         *isCopy = JNI_TRUE;                                              \
  2729         *isCopy = JNI_TRUE;                                              \
  2728       }                                                                  \
  2730       }                                                                  \
  2729     }                                                                    \
  2731     }                                                                    \
  2730   } \
  2732   } \
  2769   EntryProbe; \
  2771   EntryProbe; \
  2770   typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2772   typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2771   int len = a->length(); \
  2773   int len = a->length(); \
  2772   if (len != 0) {   /* Empty array:  nothing to free or copy. */  \
  2774   if (len != 0) {   /* Empty array:  nothing to free or copy. */  \
  2773     if ((mode == 0) || (mode == JNI_COMMIT)) { \
  2775     if ((mode == 0) || (mode == JNI_COMMIT)) { \
  2774       memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
  2776       ArrayAccess<>::arraycopy_from_native(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), len); \
  2775     } \
  2777     } \
  2776     if ((mode == 0) || (mode == JNI_ABORT)) { \
  2778     if ((mode == 0) || (mode == JNI_ABORT)) { \
  2777       FreeHeap(buf); \
  2779       FreeHeap(buf); \
  2778     } \
  2780     } \
  2779   } \
  2781   } \
  2820   typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2822   typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2821   if (start < 0 || len < 0 || (start > src->length() - len)) { \
  2823   if (start < 0 || len < 0 || (start > src->length() - len)) { \
  2822     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
  2824     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
  2823   } else { \
  2825   } else { \
  2824     if (len > 0) { \
  2826     if (len > 0) { \
  2825       int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
  2827       ArrayAccess<>::arraycopy_to_native(src, typeArrayOopDesc::element_offset<ElementType>(start), buf, len); \
  2826       memcpy((u_char*) buf, \
       
  2827              (u_char*) src->Tag##_at_addr(start), \
       
  2828              len << sc);                          \
       
  2829     } \
  2828     } \
  2830   } \
  2829   } \
  2831 JNI_END
  2830 JNI_END
  2832 
  2831 
  2833 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
  2832 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
  2870   typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2869   typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
  2871   if (start < 0 || len < 0 || (start > dst->length() - len)) { \
  2870   if (start < 0 || len < 0 || (start > dst->length() - len)) { \
  2872     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
  2871     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
  2873   } else { \
  2872   } else { \
  2874     if (len > 0) { \
  2873     if (len > 0) { \
  2875       int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
  2874       ArrayAccess<>::arraycopy_from_native(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), len); \
  2876       memcpy((u_char*) dst->Tag##_at_addr(start), \
       
  2877              (u_char*) buf, \
       
  2878              len << sc);    \
       
  2879     } \
  2875     } \
  2880   } \
  2876   } \
  2881 JNI_END
  2877 JNI_END
  2882 
  2878 
  2883 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
  2879 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
  3109   } else {
  3105   } else {
  3110     if (len > 0) {
  3106     if (len > 0) {
  3111       typeArrayOop s_value = java_lang_String::value(s);
  3107       typeArrayOop s_value = java_lang_String::value(s);
  3112       bool is_latin1 = java_lang_String::is_latin1(s);
  3108       bool is_latin1 = java_lang_String::is_latin1(s);
  3113       if (!is_latin1) {
  3109       if (!is_latin1) {
  3114         memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len);
  3110         ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset<jchar>(start),
       
  3111                                            buf, len);
  3115       } else {
  3112       } else {
  3116         for (int i = 0; i < len; i++) {
  3113         for (int i = 0; i < len; i++) {
  3117           buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
  3114           buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
  3118         }
  3115         }
  3119       }
  3116       }