]> git.lizzy.rs Git - rust.git/commitdiff
Make print_macro_backtrace non-recursive
authorJonas Schievink <jonas@schievink.net>
Thu, 10 Sep 2015 19:22:59 +0000 (21:22 +0200)
committerJonas Schievink <jonas@schievink.net>
Thu, 10 Sep 2015 19:22:59 +0000 (21:22 +0200)
src/libsyntax/diagnostic.rs

index 067e3fff3eb299a1ca6ab403069d191126871fe6..1924368a7f5fb3bbb703cf8b57128b7eb0055e92 100644 (file)
@@ -727,30 +727,34 @@ fn print_macro_backtrace(&mut self,
                              cm: &codemap::CodeMap,
                              sp: Span)
                              -> io::Result<()> {
-        let cs = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> {
-            match expn_info {
-                Some(ei) => {
-                    let ss = ei.callee.span.map_or(String::new(),
-                                                   |span| cm.span_to_string(span));
-                    let (pre, post) = match ei.callee.format {
-                        codemap::MacroAttribute(..) => ("#[", "]"),
-                        codemap::MacroBang(..) => ("", "!"),
-                        codemap::CompilerExpansion(..) => ("", ""),
-                    };
-                    try!(self.print_diagnostic(&ss, Note,
-                                               &format!("in expansion of {}{}{}",
-                                                        pre,
-                                                        ei.callee.name(),
-                                                        post),
-                                               None));
-                    let ss = cm.span_to_string(ei.call_site);
-                    try!(self.print_diagnostic(&ss, Note, "expansion site", None));
-                    Ok(Some(ei.call_site))
+        let mut sp_opt = Some(sp);
+        while let Some(sp) = sp_opt {
+            sp_opt = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> {
+                match expn_info {
+                    Some(ei) => {
+                        let ss = ei.callee.span.map_or(String::new(),
+                                                       |span| cm.span_to_string(span));
+                        let (pre, post) = match ei.callee.format {
+                            codemap::MacroAttribute(..) => ("#[", "]"),
+                            codemap::MacroBang(..) => ("", "!"),
+                            codemap::CompilerExpansion(..) => ("", ""),
+                        };
+                        try!(self.print_diagnostic(&ss, Note,
+                                                   &format!("in expansion of {}{}{}",
+                                                            pre,
+                                                            ei.callee.name(),
+                                                            post),
+                                                   None));
+                        let ss = cm.span_to_string(ei.call_site);
+                        try!(self.print_diagnostic(&ss, Note, "expansion site", None));
+                        Ok(Some(ei.call_site))
+                    }
+                    None => Ok(None)
                 }
-                None => Ok(None)
+            }));
         }
-        }));
-        cs.map_or(Ok(()), |call_site| self.print_macro_backtrace(cm, call_site))
+
+        Ok(())
     }
 }