@@ -419,13 +419,20 @@ + (jobject) getCAccessible:(jobject)jaccessible withEnv:(JNIEnv *)env {
419
419
GET_CACCESSIBLE_CLASS_RETURN (NULL );
420
420
DECLARE_STATIC_METHOD_RETURN (sjm_getCAccessible, sjc_CAccessible, " getCAccessible" ,
421
421
" (Ljavax/accessibility/Accessible;)Lsun/lwawt/macosx/CAccessible;" , NULL );
422
- if ((*env)->IsInstanceOf (env, jaccessible, sjc_CAccessible)) {
423
- return jaccessible;
424
- } else if ((*env)->IsInstanceOf (env, jaccessible, sjc_Accessible)) {
425
- jobject o = (*env)->CallStaticObjectMethod (env, sjc_CAccessible, sjm_getCAccessible, jaccessible);
422
+
423
+ // jaccessible is a weak ref, check it's still alive
424
+ jobject jaccessibleLocal = (*env)->NewLocalRef (env, jaccessible);
425
+ if ((*env)->IsSameObject (env, jaccessibleLocal, NULL )) return NULL ;
426
+
427
+ if ((*env)->IsInstanceOf (env, jaccessibleLocal, sjc_CAccessible)) {
428
+ return jaccessibleLocal; // delete in the caller
429
+ } else if ((*env)->IsInstanceOf (env, jaccessibleLocal, sjc_Accessible)) {
430
+ jobject jCAX = (*env)->CallStaticObjectMethod (env, sjc_CAccessible, sjm_getCAccessible, jaccessibleLocal);
426
431
CHECK_EXCEPTION ();
427
- return o;
432
+ (*env)->DeleteLocalRef (env, jaccessibleLocal);
433
+ return jCAX; // delete in the caller
428
434
}
435
+ (*env)->DeleteLocalRef (env, jaccessibleLocal);
429
436
return NULL ;
430
437
}
431
438
@@ -535,12 +542,10 @@ + (CommonComponentAccessibility *) createWithParent:(CommonComponentAccessibilit
535
542
// try to fetch the jCAX from Java, and return autoreleased
536
543
jobject jCAX = [CommonComponentAccessibility getCAccessible: jaccessible withEnv: env];
537
544
if (jCAX == NULL ) return nil ;
538
- if (!wrapped) { // If wrapped is true, then you don't need to get an existing instance, you need to create a new one
539
- CommonComponentAccessibility *value = (CommonComponentAccessibility *) jlong_to_ptr ((*env)->GetLongField (env, jCAX, jf_ptr));
540
- if (value != nil ) {
541
- (*env)->DeleteLocalRef (env, jCAX);
542
- return [[value retain ] autorelease ];
543
- }
545
+ CommonComponentAccessibility *value = (CommonComponentAccessibility *) jlong_to_ptr ((*env)->GetLongField (env, jCAX, jf_ptr));
546
+ if (value != nil ) {
547
+ (*env)->DeleteLocalRef (env, jCAX);
548
+ return [[value retain ] autorelease ];
544
549
}
545
550
546
551
// otherwise, create a new instance
@@ -561,10 +566,7 @@ + (CommonComponentAccessibility *) createWithParent:(CommonComponentAccessibilit
561
566
[newChild retain ];
562
567
(*env)->SetLongField (env, jCAX, jf_ptr, ptr_to_jlong (newChild));
563
568
564
- // the link is removed in the wrapper
565
- if (!wrapped) {
566
- (*env)->DeleteLocalRef (env, jCAX);
567
- }
569
+ (*env)->DeleteLocalRef (env, jCAX);
568
570
569
571
// return autoreleased instance
570
572
return [newChild autorelease ];
0 commit comments