]> git.lizzy.rs Git - rust.git/commitdiff
Refactored code to access TLS only in case of panic
authorNikhil Shagrithaya <nikhilshagri@gmail.com>
Fri, 15 Jul 2016 15:17:45 +0000 (20:47 +0530)
committerNikhil Shagrithaya <nikhilshagri@gmail.com>
Wed, 10 Aug 2016 16:34:41 +0000 (22:04 +0530)
src/libstd/panicking.rs

index 57a4c3df70a476eeeb680233db6ab390a4c95490..4473e79a294f4e990c4a910d7febacfe42494243 100644 (file)
@@ -242,10 +242,9 @@ fn default_hook(info: &PanicInfo) {
 pub unsafe fn try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<Any + Send>> {
     let mut slot = None;
     let mut f = Some(f);
-    let ret = PANIC_COUNT.with(|s| {
-        let prev = s.get();
-        s.set(0);
+    let ret;
 
+    {
         let mut to_run = || {
             slot = Some(f.take().unwrap()());
         };
@@ -258,18 +257,21 @@ pub unsafe fn try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<Any + Send>> {
                                          dataptr,
                                          &mut any_data,
                                          &mut any_vtable);
-        s.set(prev);
-
         if r == 0 {
-            Ok(())
+            ret = Ok(());
         } else {
-            Err(mem::transmute(raw::TraitObject {
+            PANIC_COUNT.with(|s| {
+                let prev = s.get();
+                s.set(prev - 1);
+            });
+            ret = Err(mem::transmute(raw::TraitObject {
                 data: any_data as *mut _,
                 vtable: any_vtable as *mut _,
-            }))
+            }));
         }
-    });
+    }
 
+    debug_assert!(PANIC_COUNT.with(|c| c.get() == 0));
     return ret.map(|()| {
         slot.take().unwrap()
     });