2457 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); 2458 jsize ret = 0; 2459 oop s = JNIHandles::resolve_non_null(string); 2460 if (java_lang_String::value(s) != NULL) { 2461 ret = java_lang_String::length(s); 2462 } 2463 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret); 2464 return ret; 2465 JNI_END 2466 2467 2468 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( 2469 JNIEnv *env, jstring string, jboolean *isCopy)) 2470 JNIWrapper("GetStringChars"); 2471 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); 2472 jchar* buf = NULL; 2473 oop s = JNIHandles::resolve_non_null(string); 2474 typeArrayOop s_value = java_lang_String::value(s); 2475 if (s_value != NULL) { 2476 int s_len = java_lang_String::length(s); 2477 int s_offset = java_lang_String::offset(s); 2478 buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination 2479 /* JNI Specification states return NULL on OOM */ 2480 if (buf != NULL) { 2481 if (s_len > 0) { 2482 memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len); 2483 } 2484 buf[s_len] = 0; 2485 //%note jni_5 2486 if (isCopy != NULL) { 2487 *isCopy = JNI_TRUE; 2488 } 2489 } 2490 } 2491 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf); 2492 return buf; 2493 JNI_END 2494 2495 2496 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) 2497 JNIWrapper("ReleaseStringChars"); 2498 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); 2499 //%note jni_6 2500 if (chars != NULL) { 2501 // Since String objects are supposed to be immutable, don't copy any 2502 // new data back. A bad user will have to go after the char array. 3101 return ret; 3102 JNI_END 3103 3104 // 3105 // Extensions 3106 // 3107 3108 DT_VOID_RETURN_MARK_DECL(GetStringRegion 3109 , HOTSPOT_JNI_GETSTRINGREGION_RETURN()); 3110 3111 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf)) 3112 JNIWrapper("GetStringRegion"); 3113 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf); 3114 DT_VOID_RETURN_MARK(GetStringRegion); 3115 oop s = JNIHandles::resolve_non_null(string); 3116 int s_len = java_lang_String::length(s); 3117 if (start < 0 || len < 0 || start + len > s_len) { 3118 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3119 } else { 3120 if (len > 0) { 3121 int s_offset = java_lang_String::offset(s); 3122 typeArrayOop s_value = java_lang_String::value(s); 3123 memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len); 3124 } 3125 } 3126 JNI_END 3127 3128 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion 3129 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN()); 3130 3131 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf)) 3132 JNIWrapper("GetStringUTFRegion"); 3133 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf); 3134 DT_VOID_RETURN_MARK(GetStringUTFRegion); 3135 oop s = JNIHandles::resolve_non_null(string); 3136 int s_len = java_lang_String::length(s); 3137 if (start < 0 || len < 0 || start + len > s_len) { 3138 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3139 } else { 3140 //%note jni_7 3141 if (len > 0) { 3142 // Assume the buffer is large enough as the JNI spec. does not require user error checking 3143 java_lang_String::as_utf8_string(s, start, len, buf, INT_MAX); 3169 } 3170 void* ret = arrayOop(a)->base(type); 3171 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret); 3172 return ret; 3173 JNI_END 3174 3175 3176 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode)) 3177 JNIWrapper("ReleasePrimitiveArrayCritical"); 3178 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode); 3179 // The array, carray and mode arguments are ignored 3180 GC_locker::unlock_critical(thread); 3181 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN(); 3182 JNI_END 3183 3184 3185 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)) 3186 JNIWrapper("GetStringCritical"); 3187 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy); 3188 GC_locker::lock_critical(thread); 3189 if (isCopy != NULL) { 3190 *isCopy = JNI_FALSE; 3191 } 3192 oop s = JNIHandles::resolve_non_null(string); 3193 int s_len = java_lang_String::length(s); 3194 typeArrayOop s_value = java_lang_String::value(s); 3195 int s_offset = java_lang_String::offset(s); 3196 const jchar* ret; 3197 if (s_len > 0) { 3198 ret = s_value->char_at_addr(s_offset); 3199 } else { 3200 ret = (jchar*) s_value->base(T_CHAR); 3201 } 3202 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret); 3203 return ret; 3204 JNI_END 3205 3206 3207 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars)) 3208 JNIWrapper("ReleaseStringCritical"); 3209 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars); 3210 // The str and chars arguments are ignored 3211 GC_locker::unlock_critical(thread); 3212 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(); 3213 JNI_END 3214 3215 3216 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref)) 3217 JNIWrapper("jni_NewWeakGlobalRef"); 3218 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref); 3219 Handle ref_handle(thread, JNIHandles::resolve(ref)); 3220 jweak ret = JNIHandles::make_weak_global(ref_handle); 3221 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret); 3222 return ret; 3223 JNI_END 3224 3225 // Must be JNI_ENTRY (with HandleMark) 3226 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref)) 3227 JNIWrapper("jni_DeleteWeakGlobalRef"); 3228 HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref); 3229 JNIHandles::destroy_weak_global(ref); 3230 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(); | 2457 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); 2458 jsize ret = 0; 2459 oop s = JNIHandles::resolve_non_null(string); 2460 if (java_lang_String::value(s) != NULL) { 2461 ret = java_lang_String::length(s); 2462 } 2463 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret); 2464 return ret; 2465 JNI_END 2466 2467 2468 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( 2469 JNIEnv *env, jstring string, jboolean *isCopy)) 2470 JNIWrapper("GetStringChars"); 2471 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); 2472 jchar* buf = NULL; 2473 oop s = JNIHandles::resolve_non_null(string); 2474 typeArrayOop s_value = java_lang_String::value(s); 2475 if (s_value != NULL) { 2476 int s_len = java_lang_String::length(s); 2477 bool is_latin1 = java_lang_String::is_latin1(s); 2478 buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination 2479 /* JNI Specification states return NULL on OOM */ 2480 if (buf != NULL) { 2481 if (s_len > 0) { 2482 if (!is_latin1) { 2483 memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len); 2484 } else { 2485 for (int i = 0; i < s_len; i++) { 2486 buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; 2487 } 2488 } 2489 } 2490 buf[s_len] = 0; 2491 //%note jni_5 2492 if (isCopy != NULL) { 2493 *isCopy = JNI_TRUE; 2494 } 2495 } 2496 } 2497 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf); 2498 return buf; 2499 JNI_END 2500 2501 2502 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) 2503 JNIWrapper("ReleaseStringChars"); 2504 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); 2505 //%note jni_6 2506 if (chars != NULL) { 2507 // Since String objects are supposed to be immutable, don't copy any 2508 // new data back. A bad user will have to go after the char array. 3107 return ret; 3108 JNI_END 3109 3110 // 3111 // Extensions 3112 // 3113 3114 DT_VOID_RETURN_MARK_DECL(GetStringRegion 3115 , HOTSPOT_JNI_GETSTRINGREGION_RETURN()); 3116 3117 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf)) 3118 JNIWrapper("GetStringRegion"); 3119 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf); 3120 DT_VOID_RETURN_MARK(GetStringRegion); 3121 oop s = JNIHandles::resolve_non_null(string); 3122 int s_len = java_lang_String::length(s); 3123 if (start < 0 || len < 0 || start + len > s_len) { 3124 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3125 } else { 3126 if (len > 0) { 3127 typeArrayOop s_value = java_lang_String::value(s); 3128 bool is_latin1 = java_lang_String::is_latin1(s); 3129 if (!is_latin1) { 3130 memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len); 3131 } else { 3132 for (int i = 0; i < len; i++) { 3133 buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff; 3134 } 3135 } 3136 } 3137 } 3138 JNI_END 3139 3140 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion 3141 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN()); 3142 3143 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf)) 3144 JNIWrapper("GetStringUTFRegion"); 3145 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf); 3146 DT_VOID_RETURN_MARK(GetStringUTFRegion); 3147 oop s = JNIHandles::resolve_non_null(string); 3148 int s_len = java_lang_String::length(s); 3149 if (start < 0 || len < 0 || start + len > s_len) { 3150 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3151 } else { 3152 //%note jni_7 3153 if (len > 0) { 3154 // Assume the buffer is large enough as the JNI spec. does not require user error checking 3155 java_lang_String::as_utf8_string(s, start, len, buf, INT_MAX); 3181 } 3182 void* ret = arrayOop(a)->base(type); 3183 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret); 3184 return ret; 3185 JNI_END 3186 3187 3188 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode)) 3189 JNIWrapper("ReleasePrimitiveArrayCritical"); 3190 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode); 3191 // The array, carray and mode arguments are ignored 3192 GC_locker::unlock_critical(thread); 3193 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN(); 3194 JNI_END 3195 3196 3197 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)) 3198 JNIWrapper("GetStringCritical"); 3199 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy); 3200 GC_locker::lock_critical(thread); 3201 oop s = JNIHandles::resolve_non_null(string); 3202 typeArrayOop s_value = java_lang_String::value(s); 3203 bool is_latin1 = java_lang_String::is_latin1(s); 3204 if (isCopy != NULL) { 3205 *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE; 3206 } 3207 const jchar* ret; 3208 if (!is_latin1) { 3209 ret = s_value->char_at_addr(0); 3210 } else { 3211 // Inflate latin1 encoded string to UTF16 3212 int s_len = java_lang_String::length(s); 3213 jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal); 3214 for (int i = 0; i < s_len; i++) { 3215 buf[i] = ((jchar) s_value->byte_at(i)) & 0xff; 3216 } 3217 ret = &buf[0]; 3218 } 3219 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret); 3220 return ret; 3221 JNI_END 3222 3223 3224 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars)) 3225 JNIWrapper("ReleaseStringCritical"); 3226 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars); 3227 // The str and chars arguments are ignored for UTF16 strings 3228 oop s = JNIHandles::resolve_non_null(str); 3229 bool is_latin1 = java_lang_String::is_latin1(s); 3230 if (is_latin1) { 3231 // For latin1 string, free jchar array allocated by earlier call to GetStringCritical. 3232 // This assumes that ReleaseStringCritical bookends GetStringCritical. 3233 FREE_C_HEAP_ARRAY(jchar, chars); 3234 } 3235 GC_locker::unlock_critical(thread); 3236 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(); 3237 JNI_END 3238 3239 3240 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref)) 3241 JNIWrapper("jni_NewWeakGlobalRef"); 3242 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref); 3243 Handle ref_handle(thread, JNIHandles::resolve(ref)); 3244 jweak ret = JNIHandles::make_weak_global(ref_handle); 3245 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret); 3246 return ret; 3247 JNI_END 3248 3249 // Must be JNI_ENTRY (with HandleMark) 3250 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref)) 3251 JNIWrapper("jni_DeleteWeakGlobalRef"); 3252 HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref); 3253 JNIHandles::destroy_weak_global(ref); 3254 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(); |