@@ -22,29 +22,39 @@ fn throw_catch_raise_catch() {
22
22
let reason = NSString :: from_str ( "def" ) ;
23
23
24
24
let exc = NSException :: new ( & name, Some ( & reason) , None ) . unwrap ( ) ;
25
- // TODO: Investigate why this is required on GNUStep!
26
- let _exc2 = exc. clone ( ) ;
27
25
28
- assert_retain_count ( & exc, 2 ) ;
29
-
30
- // TODO: Investigate this!
31
- let extra_retain = usize:: from ( cfg ! ( all(
32
- feature = "apple" ,
33
- target_os = "macos" ,
34
- target_arch = "x86"
35
- ) ) ) ;
26
+ assert_retain_count ( & exc, 1 ) ;
36
27
37
28
let exc = autoreleasepool ( |_| {
38
29
let exc = NSException :: into_exception ( exc) ;
39
30
let res = unsafe { catch ( || throw ( exc) ) } ;
40
31
let exc = res. unwrap_err ( ) . unwrap ( ) ;
41
32
let exc = NSException :: from_exception ( exc) . unwrap ( ) ;
42
33
43
- assert_retain_count ( & exc, 3 + extra_retain) ;
34
+ assert_retain_count ( & exc, 1 ) ;
35
+ exc
36
+ } ) ;
37
+
38
+ assert_retain_count ( & exc, 1 ) ;
39
+
40
+ let exc = autoreleasepool ( |_| {
41
+ let inner = || {
42
+ autoreleasepool ( |pool| {
43
+ let exc = Id :: autorelease ( exc, pool) ;
44
+ unsafe { exc. raise ( ) }
45
+ } )
46
+ } ;
47
+
48
+ let res = unsafe { catch ( inner) } ;
49
+ let exc = NSException :: from_exception ( res. unwrap_err ( ) . unwrap ( ) ) . unwrap ( ) ;
50
+
51
+ // Undesired: The inner pool _should_ have been drained on unwind, but
52
+ // it isn't, see `rc::Pool::drain`.
53
+ assert_retain_count ( & exc, 2 ) ;
44
54
exc
45
55
} ) ;
46
56
47
- assert_retain_count ( & exc, 2 + extra_retain ) ;
57
+ assert_retain_count ( & exc, 1 ) ;
48
58
49
59
assert_eq ! ( exc. name( ) , name) ;
50
60
assert_eq ! ( exc. reason( ) . unwrap( ) , reason) ;
@@ -85,28 +95,26 @@ fn raise_catch() {
85
95
let exc = NSException :: new ( & name, Some ( & reason) , None ) . unwrap ( ) ;
86
96
assert_retain_count ( & exc, 1 ) ;
87
97
88
- let res = autoreleasepool ( |_| {
89
- let res = unsafe {
90
- catch ( || {
91
- if exc. name ( ) == name {
92
- exc. raise ( ) ;
93
- } else {
94
- 4
95
- }
96
- } )
98
+ let exc = autoreleasepool ( |pool| {
99
+ let exc = Id :: autorelease ( exc, pool) ;
100
+ let inner = || {
101
+ if exc. name ( ) == name {
102
+ unsafe { exc. raise ( ) } ;
103
+ } else {
104
+ 42
105
+ }
97
106
} ;
98
- assert_retain_count ( & exc, 3 ) ;
107
+ let res = unsafe { catch ( inner) } . unwrap_err ( ) . unwrap ( ) ;
108
+ assert_retain_count ( & exc, 2 ) ;
99
109
res
100
110
} ) ;
101
111
102
- assert_retain_count ( & exc, 2 ) ;
103
-
104
- let obj = res. unwrap_err ( ) . unwrap ( ) ;
112
+ assert_retain_count ( & exc, 1 ) ;
105
113
106
- assert_eq ! ( format!( "{obj }" ) , "def" ) ;
114
+ assert_eq ! ( format!( "{exc }" ) , "def" ) ;
107
115
assert_eq ! (
108
- format!( "{obj :?}" ) ,
109
- format!( "exception <NSException: {:p}> 'abc' reason:def" , & * obj )
116
+ format!( "{exc :?}" ) ,
117
+ format!( "exception <NSException: {:p}> 'abc' reason:def" , & * exc )
110
118
) ;
111
119
}
112
120
0 commit comments