2449 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
2450 return ret;
2451 JNI_END
2452
2453
2454 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
2455 JNIEnv *env, jstring string, jboolean *isCopy))
2456 JNIWrapper("GetStringChars");
2457 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
2458 jchar* buf = NULL;
2459 oop s = JNIHandles::resolve_non_null(string);
2460 typeArrayOop s_value = java_lang_String::value(s);
2461 if (s_value != NULL) {
2462 int s_len = java_lang_String::length(s);
2463 bool is_latin1 = java_lang_String::is_latin1(s);
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 */
2466 if (buf != NULL) {
2467 if (s_len > 0) {
2468 if (!is_latin1) {
2469 ArrayAccess<>::arraycopy_to_native<jchar>(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
2470 buf, s_len);
2471 } else {
2472 for (int i = 0; i < s_len; i++) {
2473 buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
2474 }
2475 }
2476 }
2477 buf[s_len] = 0;
2478 //%note jni_5
2479 if (isCopy != NULL) {
2480 *isCopy = JNI_TRUE;
2481 }
2482 }
2483 }
2484 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf);
2485 return buf;
2486 JNI_END
2487
2488
2489 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
2706 , EntryProbe, ReturnProbe) \
2707 \
2708 JNI_QUICK_ENTRY(ElementType*, \
2709 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
2710 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
2711 EntryProbe; \
2712 /* allocate an chunk of memory in c land */ \
2713 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2714 ElementType* result; \
2715 int len = a->length(); \
2716 if (len == 0) { \
2717 /* Empty array: legal but useless, can't return NULL. \
2718 * Return a pointer to something useless. \
2719 * Avoid asserts in typeArrayOop. */ \
2720 result = (ElementType*)get_bad_address(); \
2721 } else { \
2722 /* JNI Specification states return NULL on OOM */ \
2723 result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
2724 if (result != NULL) { \
2725 /* copy the array to the c chunk */ \
2726 ArrayAccess<>::arraycopy_to_native<ElementType>(a, typeArrayOopDesc::element_offset<ElementType>(0), \
2727 result, len); \
2728 if (isCopy) { \
2729 *isCopy = JNI_TRUE; \
2730 } \
2731 } \
2732 } \
2733 ReturnProbe; \
2734 return result; \
2735 JNI_END
2736
2737 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
2738 , HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2739 HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_RETURN((uintptr_t*)result))
2740 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
2741 , HOTSPOT_JNI_GETBYTEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2742 HOTSPOT_JNI_GETBYTEARRAYELEMENTS_RETURN((char*)result))
2743 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
2744 , HOTSPOT_JNI_GETSHORTARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
2745 HOTSPOT_JNI_GETSHORTARRAYELEMENTS_RETURN((uint16_t*)result))
2746 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
2756 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float
2757 , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2758 HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result))
2759 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
2760 , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2761 HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result))
2762
2763
2764 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \
2765 , EntryProbe, ReturnProbe);\
2766 \
2767 JNI_QUICK_ENTRY(void, \
2768 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
2769 ElementType *buf, jint mode)) \
2770 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
2771 EntryProbe; \
2772 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2773 int len = a->length(); \
2774 if (len != 0) { /* Empty array: nothing to free or copy. */ \
2775 if ((mode == 0) || (mode == JNI_COMMIT)) { \
2776 ArrayAccess<>::arraycopy_from_native<ElementType>(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), len); \
2777 } \
2778 if ((mode == 0) || (mode == JNI_ABORT)) { \
2779 FreeHeap(buf); \
2780 } \
2781 } \
2782 ReturnProbe; \
2783 JNI_END
2784
2785 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
2786 , HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
2787 HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_RETURN())
2788 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
2789 , HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_ENTRY(env, array, (char *) buf, mode),
2790 HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_RETURN())
2791 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
2792 , HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
2793 HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_RETURN())
2794 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
2795 , HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
2796 HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_RETURN())
2807 , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode),
2808 HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN())
2809
2810
2811 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
2812 , EntryProbe, ReturnProbe); \
2813 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \
2814 , ReturnProbe); \
2815 \
2816 JNI_ENTRY(void, \
2817 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
2818 jsize len, ElementType *buf)) \
2819 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
2820 EntryProbe; \
2821 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
2822 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2823 if (start < 0 || len < 0 || (start > src->length() - len)) { \
2824 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
2825 } else { \
2826 if (len > 0) { \
2827 ArrayAccess<>::arraycopy_to_native<ElementType>(src, typeArrayOopDesc::element_offset<ElementType>(start), buf, len); \
2828 } \
2829 } \
2830 JNI_END
2831
2832 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
2833 , HOTSPOT_JNI_GETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
2834 HOTSPOT_JNI_GETBOOLEANARRAYREGION_RETURN());
2835 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
2836 , HOTSPOT_JNI_GETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
2837 HOTSPOT_JNI_GETBYTEARRAYREGION_RETURN());
2838 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short
2839 , HOTSPOT_JNI_GETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2840 HOTSPOT_JNI_GETSHORTARRAYREGION_RETURN());
2841 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char
2842 , HOTSPOT_JNI_GETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t*) buf),
2843 HOTSPOT_JNI_GETCHARARRAYREGION_RETURN());
2844 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int
2845 , HOTSPOT_JNI_GETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t*) buf),
2846 HOTSPOT_JNI_GETINTARRAYREGION_RETURN());
2847 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long
2854 , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
2855 HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN());
2856
2857
2858 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
2859 , EntryProbe, ReturnProbe); \
2860 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \
2861 ,ReturnProbe); \
2862 \
2863 JNI_ENTRY(void, \
2864 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
2865 jsize len, const ElementType *buf)) \
2866 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
2867 EntryProbe; \
2868 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
2869 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2870 if (start < 0 || len < 0 || (start > dst->length() - len)) { \
2871 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
2872 } else { \
2873 if (len > 0) { \
2874 ArrayAccess<>::arraycopy_from_native<ElementType>(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), len); \
2875 } \
2876 } \
2877 JNI_END
2878
2879 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
2880 , HOTSPOT_JNI_SETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *)buf),
2881 HOTSPOT_JNI_SETBOOLEANARRAYREGION_RETURN())
2882 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
2883 , HOTSPOT_JNI_SETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
2884 HOTSPOT_JNI_SETBYTEARRAYREGION_RETURN())
2885 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short
2886 , HOTSPOT_JNI_SETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2887 HOTSPOT_JNI_SETSHORTARRAYREGION_RETURN())
2888 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char
2889 , HOTSPOT_JNI_SETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2890 HOTSPOT_JNI_SETCHARARRAYREGION_RETURN())
2891 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int
2892 , HOTSPOT_JNI_SETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t *) buf),
2893 HOTSPOT_JNI_SETINTARRAYREGION_RETURN())
2894 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long
3090 //
3091 // Extensions
3092 //
3093
3094 DT_VOID_RETURN_MARK_DECL(GetStringRegion
3095 , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
3096
3097 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
3098 JNIWrapper("GetStringRegion");
3099 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
3100 DT_VOID_RETURN_MARK(GetStringRegion);
3101 oop s = JNIHandles::resolve_non_null(string);
3102 int s_len = java_lang_String::length(s);
3103 if (start < 0 || len < 0 || start > s_len - len) {
3104 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3105 } else {
3106 if (len > 0) {
3107 typeArrayOop s_value = java_lang_String::value(s);
3108 bool is_latin1 = java_lang_String::is_latin1(s);
3109 if (!is_latin1) {
3110 ArrayAccess<>::arraycopy_to_native<jchar>(s_value, typeArrayOopDesc::element_offset<jchar>(start),
3111 buf, len);
3112 } else {
3113 for (int i = 0; i < len; i++) {
3114 buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
3115 }
3116 }
3117 }
3118 }
3119 JNI_END
3120
3121 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
3122 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
3123
3124 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
3125 JNIWrapper("GetStringUTFRegion");
3126 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
3127 DT_VOID_RETURN_MARK(GetStringUTFRegion);
3128 oop s = JNIHandles::resolve_non_null(string);
3129 int s_len = java_lang_String::length(s);
3130 if (start < 0 || len < 0 || start > s_len - len) {
|
2449 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
2450 return ret;
2451 JNI_END
2452
2453
2454 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
2455 JNIEnv *env, jstring string, jboolean *isCopy))
2456 JNIWrapper("GetStringChars");
2457 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
2458 jchar* buf = NULL;
2459 oop s = JNIHandles::resolve_non_null(string);
2460 typeArrayOop s_value = java_lang_String::value(s);
2461 if (s_value != NULL) {
2462 int s_len = java_lang_String::length(s);
2463 bool is_latin1 = java_lang_String::is_latin1(s);
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 */
2466 if (buf != NULL) {
2467 if (s_len > 0) {
2468 if (!is_latin1) {
2469 ArrayAccess<>::arraycopy_to_native<>(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
2470 buf, s_len);
2471 } else {
2472 for (int i = 0; i < s_len; i++) {
2473 buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
2474 }
2475 }
2476 }
2477 buf[s_len] = 0;
2478 //%note jni_5
2479 if (isCopy != NULL) {
2480 *isCopy = JNI_TRUE;
2481 }
2482 }
2483 }
2484 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf);
2485 return buf;
2486 JNI_END
2487
2488
2489 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
2706 , EntryProbe, ReturnProbe) \
2707 \
2708 JNI_QUICK_ENTRY(ElementType*, \
2709 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
2710 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
2711 EntryProbe; \
2712 /* allocate an chunk of memory in c land */ \
2713 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2714 ElementType* result; \
2715 int len = a->length(); \
2716 if (len == 0) { \
2717 /* Empty array: legal but useless, can't return NULL. \
2718 * Return a pointer to something useless. \
2719 * Avoid asserts in typeArrayOop. */ \
2720 result = (ElementType*)get_bad_address(); \
2721 } else { \
2722 /* JNI Specification states return NULL on OOM */ \
2723 result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
2724 if (result != NULL) { \
2725 /* copy the array to the c chunk */ \
2726 ArrayAccess<>::arraycopy_to_native<>(a, typeArrayOopDesc::element_offset<ElementType>(0), \
2727 result, len); \
2728 if (isCopy) { \
2729 *isCopy = JNI_TRUE; \
2730 } \
2731 } \
2732 } \
2733 ReturnProbe; \
2734 return result; \
2735 JNI_END
2736
2737 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
2738 , HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2739 HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_RETURN((uintptr_t*)result))
2740 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
2741 , HOTSPOT_JNI_GETBYTEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2742 HOTSPOT_JNI_GETBYTEARRAYELEMENTS_RETURN((char*)result))
2743 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
2744 , HOTSPOT_JNI_GETSHORTARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
2745 HOTSPOT_JNI_GETSHORTARRAYELEMENTS_RETURN((uint16_t*)result))
2746 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
2756 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float
2757 , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2758 HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result))
2759 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
2760 , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
2761 HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result))
2762
2763
2764 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \
2765 , EntryProbe, ReturnProbe);\
2766 \
2767 JNI_QUICK_ENTRY(void, \
2768 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
2769 ElementType *buf, jint mode)) \
2770 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
2771 EntryProbe; \
2772 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2773 int len = a->length(); \
2774 if (len != 0) { /* Empty array: nothing to free or copy. */ \
2775 if ((mode == 0) || (mode == JNI_COMMIT)) { \
2776 ArrayAccess<>::arraycopy_from_native<>(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), len); \
2777 } \
2778 if ((mode == 0) || (mode == JNI_ABORT)) { \
2779 FreeHeap(buf); \
2780 } \
2781 } \
2782 ReturnProbe; \
2783 JNI_END
2784
2785 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
2786 , HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
2787 HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_RETURN())
2788 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
2789 , HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_ENTRY(env, array, (char *) buf, mode),
2790 HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_RETURN())
2791 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
2792 , HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
2793 HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_RETURN())
2794 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
2795 , HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
2796 HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_RETURN())
2807 , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode),
2808 HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN())
2809
2810
2811 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
2812 , EntryProbe, ReturnProbe); \
2813 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \
2814 , ReturnProbe); \
2815 \
2816 JNI_ENTRY(void, \
2817 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
2818 jsize len, ElementType *buf)) \
2819 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
2820 EntryProbe; \
2821 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
2822 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2823 if (start < 0 || len < 0 || (start > src->length() - len)) { \
2824 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
2825 } else { \
2826 if (len > 0) { \
2827 ArrayAccess<>::arraycopy_to_native<>(src, typeArrayOopDesc::element_offset<ElementType>(start), buf, len); \
2828 } \
2829 } \
2830 JNI_END
2831
2832 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
2833 , HOTSPOT_JNI_GETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
2834 HOTSPOT_JNI_GETBOOLEANARRAYREGION_RETURN());
2835 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
2836 , HOTSPOT_JNI_GETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
2837 HOTSPOT_JNI_GETBYTEARRAYREGION_RETURN());
2838 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short
2839 , HOTSPOT_JNI_GETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2840 HOTSPOT_JNI_GETSHORTARRAYREGION_RETURN());
2841 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char
2842 , HOTSPOT_JNI_GETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t*) buf),
2843 HOTSPOT_JNI_GETCHARARRAYREGION_RETURN());
2844 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int
2845 , HOTSPOT_JNI_GETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t*) buf),
2846 HOTSPOT_JNI_GETINTARRAYREGION_RETURN());
2847 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long
2854 , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
2855 HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN());
2856
2857
2858 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
2859 , EntryProbe, ReturnProbe); \
2860 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \
2861 ,ReturnProbe); \
2862 \
2863 JNI_ENTRY(void, \
2864 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
2865 jsize len, const ElementType *buf)) \
2866 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
2867 EntryProbe; \
2868 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
2869 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
2870 if (start < 0 || len < 0 || (start > dst->length() - len)) { \
2871 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
2872 } else { \
2873 if (len > 0) { \
2874 ArrayAccess<>::arraycopy_from_native<>(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), len); \
2875 } \
2876 } \
2877 JNI_END
2878
2879 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
2880 , HOTSPOT_JNI_SETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *)buf),
2881 HOTSPOT_JNI_SETBOOLEANARRAYREGION_RETURN())
2882 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
2883 , HOTSPOT_JNI_SETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
2884 HOTSPOT_JNI_SETBYTEARRAYREGION_RETURN())
2885 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short
2886 , HOTSPOT_JNI_SETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2887 HOTSPOT_JNI_SETSHORTARRAYREGION_RETURN())
2888 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char
2889 , HOTSPOT_JNI_SETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
2890 HOTSPOT_JNI_SETCHARARRAYREGION_RETURN())
2891 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int
2892 , HOTSPOT_JNI_SETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t *) buf),
2893 HOTSPOT_JNI_SETINTARRAYREGION_RETURN())
2894 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long
3090 //
3091 // Extensions
3092 //
3093
3094 DT_VOID_RETURN_MARK_DECL(GetStringRegion
3095 , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
3096
3097 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
3098 JNIWrapper("GetStringRegion");
3099 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
3100 DT_VOID_RETURN_MARK(GetStringRegion);
3101 oop s = JNIHandles::resolve_non_null(string);
3102 int s_len = java_lang_String::length(s);
3103 if (start < 0 || len < 0 || start > s_len - len) {
3104 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3105 } else {
3106 if (len > 0) {
3107 typeArrayOop s_value = java_lang_String::value(s);
3108 bool is_latin1 = java_lang_String::is_latin1(s);
3109 if (!is_latin1) {
3110 ArrayAccess<>::arraycopy_to_native<>(s_value, typeArrayOopDesc::element_offset<jchar>(start),
3111 buf, len);
3112 } else {
3113 for (int i = 0; i < len; i++) {
3114 buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
3115 }
3116 }
3117 }
3118 }
3119 JNI_END
3120
3121 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
3122 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
3123
3124 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
3125 JNIWrapper("GetStringUTFRegion");
3126 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
3127 DT_VOID_RETURN_MARK(GetStringUTFRegion);
3128 oop s = JNIHandles::resolve_non_null(string);
3129 int s_len = java_lang_String::length(s);
3130 if (start < 0 || len < 0 || start > s_len - len) {
|