diff --git a/src/protocol/parser/pass_rewriting.rs b/src/protocol/parser/pass_rewriting.rs index 82702bd1056e5706249f1636604aba452aeb820c..097359f0e0eddc48e4887a0485f0f5cc9d9e74d8 100644 --- a/src/protocol/parser/pass_rewriting.rs +++ b/src/protocol/parser/pass_rewriting.rs @@ -217,7 +217,7 @@ impl Visitor for PassRewriting { num_ports_expression_id.upcast() ]; - let call_expression_id = create_ast_call_expr(ctx, self.current_procedure_id, Method::SelectStart, &mut self.expression_buffer, arguments); + let call_expression_id = create_ast_call_expr(ctx, InputSpan::new(), self.current_procedure_id, Method::SelectStart, &mut self.expression_buffer, arguments); let call_statement_id = create_ast_expression_stmt(ctx, call_expression_id.upcast()); transformed_stmts.push(call_statement_id.upcast()); @@ -233,6 +233,9 @@ impl Visitor for PassRewriting { for case_port_index in 0..case_num_ports { // Arguments to runtime call + let original_get_call_id = case.involved_ports[case_port_index].0; + let original_get_call_span = ctx.heap[original_get_call_id].full_span; + let (port_variable_id, port_variable_type) = locals[total_port_index]; // so far this variable contains the temporary variables for the port expressions let case_index_expr_id = create_ast_literal_integer_expr(ctx, self.current_procedure_id, case_index as u64, ctx.arch.uint32_type_id); let port_index_expr_id = create_ast_literal_integer_expr(ctx, self.current_procedure_id, case_port_index as u64, ctx.arch.uint32_type_id); @@ -244,7 +247,7 @@ impl Visitor for PassRewriting { ]; // Create runtime call, then store it - let runtime_call_expr_id = create_ast_call_expr(ctx, self.current_procedure_id, Method::SelectRegisterCasePort, &mut self.expression_buffer, runtime_call_arguments); + let runtime_call_expr_id = create_ast_call_expr(ctx, original_get_call_span, self.current_procedure_id, Method::SelectRegisterCasePort, &mut self.expression_buffer, runtime_call_arguments); let runtime_call_stmt_id = create_ast_expression_stmt(ctx, runtime_call_expr_id.upcast()); transformed_stmts.push(runtime_call_stmt_id.upcast()); @@ -261,7 +264,7 @@ impl Visitor for PassRewriting { locals.push((select_variable_id, select_variable_type)); { - let runtime_call_expr_id = create_ast_call_expr(ctx, self.current_procedure_id, Method::SelectWait, &mut self.expression_buffer, Vec::new()); + let runtime_call_expr_id = create_ast_call_expr(ctx, InputSpan::new(), self.current_procedure_id, Method::SelectWait, &mut self.expression_buffer, Vec::new()); let variable_stmt_id = create_ast_variable_declaration_stmt(ctx, self.current_procedure_id, select_variable_id, select_variable_type, runtime_call_expr_id.upcast()); transformed_stmts.push(variable_stmt_id.upcast().upcast()); } @@ -364,7 +367,12 @@ fn create_ast_variable_expr(ctx: &mut Ctx, containing_procedure_id: ProcedureDef }); } -fn create_ast_call_expr(ctx: &mut Ctx, containing_procedure_id: ProcedureDefinitionId, method: Method, buffer: &mut ScopedBuffer, arguments: Vec) -> CallExpressionId { +/// Creates an AST call expression. The provided expression span is useful for +/// the cases where we perform compiler-builtin function calls that, when they +/// fail, should provide an error pointing at a specific point in the source +/// code. The `containing_procedure_id` is the procedure whose instructions are +/// going to contain this new call expression. +fn create_ast_call_expr(ctx: &mut Ctx, span: InputSpan, containing_procedure_id: ProcedureDefinitionId, method: Method, buffer: &mut ScopedBuffer, arguments: Vec) -> CallExpressionId { let call_type_id = match method { Method::SelectStart => ctx.arch.void_type_id, Method::SelectRegisterCasePort => ctx.arch.void_type_id, @@ -377,7 +385,7 @@ fn create_ast_call_expr(ctx: &mut Ctx, containing_procedure_id: ProcedureDefinit let call_expression_id = ctx.heap.alloc_call_expression(|this| CallExpression{ func_span: InputSpan::new(), this, - full_span: InputSpan::new(), + full_span: span, parser_type: ParserType{ elements: Vec::new(), full_span: InputSpan::new(),