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