Paramaterize debugging steps

This commit is contained in:
greg 2019-05-27 15:06:50 -07:00
parent f27a65018d
commit 3fa624bef4
1 changed files with 33 additions and 40 deletions

View File

@ -19,6 +19,7 @@ extern crate ena;
use stopwatch::Stopwatch; use stopwatch::Stopwatch;
use std::time::Duration;
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use std::collections::HashSet; use std::collections::HashSet;
@ -234,12 +235,13 @@ impl SourceReference {
} }
} }
#[derive(Default)]
struct PassDebugArtifact { struct PassDebugArtifact {
artifact: Option<String> artifacts: Vec<String>
} }
impl PassDebugArtifact { impl PassDebugArtifact {
fn add_artifact(&mut self, artifact: String) { fn add_artifact(&mut self, artifact: String) {
self.artifact = Some(artifact) self.artifacts.push(artifact)
} }
} }
@ -254,55 +256,46 @@ fn stage_names() -> Vec<&'static str> {
] ]
} }
impl ProgrammingLanguageInterface for Schala { impl ProgrammingLanguageInterface for Schala {
fn get_language_name(&self) -> String { format!("Schala") } fn get_language_name(&self) -> String { format!("Schala") }
fn get_source_file_suffix(&self) -> String { format!("schala") } fn get_source_file_suffix(&self) -> String { format!("schala") }
fn run_computation(&mut self, request: ComputationRequest) -> ComputationResponse { fn run_computation(&mut self, request: ComputationRequest) -> ComputationResponse {
let ComputationRequest { source, debug_requests } = request; let ComputationRequest { source, debug_requests } = request;
let stage_names = stage_names();
self.source_reference.load_new_source(source); self.source_reference.load_new_source(source);
fn output_wrapper<Input, Output, F>(
n: usize,
func: F,
input: Input,
schala: &mut Schala,
stage_durations: &mut Vec<(String, Duration)>,
sw: &Stopwatch,
debug_requests: &HashSet<DebugAsk>) -> Result<Output, String>
where F: Fn(Input, &mut Schala, Option<&mut PassDebugArtifact>) -> Result<Output, String>,
{
let stage_names = stage_names();
let mut debug_artifact = if debug_requests.contains(&DebugAsk::ByStage { stage_name: stage_names[n].to_string() }) {
Some(PassDebugArtifact::default())
} else {
None
};
let output = func(input, schala, debug_artifact.as_mut());
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
}
let sw = Stopwatch::start_new(); let sw = Stopwatch::start_new();
let mut stage_durations = Vec::new(); let mut stage_durations = Vec::new();
let main_output: Result<String, String> = { let main_output: Result<String, String> = Ok(source)
let n = 0; .and_then(|source| output_wrapper(0, tokenizing, source, self, &mut stage_durations, &sw, &debug_requests))
let debug_artifact = None; .and_then(|tokens| output_wrapper(1, parsing, tokens, self, &mut stage_durations, &sw, &debug_requests))
let output = tokenizing(source, self, debug_artifact); .and_then(|ast| output_wrapper(2, symbol_table, ast, self, &mut stage_durations, &sw, &debug_requests))
stage_durations.push((stage_names[n].to_string(), sw.elapsed())); .and_then(|ast| output_wrapper(3, typechecking, ast, self, &mut stage_durations, &sw, &debug_requests))
output .and_then(|ast| output_wrapper(4, ast_reducing, ast, self, &mut stage_durations, &sw, &debug_requests))
}.and_then(|tokens| { .and_then(|reduced_ast| output_wrapper(5, eval, reduced_ast, self, &mut stage_durations, &sw, &debug_requests));
let n = 1;
let debug_artifact = None;
let output = parsing(tokens, self, debug_artifact);
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
}).and_then(|ast| {
let n = 2;
let debug_artifact = None;
let output = symbol_table(ast, self, debug_artifact);
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
}).and_then(|ast| {
let n = 3;
let debug_artifact = None;
let output = typechecking(ast, self, debug_artifact);
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
}).and_then(|ast| {
let n = 4;
let debug_artifact = None;
let output = ast_reducing(ast, self, debug_artifact);
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
}).and_then(|reduced_ast| {
let n = 5;
let debug_artifact = None;
let output = eval(reduced_ast, self, debug_artifact);
stage_durations.push((stage_names[n].to_string(), sw.elapsed()));
output
});
let total_duration = sw.elapsed(); let total_duration = sw.elapsed();
let global_output_stats = GlobalOutputStats { let global_output_stats = GlobalOutputStats {