3167 // as_utf8_string null-terminates the result string
3168 } else {
3169 // JDK null-terminates the buffer even in len is zero
3170 if (buf != NULL) {
3171 buf[0] = 0;
3172 }
3173 }
3174 }
3175 JNI_END
3176
3177
3178 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
3179 JNIWrapper("GetPrimitiveArrayCritical");
3180 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy);
3181 GCLocker::lock_critical(thread);
3182 if (isCopy != NULL) {
3183 *isCopy = JNI_FALSE;
3184 }
3185 oop a = JNIHandles::resolve_non_null(array);
3186 a = oopDesc::bs()->write_barrier(a);
3187 assert(a->is_array(), "just checking");
3188 BasicType type;
3189 if (a->is_objArray()) {
3190 type = T_OBJECT;
3191 } else {
3192 type = TypeArrayKlass::cast(a->klass())->element_type();
3193 }
3194 void* ret = arrayOop(a)->base(type);
3195 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3196 return ret;
3197 JNI_END
3198
3199
3200 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3201 JNIWrapper("ReleasePrimitiveArrayCritical");
3202 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3203 // The array, carray and mode arguments are ignored
3204 GCLocker::unlock_critical(thread);
3205 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3206 JNI_END
3207
3208
3209 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3210 JNIWrapper("GetStringCritical");
3211 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3212 GCLocker::lock_critical(thread);
3213 oop s = JNIHandles::resolve_non_null(string);
3214 typeArrayOop s_value = java_lang_String::value(s);
3215 bool is_latin1 = java_lang_String::is_latin1(s);
3216 if (isCopy != NULL) {
3217 *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
3218 }
3219 jchar* ret;
3220 if (!is_latin1) {
3221 ret = (jchar*) s_value->base(T_CHAR);
3222 } else {
3223 // Inflate latin1 encoded string to UTF16
3224 int s_len = java_lang_String::length(s);
3225 ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
3226 /* JNI Specification states return NULL on OOM */
3227 if (ret != NULL) {
3228 for (int i = 0; i < s_len; i++) {
3229 ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
3230 }
3231 ret[s_len] = 0;
3232 }
3233 }
3234 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3235 return ret;
3236 JNI_END
3237
3238
3239 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3240 JNIWrapper("ReleaseStringCritical");
3241 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3242 // The str and chars arguments are ignored for UTF16 strings
3243 oop s = JNIHandles::resolve_non_null(str);
3244 bool is_latin1 = java_lang_String::is_latin1(s);
3245 if (is_latin1) {
3246 // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
3247 // This assumes that ReleaseStringCritical bookends GetStringCritical.
3248 FREE_C_HEAP_ARRAY(jchar, chars);
3249 }
3250 GCLocker::unlock_critical(thread);
3251 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3252 JNI_END
3253
3254
3255 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3256 JNIWrapper("jni_NewWeakGlobalRef");
3257 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3258 Handle ref_handle(thread, JNIHandles::resolve(ref));
3259 jweak ret = JNIHandles::make_weak_global(ref_handle);
3260 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3261 return ret;
3262 JNI_END
3263
|
3167 // as_utf8_string null-terminates the result string
3168 } else {
3169 // JDK null-terminates the buffer even in len is zero
3170 if (buf != NULL) {
3171 buf[0] = 0;
3172 }
3173 }
3174 }
3175 JNI_END
3176
3177
3178 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
3179 JNIWrapper("GetPrimitiveArrayCritical");
3180 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy);
3181 GCLocker::lock_critical(thread);
3182 if (isCopy != NULL) {
3183 *isCopy = JNI_FALSE;
3184 }
3185 oop a = JNIHandles::resolve_non_null(array);
3186 a = oopDesc::bs()->write_barrier(a);
3187 Universe::heap()->enter_critical(a);
3188 assert(a->is_array(), "just checking");
3189 BasicType type;
3190 if (a->is_objArray()) {
3191 type = T_OBJECT;
3192 } else {
3193 type = TypeArrayKlass::cast(a->klass())->element_type();
3194 }
3195 void* ret = arrayOop(a)->base(type);
3196 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3197 return ret;
3198 JNI_END
3199
3200
3201 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3202 JNIWrapper("ReleasePrimitiveArrayCritical");
3203 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3204 // The array, carray and mode arguments are ignored
3205 oop a = JNIHandles::resolve_non_null(array);
3206 a = oopDesc::bs()->read_barrier(a);
3207 #ifdef ASSERT
3208 assert(a->is_array(), "just checking");
3209 BasicType type;
3210 if (a->is_objArray()) {
3211 type = T_OBJECT;
3212 } else {
3213 type = TypeArrayKlass::cast(a->klass())->element_type();
3214 }
3215 void* ret = arrayOop(a)->base(type);
3216 assert(ret == carray, "check array not moved");
3217 #endif
3218
3219 Universe::heap()->exit_critical(a);
3220 GCLocker::unlock_critical(thread);
3221 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3222 JNI_END
3223
3224
3225 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3226 JNIWrapper("GetStringCritical");
3227 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3228 GCLocker::lock_critical(thread);
3229 oop s = JNIHandles::resolve_non_null(string);
3230 s = oopDesc::bs()->write_barrier(s);
3231 Universe::heap()->enter_critical(s);
3232 typeArrayOop s_value = java_lang_String::value(s);
3233 bool is_latin1 = java_lang_String::is_latin1(s);
3234 if (isCopy != NULL) {
3235 *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
3236 }
3237 jchar* ret;
3238 if (!is_latin1) {
3239 ret = (jchar*) s_value->base(T_CHAR);
3240 } else {
3241 // Inflate latin1 encoded string to UTF16
3242 int s_len = java_lang_String::length(s);
3243 ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
3244 /* JNI Specification states return NULL on OOM */
3245 if (ret != NULL) {
3246 for (int i = 0; i < s_len; i++) {
3247 ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
3248 }
3249 ret[s_len] = 0;
3250 }
3251 }
3252 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3253 return ret;
3254 JNI_END
3255
3256
3257 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3258 JNIWrapper("ReleaseStringCritical");
3259 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3260 // The str and chars arguments are ignored for UTF16 strings
3261 oop s = JNIHandles::resolve_non_null(str);
3262 s = oopDesc::bs()->read_barrier(s);
3263 Universe::heap()->exit_critical(s);
3264 bool is_latin1 = java_lang_String::is_latin1(s);
3265 if (is_latin1) {
3266 // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
3267 // This assumes that ReleaseStringCritical bookends GetStringCritical.
3268 FREE_C_HEAP_ARRAY(jchar, chars);
3269 }
3270 GCLocker::unlock_critical(thread);
3271 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3272 JNI_END
3273
3274
3275 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3276 JNIWrapper("jni_NewWeakGlobalRef");
3277 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3278 Handle ref_handle(thread, JNIHandles::resolve(ref));
3279 jweak ret = JNIHandles::make_weak_global(ref_handle);
3280 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3281 return ret;
3282 JNI_END
3283
|