From d859bb9d0adb68bca9c1b8bebaa6736b4f846e53 Mon Sep 17 00:00:00 2001 From: Lach Date: Sun, 23 Aug 2020 20:10:33 +0000 Subject: [PATCH] perf: move error and stacktrace to heap --- --- a/crates/jrsonnet-evaluator/src/error.rs +++ b/crates/jrsonnet-evaluator/src/error.rs @@ -76,7 +76,7 @@ } impl From for LocError { fn from(e: Error) -> Self { - Self(e, StackTrace(vec![])) + Self::new(e) } } @@ -89,10 +89,20 @@ pub struct StackTrace(pub Vec); #[derive(Debug, Clone)] -pub struct LocError(pub Error, pub StackTrace); +pub struct LocError(Box<(Error, StackTrace)>); impl LocError { pub fn new(e: Error) -> Self { - Self(e, StackTrace(vec![])) + Self(Box::new((e, StackTrace(vec![])))) + } + + pub fn error(&self) -> &Error { + &(self.0).0 + } + pub fn trace(&self) -> &StackTrace { + &(self.0).1 + } + pub fn trace_mut(&mut self) -> &mut StackTrace { + &mut (self.0).1 } } --- a/crates/jrsonnet-evaluator/src/lib.rs +++ b/crates/jrsonnet-evaluator/src/lib.rs @@ -285,7 +285,7 @@ let result = f(); self.data_mut().stack_depth -= 1; if let Err(mut err) = result { - (err.1).0.push(StackTraceElement { + err.trace_mut().0.push(StackTraceElement { location: e.clone(), desc: frame_desc(), }); --- a/crates/jrsonnet-evaluator/src/trace/mod.rs +++ b/crates/jrsonnet-evaluator/src/trace/mod.rs @@ -86,8 +86,9 @@ evaluation_state: &EvaluationState, error: &LocError, ) -> Result<(), std::fmt::Error> { - writeln!(out, "{:?}", error.0)?; - let file_names = (error.1) + writeln!(out, "{:?}", error.error())?; + let file_names = error + .trace() .0 .iter() .map(|el| { @@ -105,7 +106,7 @@ }) .collect::>(); let align = file_names.iter().map(|e| e.len()).max().unwrap_or(0); - for (i, (el, file)) in (error.1).0.iter().zip(file_names).enumerate() { + for (i, (el, file)) in error.trace().0.iter().zip(file_names).enumerate() { if i != 0 { writeln!(out)?; } @@ -131,8 +132,8 @@ evaluation_state: &EvaluationState, error: &LocError, ) -> Result<(), std::fmt::Error> { - writeln!(out, "{:?}", error.0)?; - for (i, item) in (error.1).0.iter().enumerate() { + writeln!(out, "{:?}", error.error())?; + for (i, item) in error.trace().0.iter().enumerate() { if i != 0 { writeln!(out)?; } @@ -170,8 +171,8 @@ display_list::{DisplayList, FormatOptions}, snippet::{AnnotationType, Slice, Snippet, SourceAnnotation}, }; - writeln!(out, "{:?}", error.0)?; - let trace = &error.1; + writeln!(out, "{:?}", error.error())?; + let trace = &error.trace(); for item in trace.0.iter() { let desc = &item.desc; let source = item.location.clone(); -- gitstuff