From 98726afd4a8405c9163aa6aeaf43f555b40d9e60 2022-03-02 11:22:39 From: MH Date: 2022-03-02 11:22:39 Subject: [PATCH] Initial implementation of block evaluation --- diff --git a/src/protocol/ast_printer.rs b/src/protocol/ast_printer.rs index 9b894301378e1cc8be76cbde116323b30b0cc3c9..22a5db0376dda2d918d174df982d37d19cec4970 100644 --- a/src/protocol/ast_printer.rs +++ b/src/protocol/ast_printer.rs @@ -527,6 +527,8 @@ impl ASTWriter { self.kv(indent3).with_s_key("Block"); self.write_stmt(heap, case.body, indent4); } + self.kv(indent2).with_s_key("Replacement"); + self.write_stmt(heap, stmt.next, indent3); }, Statement::EndSelect(stmt) => { self.kv(indent).with_id(PREFIX_END_SELECT_STMT_ID, stmt.this.0.index) @@ -765,13 +767,15 @@ impl ASTWriter { .with_s_key("CallExpr"); self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); - - let definition = &heap[expr.procedure]; - self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&false); - self.kv(indent2).with_s_key("Variant").with_debug_val(&definition.kind); - self.kv(indent2).with_s_key("MethodName").with_identifier_val(&definition.identifier); - self.kv(indent2).with_s_key("ParserType") - .with_custom_val(|t| write_parser_type(t, heap, &expr.parser_type)); + self.kv(indent2).with_s_key("Method").with_debug_val(&expr.method); + if !expr.procedure.is_invalid() { + let definition = &heap[expr.procedure]; + self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&definition.builtin); + self.kv(indent2).with_s_key("Variant").with_debug_val(&definition.kind); + self.kv(indent2).with_s_key("MethodName").with_identifier_val(&definition.identifier); + self.kv(indent2).with_s_key("ParserType") + .with_custom_val(|t| write_parser_type(t, heap, &expr.parser_type)); + } // Arguments self.kv(indent2).with_s_key("Arguments"); @@ -836,6 +840,11 @@ fn write_option(target: &mut String, value: Option) { fn write_parser_type(target: &mut String, heap: &Heap, t: &ParserType) { use ParserTypeVariant as PTV; + if t.elements.is_empty() { + target.push_str("no elements in ParserType (can happen due to compiler-inserted AST nodes)"); + return; + } + fn write_element(target: &mut String, heap: &Heap, t: &ParserType, mut element_idx: usize) -> usize { let element = &t.elements[element_idx]; match &element.variant { diff --git a/src/protocol/eval/executor.rs b/src/protocol/eval/executor.rs index 901951462ed920ccb465812dd991c5e30beb11d3..950826a2f2cf5d4412098f768ba442675b0b27d7 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 { () => { true }; } +macro_rules! debug_enabled { () => { false }; } macro_rules! debug_log { ($format:literal) => { - enabled_debug_print!(true, "exec", $format); + enabled_debug_print!(false, "exec", $format); }; ($format:literal, $($args:expr),*) => { - enabled_debug_print!(true, "exec", $format, $($args),*); + enabled_debug_print!(false, "exec", $format, $($args),*); }; } diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index aede2abfb294d59af690ffa77fc76666f3e58184..45f880fbe64dec700ef72086e324877299969e5b 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -53,8 +53,7 @@ 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/protocol/parser/pass_rewriting.rs b/src/protocol/parser/pass_rewriting.rs index 99d2abe78fd4ca490f99cdf3503ca94e6799d2f2..ccbfca20870bad54d815d7c84983fd2c025bb478 100644 --- a/src/protocol/parser/pass_rewriting.rs +++ b/src/protocol/parser/pass_rewriting.rs @@ -306,6 +306,12 @@ impl Visitor for PassRewriting { last_stmt_id = stmt_id; } + if total_num_cases == 0 { + // If we don't have any cases, then we didn't connect the statements + // up to the end of the outer block, so do that here + set_ast_statement_next(ctx, last_stmt_id, outer_end_block_id.upcast()); + } + let outer_block_stmt = &mut ctx.heap[outer_block_id]; outer_block_stmt.next = first_stmt_id; outer_block_stmt.statements = transformed_stmts; diff --git a/src/runtime2/component/component_pdl.rs b/src/runtime2/component/component_pdl.rs index 5dcc04cba3139eb81045502b882a3805118ef9f9..14fd2fb0dd6670acda349042897d5b70743c1c47 100644 --- a/src/runtime2/component/component_pdl.rs +++ b/src/runtime2/component/component_pdl.rs @@ -380,13 +380,11 @@ 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"); @@ -395,7 +393,6 @@ 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 1573f0d1553fd3fe55c93a78503402ae19c7beef..2a481ff71dd208cea4ea0b3705c1192256b281a3 100644 --- a/src/runtime2/tests/mod.rs +++ b/src/runtime2/tests/mod.rs @@ -135,36 +135,37 @@ fn test_simple_select() { } #[test] -fn test_empty_select() { +fn test_unguarded_select() { let pd = ProtocolDescription::parse(b" - primitive constructor() { + primitive constructor_outside_select() { u32 index = 0; while (index < 5) { sync select { auto v = () -> print(\"hello\"); } index += 1; } } + + primitive constructor_inside_select() { + u32 index = 0; + while (index < 5) { + sync select { auto v = () -> index += 1; } + } + } ").expect("compilation"); let rt = Runtime::new(3, false, pd); - create_component(&rt, "", "constructor", no_args()); + create_component(&rt, "", "constructor_outside_select", no_args()); + create_component(&rt, "", "constructor_inside_select", no_args()); } #[test] -fn test_empty_select_should_not_work() { +fn test_empty_select() { 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\"); + sync select {} + index += 1; } - print(\"after while\"); } ").expect("compilation"); let rt = Runtime::new(3, false, pd);