From 77315308b8b8ebcbf8b94b0d20be517423b6e0d6 2022-03-02 11:03:16 From: mh Date: 2022-03-02 11:03:16 Subject: [PATCH] WIP: Fixing bug with empty select statement --- diff --git a/src/protocol/eval/executor.rs b/src/protocol/eval/executor.rs index 45f0140c2ddca9f96eebf5ad99202de5d8489cb2..901951462ed920ccb465812dd991c5e30beb11d3 100644 --- a/src/protocol/eval/executor.rs +++ b/src/protocol/eval/executor.rs @@ -8,13 +8,13 @@ use crate::protocol::*; use crate::protocol::ast::*; use crate::protocol::type_table::*; -macro_rules! debug_enabled { () => { false }; } +macro_rules! debug_enabled { () => { true }; } macro_rules! debug_log { ($format:literal) => { - enabled_debug_print!(false, "exec", $format); + enabled_debug_print!(true, "exec", $format); }; ($format:literal, $($args:expr),*) => { - enabled_debug_print!(false, "exec", $format, $($args),*); + enabled_debug_print!(true, "exec", $format, $($args),*); }; } @@ -300,7 +300,7 @@ impl Prompt { return Ok(EvalContinuation::ComponentTerminated); } - debug_log!("Taking step in '{}'", heap[cur_frame.definition].identifier().value.as_str()); + debug_log!("Taking step in '{}'", heap[cur_frame.definition].identifier.value.as_str()); // Execute all pending expressions while !cur_frame.expr_stack.is_empty() { diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 45f880fbe64dec700ef72086e324877299969e5b..aede2abfb294d59af690ffa77fc76666f3e58184 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -53,7 +53,8 @@ impl ProtocolDescription { let source = InputSource::new(String::new(), Vec::from(buffer)); let mut parser = Parser::new(); parser.feed(source).expect("failed to feed source"); - + + parser.write_ast_to = Some(String::from("hello.txt")); if let Err(err) = parser.parse() { println!("ERROR:\n{}", err); return Err(format!("{}", err)) diff --git a/src/runtime2/component/component_pdl.rs b/src/runtime2/component/component_pdl.rs index 14fd2fb0dd6670acda349042897d5b70743c1c47..5dcc04cba3139eb81045502b882a3805118ef9f9 100644 --- a/src/runtime2/component/component_pdl.rs +++ b/src/runtime2/component/component_pdl.rs @@ -380,11 +380,13 @@ impl CompPDL { }, EC::SelectStart(num_cases, _num_ports) => { debug_assert_eq!(self.mode, Mode::Sync); + println!("DEBUG: AAAAAAAAAA"); self.select.handle_select_start(num_cases); return Ok(CompScheduling::Requeue); }, EC::SelectRegisterPort(case_index, port_index, port_id) => { debug_assert_eq!(self.mode, Mode::Sync); + println!("DEBUG: BBBBBBBBBBB"); let port_id = port_id_from_eval(port_id); if let Err(_err) = self.select.register_select_case_port(comp_ctx, case_index, port_index, port_id) { todo!("handle registering a port multiple times"); @@ -393,6 +395,7 @@ impl CompPDL { }, EC::SelectWait => { debug_assert_eq!(self.mode, Mode::Sync); + println!("DEBUG: CCCCCCCCCCC"); let select_decision = self.select.handle_select_waiting_point(&self.inbox_main, comp_ctx); if let SelectDecision::Case(case_index) = select_decision { // Reached a conclusion, so we can continue immediately diff --git a/src/runtime2/tests/mod.rs b/src/runtime2/tests/mod.rs index 823efa16f04108cbd8061cfaf249914b7bde1a60..1573f0d1553fd3fe55c93a78503402ae19c7beef 100644 --- a/src/runtime2/tests/mod.rs +++ b/src/runtime2/tests/mod.rs @@ -132,4 +132,41 @@ fn test_simple_select() { ").expect("compilation"); let rt = Runtime::new(3, false, pd); create_component(&rt, "", "constructor", no_args()); +} + +#[test] +fn test_empty_select() { + let pd = ProtocolDescription::parse(b" + primitive constructor() { + u32 index = 0; + while (index < 5) { + sync select { auto v = () -> print(\"hello\"); } + index += 1; + } + } + ").expect("compilation"); + let rt = Runtime::new(3, false, pd); + create_component(&rt, "", "constructor", no_args()); +} + +#[test] +fn test_empty_select_should_not_work() { + let pd = ProtocolDescription::parse(b" + primitive constructor() { + u32 index = 0; + print(\"before while\"); + while (index < 5) { + print(\"before sync\"); + sync { + print(\"before select\"); + select { } + print(\"after select\"); + } + print(\"after sync\"); + } + print(\"after while\"); + } + ").expect("compilation"); + let rt = Runtime::new(3, false, pd); + create_component(&rt, "", "constructor", no_args()); } \ No newline at end of file