From 372ba210c3b99586364fcc6ce123c9f98c40d161 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Fri, 23 Oct 2020 13:53:43 -0500 Subject: [PATCH 01/23] Expose BacktraceFrame as public --- library/std/src/backtrace.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index a9d8a4e2a81c1..f69f925462c7f 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -146,7 +146,8 @@ fn _assert_send_sync() { _assert::(); } -struct BacktraceFrame { +#[unstable(feature = "backtrace_frames")] +pub struct BacktraceFrame { frame: RawFrame, symbols: Vec, } From 9b8e4fc40dfed2a2a9b564633c628e2d5c598bf1 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Fri, 23 Oct 2020 13:54:28 -0500 Subject: [PATCH 02/23] Add empty `frames` method to Backtrace type --- library/std/src/backtrace.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index f69f925462c7f..16c4c6dbc4808 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -347,6 +347,10 @@ impl Backtrace { Inner::Captured(_) => BacktraceStatus::Captured, } } + + /// Returns an iterator over the backtrace frames. + #[unstable(feature = "backtrace_frames")] + pub fn frames(&self) -> &[BacktraceFrame]; } impl fmt::Display for Backtrace { From e07b25dd3e51571cb3a99be9a7ba8cfdcba4c12a Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Tue, 3 Nov 2020 12:45:18 -0600 Subject: [PATCH 03/23] Fill in `frames` function --- library/std/src/backtrace.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 16c4c6dbc4808..e834818205315 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -350,7 +350,16 @@ impl Backtrace { /// Returns an iterator over the backtrace frames. #[unstable(feature = "backtrace_frames")] - pub fn frames(&self) -> &[BacktraceFrame]; + pub fn frames(&self) -> &[BacktraceFrame] { + let frames = match self.inner { + Inner::Captured(c) => { + let captured = c.lock().unwrap(); + captured.frames + } + _ => vec![] + } + &frames + } } impl fmt::Display for Backtrace { From 277a2a423548d78197b40f63a10b865dddc017f2 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Mon, 9 Nov 2020 15:51:04 -0600 Subject: [PATCH 04/23] Add `Frames` struct --- library/std/src/backtrace.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index e834818205315..2cf0f200be77c 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -152,6 +152,12 @@ pub struct BacktraceFrame { symbols: Vec, } + +#[unstable(feature = "backtrace_frames")] +pub struct Frames { + inner: Vec +} + enum RawFrame { Actual(backtrace_rs::Frame), #[cfg(test)] From b4e21e645560578250a88d1ea54c68472b1d345b Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Mon, 9 Nov 2020 15:52:15 -0600 Subject: [PATCH 05/23] Add `as_ref` method for `Frames` type --- library/std/src/backtrace.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 2cf0f200be77c..b7f1a7e54e8fb 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -463,3 +463,10 @@ impl RawFrame { } } } + +impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { + fn as_ref(&self) -> &[BacktraceFrame] { + &self.inner + } +} + From 43f2774c718114dafba10640582e5f9c1dd7368b Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Mon, 9 Nov 2020 15:53:24 -0600 Subject: [PATCH 06/23] Remove `Backtrace::frames` method --- library/std/src/backtrace.rs | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index b7f1a7e54e8fb..262d73196bd2b 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -353,19 +353,6 @@ impl Backtrace { Inner::Captured(_) => BacktraceStatus::Captured, } } - - /// Returns an iterator over the backtrace frames. - #[unstable(feature = "backtrace_frames")] - pub fn frames(&self) -> &[BacktraceFrame] { - let frames = match self.inner { - Inner::Captured(c) => { - let captured = c.lock().unwrap(); - captured.frames - } - _ => vec![] - } - &frames - } } impl fmt::Display for Backtrace { @@ -464,7 +451,10 @@ impl RawFrame { } } + +#[unstable(feature = "backtrace_frames")] impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { + /// Returns an iterator over the backtrace frames. fn as_ref(&self) -> &[BacktraceFrame] { &self.inner } From 7331efe34530bd7604553c094a2dfed706914e3e Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Mon, 9 Nov 2020 15:59:24 -0600 Subject: [PATCH 07/23] Remove unnecessary newlines --- library/std/src/backtrace.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 262d73196bd2b..ac03338995974 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -152,7 +152,6 @@ pub struct BacktraceFrame { symbols: Vec, } - #[unstable(feature = "backtrace_frames")] pub struct Frames { inner: Vec @@ -451,7 +450,6 @@ impl RawFrame { } } - #[unstable(feature = "backtrace_frames")] impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { /// Returns an iterator over the backtrace frames. From 6df53a17013fd3adbcfe7eb616b0f7b5d8277078 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 12 Nov 2020 15:28:17 -0600 Subject: [PATCH 08/23] Add `frames` method that doesn't borrow from lock --- library/std/src/backtrace.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index ac03338995974..a81c77e53fe5f 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -352,6 +352,20 @@ impl Backtrace { Inner::Captured(_) => BacktraceStatus::Captured, } } + + /// Returns an iterator over the backtrace frames. + #[unstable(feature = "backtrace_frames")] + pub fn frames(&self) -> Frames { + if let Inner::Captured(captured) = self.inner { + Frames { + frames: captured.lock().unwrap().frames.clone() + } + } else { + Frames { + frames: vec![] + } + } + } } impl fmt::Display for Backtrace { @@ -452,7 +466,6 @@ impl RawFrame { #[unstable(feature = "backtrace_frames")] impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { - /// Returns an iterator over the backtrace frames. fn as_ref(&self) -> &[BacktraceFrame] { &self.inner } From 37f4f13b73bdb683e1d9d3b72afb198853b89acb Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Wed, 2 Dec 2020 15:38:10 -0600 Subject: [PATCH 09/23] Add private clone methods to Frame and BacktraceFrame --- library/std/src/backtrace.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index a81c77e53fe5f..fd2af230c1fad 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -157,18 +157,21 @@ pub struct Frames { inner: Vec } +#[derive(Clone)] enum RawFrame { Actual(backtrace_rs::Frame), #[cfg(test)] Fake, } +#[derive(Clone)] struct BacktraceSymbol { name: Option>, filename: Option, lineno: Option, } +#[derive(Clone)] enum BytesOrWide { Bytes(Vec), Wide(Vec), @@ -358,11 +361,11 @@ impl Backtrace { pub fn frames(&self) -> Frames { if let Inner::Captured(captured) = self.inner { Frames { - frames: captured.lock().unwrap().frames.clone() + inner: captured.lock().unwrap().frames.clone() } } else { Frames { - frames: vec![] + inner: vec![] } } } @@ -464,10 +467,36 @@ impl RawFrame { } } +impl Frames { + // Private clone method so that we don't expose a + // public Frames.clone() by deriving Clone + fn clone(&self) -> Self { + let clone_frames: Vec = self.inner + .iter() + .map(|frame| frame.clone()) + .collect(); + + Frames { + inner: cloned_frames + } + } +} + #[unstable(feature = "backtrace_frames")] -impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { +impl AsRef<[BacktraceFrame]> for Frames { fn as_ref(&self) -> &[BacktraceFrame] { &self.inner } } +impl BacktraceFrame { + // Private clone method so that we don't expose a + // public BacktraceFrame.clone() by deriving Clone + fn clone(&self) -> Self { + BacktraceFrame { + frame: self.frame.clone(), + symbols: self.symbols.clone(), + } + } +} + From 747bb910ae60370dd8c71268ed4337b4ce49a76d Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Wed, 2 Dec 2020 15:39:46 -0600 Subject: [PATCH 10/23] Add additional unstable feature flags --- library/std/src/backtrace.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index fd2af230c1fad..4275ec55233e4 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -467,6 +467,7 @@ impl RawFrame { } } +#[unstable(feature = "backtrace_frames")] impl Frames { // Private clone method so that we don't expose a // public Frames.clone() by deriving Clone @@ -489,6 +490,7 @@ impl AsRef<[BacktraceFrame]> for Frames { } } +#[unstable(feature = "backtrace_frames")] impl BacktraceFrame { // Private clone method so that we don't expose a // public BacktraceFrame.clone() by deriving Clone From c5d5912734a3cc8901b22bceb8acf6f94d66e4ce Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Wed, 2 Dec 2020 15:49:55 -0600 Subject: [PATCH 11/23] Fix a type in Frames::clone --- library/std/src/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 4275ec55233e4..b37a80ae05a1c 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -472,7 +472,7 @@ impl Frames { // Private clone method so that we don't expose a // public Frames.clone() by deriving Clone fn clone(&self) -> Self { - let clone_frames: Vec = self.inner + let cloned_frames: Vec = self.inner .iter() .map(|frame| frame.clone()) .collect(); From 30c549458df9355eea2857d9a1de31588a3a0fcc Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 3 Dec 2020 15:47:32 -0600 Subject: [PATCH 12/23] Add tracking issue --- library/std/src/backtrace.rs | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index b37a80ae05a1c..b3c5a74df3172 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -146,13 +146,13 @@ fn _assert_send_sync() { _assert::(); } -#[unstable(feature = "backtrace_frames")] +#[unstable(feature = "backtrace_frames", issue = "79676")] pub struct BacktraceFrame { frame: RawFrame, symbols: Vec, } -#[unstable(feature = "backtrace_frames")] +#[unstable(feature = "backtrace_frames", issue = "79676")] pub struct Frames { inner: Vec } @@ -357,11 +357,12 @@ impl Backtrace { } /// Returns an iterator over the backtrace frames. - #[unstable(feature = "backtrace_frames")] + #[unstable(feature = "backtrace_frames", issue = "79676")] pub fn frames(&self) -> Frames { if let Inner::Captured(captured) = self.inner { + let frames = captured.lock().unwrap().frames; Frames { - inner: captured.lock().unwrap().frames.clone() + inner: frames.iter().map(|frame| frame.clone()).collect::>() } } else { Frames { @@ -467,30 +468,15 @@ impl RawFrame { } } -#[unstable(feature = "backtrace_frames")] -impl Frames { - // Private clone method so that we don't expose a - // public Frames.clone() by deriving Clone - fn clone(&self) -> Self { - let cloned_frames: Vec = self.inner - .iter() - .map(|frame| frame.clone()) - .collect(); - - Frames { - inner: cloned_frames - } - } -} - -#[unstable(feature = "backtrace_frames")] +#[unstable(feature = "backtrace_frames", issue = "79676")] impl AsRef<[BacktraceFrame]> for Frames { fn as_ref(&self) -> &[BacktraceFrame] { &self.inner } } -#[unstable(feature = "backtrace_frames")] + +#[unstable(feature = "backtrace_frames", issue = "79676")] impl BacktraceFrame { // Private clone method so that we don't expose a // public BacktraceFrame.clone() by deriving Clone From 4e6d2efc138dfcd988e93bb6a047b2051c82ebc6 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 3 Dec 2020 15:48:52 -0600 Subject: [PATCH 13/23] Fix ownership issues --- library/std/src/backtrace.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index b3c5a74df3172..38e92082d3039 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -359,8 +359,8 @@ impl Backtrace { /// Returns an iterator over the backtrace frames. #[unstable(feature = "backtrace_frames", issue = "79676")] pub fn frames(&self) -> Frames { - if let Inner::Captured(captured) = self.inner { - let frames = captured.lock().unwrap().frames; + if let Inner::Captured(captured) = &self.inner { + let frames = &captured.lock().unwrap().frames; Frames { inner: frames.iter().map(|frame| frame.clone()).collect::>() } From e7df885deaed5426495fcc2ad7dcd1ba139b53e0 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 3 Dec 2020 16:19:21 -0600 Subject: [PATCH 14/23] Add doc comments to `Frames` and `BacktraceFrame` --- library/std/src/backtrace.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 38e92082d3039..d86379f38138e 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -146,12 +146,15 @@ fn _assert_send_sync() { _assert::(); } +/// A single frame of a backtrace. #[unstable(feature = "backtrace_frames", issue = "79676")] pub struct BacktraceFrame { frame: RawFrame, symbols: Vec, } +/// An iterator over the frames of a backtrace, created +/// by the [`frames`] method on [`Backtrace`]. #[unstable(feature = "backtrace_frames", issue = "79676")] pub struct Frames { inner: Vec From 61b198f923123fc77c1a08d881ac774ead52ebe3 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 3 Dec 2020 16:26:00 -0600 Subject: [PATCH 15/23] Derive Debug on `Frames`, `BacktraceFrame`, and `RawFrame` --- library/std/src/backtrace.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index d86379f38138e..0d73f6e41dfe3 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -147,6 +147,7 @@ fn _assert_send_sync() { } /// A single frame of a backtrace. +#[derive(Debug)] #[unstable(feature = "backtrace_frames", issue = "79676")] pub struct BacktraceFrame { frame: RawFrame, @@ -155,12 +156,13 @@ pub struct BacktraceFrame { /// An iterator over the frames of a backtrace, created /// by the [`frames`] method on [`Backtrace`]. +#[derive(Debug)] #[unstable(feature = "backtrace_frames", issue = "79676")] pub struct Frames { inner: Vec } -#[derive(Clone)] +#[derive(Debug, Clone)] enum RawFrame { Actual(backtrace_rs::Frame), #[cfg(test)] From b4175b13cf2da60bfe3e6670e4bb949f1ec47ddd Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Fri, 4 Dec 2020 12:20:01 -0600 Subject: [PATCH 16/23] Tie `Frames` to `Backtrace` via PhantomData --- library/std/src/backtrace.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 0d73f6e41dfe3..475310776918d 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -102,6 +102,7 @@ use crate::sync::atomic::{AtomicUsize, Ordering::SeqCst}; use crate::sync::Mutex; use crate::sys_common::backtrace::{lock, output_filename}; use crate::vec::Vec; +use crate::marker::PhantomData; /// A captured OS thread stack backtrace. /// @@ -158,8 +159,9 @@ pub struct BacktraceFrame { /// by the [`frames`] method on [`Backtrace`]. #[derive(Debug)] #[unstable(feature = "backtrace_frames", issue = "79676")] -pub struct Frames { - inner: Vec +pub struct Frames<'a> { + inner: Vec, + _backtrace: PhantomData<&'a Backtrace> } #[derive(Debug, Clone)] @@ -360,18 +362,22 @@ impl Backtrace { Inner::Captured(_) => BacktraceStatus::Captured, } } +} +impl<'a> Backtrace { /// Returns an iterator over the backtrace frames. #[unstable(feature = "backtrace_frames", issue = "79676")] - pub fn frames(&self) -> Frames { + pub fn frames(&self) -> Frames<'a> { if let Inner::Captured(captured) = &self.inner { let frames = &captured.lock().unwrap().frames; Frames { - inner: frames.iter().map(|frame| frame.clone()).collect::>() + inner: frames.iter().map(|frame| frame.clone()).collect::>(), + _backtrace: PhantomData } } else { Frames { - inner: vec![] + inner: vec![], + _backtrace: PhantomData } } } @@ -474,7 +480,7 @@ impl RawFrame { } #[unstable(feature = "backtrace_frames", issue = "79676")] -impl AsRef<[BacktraceFrame]> for Frames { +impl<'a> AsRef<[BacktraceFrame]> for Frames<'a> { fn as_ref(&self) -> &[BacktraceFrame] { &self.inner } From b30f662766052371e6312aeff182e372bd0d4c3b Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 17 Dec 2020 15:27:03 -0600 Subject: [PATCH 17/23] Add `generate_fake_backtrace` fn to backtrace/tests.rs --- library/std/src/backtrace/tests.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/library/std/src/backtrace/tests.rs b/library/std/src/backtrace/tests.rs index 287359cd545e3..377c9ff51cacd 100644 --- a/library/std/src/backtrace/tests.rs +++ b/library/std/src/backtrace/tests.rs @@ -1,8 +1,7 @@ use super::*; -#[test] -fn test_debug() { - let backtrace = Backtrace { +fn generate_fake_backtrace() -> Backtrace { + Backtrace { inner: Inner::Captured(Mutex::new(Capture { actual_start: 1, resolved: true, @@ -40,7 +39,12 @@ fn test_debug() { }, ], })), - }; + } +} + +#[test] +fn test_debug() { + let backtrace = generate_fake_backtrace(); #[rustfmt::skip] let expected = "Backtrace [\ From c624d226a167014a1dfdca9adbc2a5ca52ea2b90 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 17 Dec 2020 15:39:16 -0600 Subject: [PATCH 18/23] Add test for empty frames iterator --- library/std/src/backtrace/tests.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/library/std/src/backtrace/tests.rs b/library/std/src/backtrace/tests.rs index 377c9ff51cacd..bfd36d1e4ecd3 100644 --- a/library/std/src/backtrace/tests.rs +++ b/library/std/src/backtrace/tests.rs @@ -55,3 +55,18 @@ fn test_debug() { assert_eq!(format!("{:#?}", backtrace), expected); } + +#[test] +fn test_empty_frames_iterator() { + let empty_backtrace = Backtrace { + inner: Inner::Captured(Mutex::new(Capture { + actual_start: 1, + resolved: true, + frames: vec![], + })) + }; + + let iter = empty_backtrace.frames(); + + assert_eq!(iter.next(), None); +} From de98734d5a0a7dc77e843db2bad4141cd7b0e658 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 17 Dec 2020 15:49:39 -0600 Subject: [PATCH 19/23] Impl `Iterator` for Frames --- library/std/src/backtrace.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 475310776918d..9147fff237487 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -499,3 +499,11 @@ impl BacktraceFrame { } } +#[unstable(feature = "backtrace_frames", issue = "79676")] +impl<'a> Iterator for Frames<'a> { + type Item = BacktraceFrame; + + fn next(&mut self) -> Option { + self.inner.pop() + } +} From da2e4a9b7c4ed712f64e21cd0d7bf720791ff8d8 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Thu, 17 Dec 2020 15:57:36 -0600 Subject: [PATCH 20/23] Fix IntoIter type --- library/std/src/backtrace.rs | 10 ++++++++++ library/std/src/backtrace/tests.rs | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 9147fff237487..609b93f131038 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -507,3 +507,13 @@ impl<'a> Iterator for Frames<'a> { self.inner.pop() } } + +#[unstable(feature = "backtrace_frames", issue = "79676")] +impl<'a> IntoIterator for Frames<'a> { + type Item = BacktraceFrame; + type IntoIter = alloc_crate::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.inner.into_iter() + } +} diff --git a/library/std/src/backtrace/tests.rs b/library/std/src/backtrace/tests.rs index bfd36d1e4ecd3..0dedbfa3e5f84 100644 --- a/library/std/src/backtrace/tests.rs +++ b/library/std/src/backtrace/tests.rs @@ -68,5 +68,5 @@ fn test_empty_frames_iterator() { let iter = empty_backtrace.frames(); - assert_eq!(iter.next(), None); + assert_eq!(None, iter.next()); } From 0199300857004485fc853fb11d1d11e617a80b69 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Fri, 18 Dec 2020 11:51:41 -0600 Subject: [PATCH 21/23] Get empty iterator test passing --- library/std/src/backtrace.rs | 15 +++++++-------- library/std/src/backtrace/tests.rs | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 609b93f131038..38c67f3055bb9 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -508,12 +508,11 @@ impl<'a> Iterator for Frames<'a> { } } -#[unstable(feature = "backtrace_frames", issue = "79676")] -impl<'a> IntoIterator for Frames<'a> { - type Item = BacktraceFrame; - type IntoIter = alloc_crate::vec::IntoIter; +// #[unstable(feature = "backtrace_frames", issue = "79676")] +// impl<'a> IntoIterator for Frames<'a> { +// type IntoIter = alloc_crate::vec::IntoIter; - fn into_iter(self) -> Self::IntoIter { - self.inner.into_iter() - } -} +// fn into_iter(self) -> Self::IntoIter { +// self.inner.into_iter() +// } +// } diff --git a/library/std/src/backtrace/tests.rs b/library/std/src/backtrace/tests.rs index 0dedbfa3e5f84..53ce05a6db50f 100644 --- a/library/std/src/backtrace/tests.rs +++ b/library/std/src/backtrace/tests.rs @@ -68,5 +68,5 @@ fn test_empty_frames_iterator() { let iter = empty_backtrace.frames(); - assert_eq!(None, iter.next()); + assert_eq!(iter.count(), 0); } From 48e6a38dba4e88a1994870c4052b04c259697245 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Fri, 18 Dec 2020 15:12:05 -0600 Subject: [PATCH 22/23] Add test to check frames iterator count --- library/std/src/backtrace.rs | 8 -------- library/std/src/backtrace/tests.rs | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index 38c67f3055bb9..ff638ed7c6950 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -508,11 +508,3 @@ impl<'a> Iterator for Frames<'a> { } } -// #[unstable(feature = "backtrace_frames", issue = "79676")] -// impl<'a> IntoIterator for Frames<'a> { -// type IntoIter = alloc_crate::vec::IntoIter; - -// fn into_iter(self) -> Self::IntoIter { -// self.inner.into_iter() -// } -// } diff --git a/library/std/src/backtrace/tests.rs b/library/std/src/backtrace/tests.rs index 53ce05a6db50f..2e0049121ae1d 100644 --- a/library/std/src/backtrace/tests.rs +++ b/library/std/src/backtrace/tests.rs @@ -70,3 +70,11 @@ fn test_empty_frames_iterator() { assert_eq!(iter.count(), 0); } + +#[test] +fn test_frames_iterator() { + let backtrace = generate_fake_backtrace(); + let iter = backtrace.frames(); + + assert_eq!(iter.count(), 3); +} From ff81eb12218fc2248e36e6e4af16384ec379c1c9 Mon Sep 17 00:00:00 2001 From: Sean Chen Date: Tue, 5 Jan 2021 14:22:51 -0600 Subject: [PATCH 23/23] Remove iterator impl on Backtrace Frame --- library/std/src/backtrace.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/library/std/src/backtrace.rs b/library/std/src/backtrace.rs index ff638ed7c6950..475310776918d 100644 --- a/library/std/src/backtrace.rs +++ b/library/std/src/backtrace.rs @@ -499,12 +499,3 @@ impl BacktraceFrame { } } -#[unstable(feature = "backtrace_frames", issue = "79676")] -impl<'a> Iterator for Frames<'a> { - type Item = BacktraceFrame; - - fn next(&mut self) -> Option { - self.inner.pop() - } -} -