Add crashing test on KT-41811 (#4437)
This commit is contained in:
committed by
GitHub
parent
9e6031e66a
commit
6c1a482539
@@ -5,6 +5,8 @@ extern BOOL deallocRetainReleaseDeallocated;
|
|||||||
@interface DeallocRetainRelease : NSObject
|
@interface DeallocRetainRelease : NSObject
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
extern DeallocRetainRelease* globalDeallocRetainRelease;
|
||||||
|
|
||||||
@protocol WeakReference
|
@protocol WeakReference
|
||||||
@required
|
@required
|
||||||
@property (weak) id referent;
|
@property (weak) id referent;
|
||||||
|
|||||||
@@ -81,3 +81,38 @@ private fun createGarbageDeallocLoadWeak(weakRef: WeakReferenceProtocol) {
|
|||||||
assertSame(obj, weakDeallocLoadWeak!!.referent)
|
assertSame(obj, weakDeallocLoadWeak!!.referent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testKT41811WithGlobal() {
|
||||||
|
// Attempt to make the state predictable:
|
||||||
|
kotlin.native.internal.GC.collect()
|
||||||
|
|
||||||
|
deallocRetainReleaseDeallocated = false
|
||||||
|
assertFalse(deallocRetainReleaseDeallocated)
|
||||||
|
|
||||||
|
autoreleasepool {
|
||||||
|
{
|
||||||
|
globalDeallocRetainRelease = object: DeallocRetainRelease() {}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFalse(deallocRetainReleaseDeallocated)
|
||||||
|
|
||||||
|
// Clean up local DeallocRetainRelease on Kotlin side
|
||||||
|
kotlin.native.internal.GC.collect()
|
||||||
|
|
||||||
|
assertFalse(deallocRetainReleaseDeallocated)
|
||||||
|
|
||||||
|
// And drop the last reference to DeallocRetainRelease from ObjC global scope.
|
||||||
|
globalDeallocRetainRelease = null
|
||||||
|
|
||||||
|
assertFalse(deallocRetainReleaseDeallocated)
|
||||||
|
|
||||||
|
// This will dispose `DeallocRetainRelease` on Kotlin side, which will cause `dealloc`
|
||||||
|
// on ObjC side, which triggers `retain` and `release` of `self`. If these messages
|
||||||
|
// were to reach Kotlin side, the `release` would have immediately scheduled the
|
||||||
|
// second disposal of Kotlin object.
|
||||||
|
kotlin.native.internal.GC.collect()
|
||||||
|
|
||||||
|
assertTrue(deallocRetainReleaseDeallocated)
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ BOOL deallocRetainReleaseDeallocated = NO;
|
|||||||
}
|
}
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
DeallocRetainRelease* globalDeallocRetainRelease = nil;
|
||||||
|
|
||||||
@implementation ObjCWeakReference
|
@implementation ObjCWeakReference
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user