Finish removing profile command and related data (#10807)

This commit is contained in:
Jakub Žádník 2023-10-22 14:06:53 +03:00 committed by GitHub
parent a01ef85bda
commit a35ecb4837
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 28 additions and 150 deletions

View File

@ -289,11 +289,9 @@ fn to_html(
}) })
.collect(); .collect();
return Ok( return Ok(
Value::list(result, head).into_pipeline_data_with_metadata(Box::new( Value::list(result, head).into_pipeline_data_with_metadata(PipelineMetadata {
PipelineMetadata {
data_source: DataSource::HtmlThemes, data_source: DataSource::HtmlThemes,
}, }),
)),
); );
} else { } else {
let theme_span = match &theme { let theme_span = match &theme {

View File

@ -55,36 +55,30 @@ impl Command for Metadata {
let origin = stack.get_var_with_origin(*var_id, *span)?; let origin = stack.get_var_with_origin(*var_id, *span)?;
Ok( Ok(
build_metadata_record(&origin, input.metadata().as_deref(), head) build_metadata_record(&origin, input.metadata().as_ref(), head)
.into_pipeline_data(), .into_pipeline_data(),
) )
} }
_ => { _ => {
let val: Value = call.req(engine_state, stack, 0)?; let val: Value = call.req(engine_state, stack, 0)?;
Ok( Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
build_metadata_record(&val, input.metadata().as_deref(), head) .into_pipeline_data())
.into_pipeline_data(),
)
} }
} }
} else { } else {
let val: Value = call.req(engine_state, stack, 0)?; let val: Value = call.req(engine_state, stack, 0)?;
Ok( Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
build_metadata_record(&val, input.metadata().as_deref(), head) .into_pipeline_data())
.into_pipeline_data(),
)
} }
} }
Some(_) => { Some(_) => {
let val: Value = call.req(engine_state, stack, 0)?; let val: Value = call.req(engine_state, stack, 0)?;
Ok( Ok(build_metadata_record(&val, input.metadata().as_ref(), head)
build_metadata_record(&val, input.metadata().as_deref(), head) .into_pipeline_data())
.into_pipeline_data(),
)
} }
None => { None => {
let mut record = Record::new(); let mut record = Record::new();
if let Some(x) = input.metadata().as_deref() { if let Some(x) = input.metadata().as_ref() {
match x { match x {
PipelineMetadata { PipelineMetadata {
data_source: DataSource::Ls, data_source: DataSource::Ls,
@ -92,9 +86,6 @@ impl Command for Metadata {
PipelineMetadata { PipelineMetadata {
data_source: DataSource::HtmlThemes, data_source: DataSource::HtmlThemes,
} => record.push("source", Value::string("into html --list", head)), } => record.push("source", Value::string("into html --list", head)),
PipelineMetadata {
data_source: DataSource::Profiling(values),
} => record.push("profiling", Value::list(values.clone(), head)),
} }
} }
@ -142,9 +133,6 @@ fn build_metadata_record(arg: &Value, metadata: Option<&PipelineMetadata>, head:
PipelineMetadata { PipelineMetadata {
data_source: DataSource::HtmlThemes, data_source: DataSource::HtmlThemes,
} => record.push("source", Value::string("into html --list", head)), } => record.push("source", Value::string("into html --list", head)),
PipelineMetadata {
data_source: DataSource::Profiling(values),
} => record.push("profiling", Value::list(values.clone(), head)),
} }
} }

View File

@ -5,7 +5,6 @@ mod info;
mod inspect; mod inspect;
mod inspect_table; mod inspect_table;
mod metadata; mod metadata;
mod profile;
mod timeit; mod timeit;
mod view; mod view;
mod view_files; mod view_files;
@ -19,7 +18,6 @@ pub use info::DebugInfo;
pub use inspect::Inspect; pub use inspect::Inspect;
pub use inspect_table::build_table; pub use inspect_table::build_table;
pub use metadata::Metadata; pub use metadata::Metadata;
pub use profile::Profile;
pub use timeit::TimeIt; pub use timeit::TimeIt;
pub use view::View; pub use view::View;
pub use view_files::ViewFiles; pub use view_files::ViewFiles;

View File

@ -1,102 +0,0 @@
use nu_engine::{eval_block, CallExt};
use nu_protocol::ast::Call;
use nu_protocol::engine::{Closure, Command, EngineState, Stack};
use nu_protocol::{
Category, DataSource, Example, IntoPipelineData, PipelineData, PipelineMetadata, Signature,
Spanned, SyntaxShape, Type, Value,
};
#[derive(Clone)]
pub struct Profile;
impl Command for Profile {
fn name(&self) -> &str {
"profile"
}
fn usage(&self) -> &str {
"Profile each pipeline element in a closure."
}
fn extra_usage(&self) -> &str {
r#"The command collects run time of every pipeline element, recursively stepping into child closures
until a maximum depth. Optionally, it also collects the source code and intermediate values.
Current known limitations are:
* profiling data from subexpressions is not tracked
* it does not step into loop iterations"#
}
fn signature(&self) -> nu_protocol::Signature {
Signature::build("profile")
.required(
"closure",
SyntaxShape::Closure(Some(vec![SyntaxShape::Any])),
"the closure to run",
)
.switch("source", "Collect source code in the report", Some('s'))
.switch("values", "Collect values in the report", Some('v'))
.named(
"max-depth",
SyntaxShape::Int,
"How many levels of blocks to step into (default: 1)",
Some('d'),
)
.input_output_types(vec![(Type::Any, Type::Table(vec![]))])
.allow_variants_without_examples(true)
.category(Category::Debug)
}
fn run(
&self,
engine_state: &EngineState,
stack: &mut Stack,
call: &Call,
input: PipelineData,
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
let capture_block: Spanned<Closure> = call.req(engine_state, stack, 0)?;
let block = engine_state.get_block(capture_block.item.block_id);
let redirect_stdout = call.redirect_stdout;
let redirect_stderr = call.redirect_stderr;
let mut stack = stack.captures_to_stack(&capture_block.item.captures);
let input_val = input.into_value(call.head);
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
stack.add_var(*var_id, input_val.clone());
}
}
let result = if let Some(PipelineMetadata {
data_source: DataSource::Profiling(values),
}) = eval_block(
engine_state,
&mut stack,
block,
input_val.into_pipeline_data(),
redirect_stdout,
redirect_stderr,
)?
.metadata()
.map(|m| *m)
{
Value::list(values, call.head)
} else {
Value::nothing(call.head)
};
Ok(result.into_pipeline_data())
}
fn examples(&self) -> Vec<Example> {
vec![Example {
description:
"Profile some code, stepping into the `spam` command and collecting source.",
example: r#"def spam [] { "spam" }; profile {|| spam | str length } --max-depth 2 --source"#,
result: None,
}]
}
}

View File

@ -138,7 +138,6 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState {
Explain, Explain,
Inspect, Inspect,
Metadata, Metadata,
Profile,
TimeIt, TimeIt,
View, View,
ViewFiles, ViewFiles,

View File

@ -266,9 +266,9 @@ impl Command for Ls {
_ => Some(Value::nothing(call_span)), _ => Some(Value::nothing(call_span)),
}) })
.into_pipeline_data_with_metadata( .into_pipeline_data_with_metadata(
Box::new(PipelineMetadata { PipelineMetadata {
data_source: DataSource::Ls, data_source: DataSource::Ls,
}), },
engine_state.ctrlc.clone(), engine_state.ctrlc.clone(),
)) ))
} }

View File

@ -258,7 +258,7 @@ pub fn uniq(
call: &Call, call: &Call,
input: Vec<Value>, input: Vec<Value>,
item_mapper: Box<dyn Fn(ItemMapperState) -> ValueCounter>, item_mapper: Box<dyn Fn(ItemMapperState) -> ValueCounter>,
metadata: Option<Box<PipelineMetadata>>, metadata: Option<PipelineMetadata>,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let ctrlc = engine_state.ctrlc.clone(); let ctrlc = engine_state.ctrlc.clone();
let head = call.head; let head = call.head;

View File

@ -444,11 +444,11 @@ fn handle_row_stream(
input: CmdInput<'_>, input: CmdInput<'_>,
cfg: TableConfig, cfg: TableConfig,
stream: ListStream, stream: ListStream,
metadata: Option<Box<PipelineMetadata>>, metadata: Option<PipelineMetadata>,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let ctrlc = input.engine_state.ctrlc.clone(); let ctrlc = input.engine_state.ctrlc.clone();
let stream = match metadata.as_deref() { let stream = match metadata.as_ref() {
// First, `ls` sources: // First, `ls` sources:
Some(PipelineMetadata { Some(PipelineMetadata {
data_source: DataSource::Ls, data_source: DataSource::Ls,

View File

@ -19,7 +19,7 @@ pub fn collect_pipeline(input: PipelineData) -> (Vec<String>, Vec<Vec<Value>>) {
metadata, metadata,
span, span,
.. ..
} => collect_external_stream(stdout, stderr, exit_code, metadata.map(|m| *m), span), } => collect_external_stream(stdout, stderr, exit_code, metadata, span),
} }
} }

View File

@ -40,16 +40,14 @@ const LINE_ENDING_PATTERN: &[char] = &['\r', '\n'];
/// Nushell. /// Nushell.
#[derive(Debug)] #[derive(Debug)]
pub enum PipelineData { pub enum PipelineData {
// Note: the PipelineMetadata is boxed everywhere because the DataSource::Profiling caused Value(Value, Option<PipelineMetadata>),
// stack overflow on Windows CI when testing virtualenv ListStream(ListStream, Option<PipelineMetadata>),
Value(Value, Option<Box<PipelineMetadata>>),
ListStream(ListStream, Option<Box<PipelineMetadata>>),
ExternalStream { ExternalStream {
stdout: Option<RawStream>, stdout: Option<RawStream>,
stderr: Option<RawStream>, stderr: Option<RawStream>,
exit_code: Option<ListStream>, exit_code: Option<ListStream>,
span: Span, span: Span,
metadata: Option<Box<PipelineMetadata>>, metadata: Option<PipelineMetadata>,
trim_end_newline: bool, trim_end_newline: bool,
}, },
Empty, Empty,
@ -64,11 +62,10 @@ pub struct PipelineMetadata {
pub enum DataSource { pub enum DataSource {
Ls, Ls,
HtmlThemes, HtmlThemes,
Profiling(Vec<Value>),
} }
impl PipelineData { impl PipelineData {
pub fn new_with_metadata(metadata: Option<Box<PipelineMetadata>>, span: Span) -> PipelineData { pub fn new_with_metadata(metadata: Option<PipelineMetadata>, span: Span) -> PipelineData {
PipelineData::Value(Value::nothing(span), metadata) PipelineData::Value(Value::nothing(span), metadata)
} }
@ -93,7 +90,7 @@ impl PipelineData {
PipelineData::Empty PipelineData::Empty
} }
pub fn metadata(&self) -> Option<Box<PipelineMetadata>> { pub fn metadata(&self) -> Option<PipelineMetadata> {
match self { match self {
PipelineData::ListStream(_, x) => x.clone(), PipelineData::ListStream(_, x) => x.clone(),
PipelineData::ExternalStream { metadata: x, .. } => x.clone(), PipelineData::ExternalStream { metadata: x, .. } => x.clone(),
@ -102,7 +99,7 @@ impl PipelineData {
} }
} }
pub fn set_metadata(mut self, metadata: Option<Box<PipelineMetadata>>) -> Self { pub fn set_metadata(mut self, metadata: Option<PipelineMetadata>) -> Self {
match &mut self { match &mut self {
PipelineData::ListStream(_, x) => *x = metadata, PipelineData::ListStream(_, x) => *x = metadata,
PipelineData::ExternalStream { metadata: x, .. } => *x = metadata, PipelineData::ExternalStream { metadata: x, .. } => *x = metadata,
@ -354,7 +351,7 @@ impl PipelineData {
pub fn collect_string_strict( pub fn collect_string_strict(
self, self,
span: Span, span: Span,
) -> Result<(String, Span, Option<Box<PipelineMetadata>>), ShellError> { ) -> Result<(String, Span, Option<PipelineMetadata>), ShellError> {
match self { match self {
PipelineData::Empty => Ok((String::new(), span, None)), PipelineData::Empty => Ok((String::new(), span, None)),
PipelineData::Value(Value::String { val, .. }, metadata) => Ok((val, span, metadata)), PipelineData::Value(Value::String { val, .. }, metadata) => Ok((val, span, metadata)),
@ -926,7 +923,7 @@ pub trait IntoPipelineData {
fn into_pipeline_data_with_metadata( fn into_pipeline_data_with_metadata(
self, self,
metadata: impl Into<Option<Box<PipelineMetadata>>>, metadata: impl Into<Option<PipelineMetadata>>,
) -> PipelineData; ) -> PipelineData;
} }
@ -940,7 +937,7 @@ where
fn into_pipeline_data_with_metadata( fn into_pipeline_data_with_metadata(
self, self,
metadata: impl Into<Option<Box<PipelineMetadata>>>, metadata: impl Into<Option<PipelineMetadata>>,
) -> PipelineData { ) -> PipelineData {
PipelineData::Value(self.into(), metadata.into()) PipelineData::Value(self.into(), metadata.into())
} }
@ -950,7 +947,7 @@ pub trait IntoInterruptiblePipelineData {
fn into_pipeline_data(self, ctrlc: Option<Arc<AtomicBool>>) -> PipelineData; fn into_pipeline_data(self, ctrlc: Option<Arc<AtomicBool>>) -> PipelineData;
fn into_pipeline_data_with_metadata( fn into_pipeline_data_with_metadata(
self, self,
metadata: impl Into<Option<Box<PipelineMetadata>>>, metadata: impl Into<Option<PipelineMetadata>>,
ctrlc: Option<Arc<AtomicBool>>, ctrlc: Option<Arc<AtomicBool>>,
) -> PipelineData; ) -> PipelineData;
} }
@ -973,7 +970,7 @@ where
fn into_pipeline_data_with_metadata( fn into_pipeline_data_with_metadata(
self, self,
metadata: impl Into<Option<Box<PipelineMetadata>>>, metadata: impl Into<Option<PipelineMetadata>>,
ctrlc: Option<Arc<AtomicBool>>, ctrlc: Option<Arc<AtomicBool>>,
) -> PipelineData { ) -> PipelineData {
PipelineData::ListStream( PipelineData::ListStream(