< prev index next >

src/hotspot/share/prims/jni.cpp

erik 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           ArrayAccess<>::arraycopy_to_native<>(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),                         
2469                                                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))                                          

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           ArrayAccess<>::arraycopy_to_native(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
2469                                              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))

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       ArrayAccess<>::arraycopy_to_native<>(a, typeArrayOopDesc::element_offset<ElementType>(0), \                                    
2726                                            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                                                                     

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       ArrayAccess<>::arraycopy_to_native(a, typeArrayOopDesc::element_offset<ElementType>(0), \
2726                                          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

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       ArrayAccess<>::arraycopy_from_native<>(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), 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),                 

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       ArrayAccess<>::arraycopy_from_native(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), 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),

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       ArrayAccess<>::arraycopy_to_native<>(src, typeArrayOopDesc::element_offset<ElementType>(start), 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());                                                                 

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       ArrayAccess<>::arraycopy_to_native(src, typeArrayOopDesc::element_offset<ElementType>(start), 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());

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       ArrayAccess<>::arraycopy_from_native<>(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), 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())                                                                  

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       ArrayAccess<>::arraycopy_from_native(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), 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())

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         ArrayAccess<>::arraycopy_to_native<>(s_value, typeArrayOopDesc::element_offset<jchar>(start),                                
3110                                              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) {                                                                                 

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         ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset<jchar>(start),
3110                                            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) {
< prev index next >