Infrastructure for adding more debug options

This commit is contained in:
greg 2018-07-03 03:02:16 -07:00
parent d075f613f9
commit 1761d11d36
2 changed files with 21 additions and 11 deletions

View File

@ -1,4 +1,4 @@
use std::collections::HashSet;
use std::collections::HashMap;
use colored::*;
use std::fmt::Write;
@ -7,8 +7,14 @@ pub struct LLVMCodeString(pub String);
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct EvalOptions {
pub execution_method: ExecutionMethod,
pub debug_passes: HashSet<String>,
pub debug_passes: HashMap<String, PassDebugDescriptor>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PassDebugDescriptor {
pub opts: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum ExecutionMethod {
Compile,
@ -151,13 +157,15 @@ macro_rules! pass_chain {
macro_rules! pass_chain_helper {
(($state:expr, $comp:expr, $options:expr); $input:expr, $pass:path $(, $rest:path)*) => {
{
use schala_repl::PassDebugDescriptor;
let pass_name = stringify!($pass);
let output = {
let ref debug_set = $options.debug_passes;
let debug_handle: Option<&mut UnfinishedComputation> = if debug_set.contains(pass_name) {
Some(&mut $comp)
} else {
None
let ref debug_map = $options.debug_passes;
//let (debug_handle: Option<&mut UnfinishedComputation>, debug_opts) = if debug_set.contains_key(pass_name) {
//let (debug_handle: Option<&mut UnfinishedComputation>, debug_opts: Vec<String>) = match debug_map.get(pass_name) {
let (debug_handle, debug_opts) = match debug_map.get(pass_name) {
Some(PassDebugDescriptor { opts }) => (Some(&mut $comp), Some(opts.clone())),
_ => (None, None)
};
$pass($state, $input, debug_handle)
};

View File

@ -33,7 +33,9 @@ const VERSION_STRING: &'static str = "0.1.0";
include!(concat!(env!("OUT_DIR"), "/static.rs"));
pub use language::{LLVMCodeString, ProgrammingLanguageInterface, EvalOptions, ExecutionMethod, TraceArtifact, FinishedComputation, UnfinishedComputation};
pub use language::{LLVMCodeString, ProgrammingLanguageInterface, EvalOptions,
ExecutionMethod, TraceArtifact, FinishedComputation, UnfinishedComputation, PassDebugDescriptor};
pub type PLIGenerator = Box<Fn() -> Box<ProgrammingLanguageInterface> + Send + Sync>;
pub fn repl_main(generators: Vec<PLIGenerator>) {
@ -111,7 +113,7 @@ fn run_noninteractive(filename: &str, languages: Vec<Box<ProgrammingLanguageInte
for pass in debug_passes.into_iter() {
if let Some(_) = language.get_passes().iter().find(|stage_name| **stage_name == pass) {
options.debug_passes.insert(pass);
options.debug_passes.insert(pass, PassDebugDescriptor { opts: vec![] });
}
}
@ -436,7 +438,7 @@ impl Repl {
Some(&"passes") => Some(
passes.into_iter()
.map(|p| {
if self.options.debug_passes.contains(&p) {
if self.options.debug_passes.contains_key(&p) {
let color = "green";
format!("*{}", p.color(color))
} else {
@ -454,7 +456,7 @@ impl Repl {
if let Some(stage) = passes.iter().find(|stage_name| **stage_name == debug_pass) {
let msg = format!("{} debug for stage {}", if show { "Enabling" } else { "Disabling" }, debug_pass);
if show {
self.options.debug_passes.insert(stage.clone());
self.options.debug_passes.insert(stage.clone(), PassDebugDescriptor { opts: vec![] });
} else {
self.options.debug_passes.remove(stage);
}