< prev index next >

src/hotspot/share/prims/jni.cpp

Print this page
rev 49674 : 8198285: More consistent Access API for arraycopy


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());


< prev index next >