From 7443c5ea0f4fde97c9405be247547d350ff3650b Mon Sep 17 00:00:00 2001 From: ychenfo Date: Mon, 4 Apr 2022 23:21:00 +0800 Subject: [PATCH] nac3core: add location information to codegen context --- nac3core/src/codegen/expr.rs | 13 +++++++------ nac3core/src/codegen/mod.rs | 6 ++++-- nac3core/src/codegen/stmt.rs | 9 +++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/nac3core/src/codegen/expr.rs b/nac3core/src/codegen/expr.rs index 63c17b470..50e8efcdf 100644 --- a/nac3core/src/codegen/expr.rs +++ b/nac3core/src/codegen/expr.rs @@ -395,9 +395,9 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { self.gen_const(generator, &nac3parser::ast::Constant::Str(s.into()), self.primitives.str) } - pub fn raise_exn( + pub fn raise_exn( &mut self, - generator: &mut G, + generator: &mut dyn CodeGenerator, name: &str, msg: BasicValueEnum<'ctx>, params: [Option>; 3], @@ -434,9 +434,9 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { gen_raise(generator, self, Some(&zelf.into()), loc); } - pub fn make_assert( + pub fn make_assert( &mut self, - generator: &mut G, + generator: &mut dyn CodeGenerator, cond: IntValue<'ctx>, err_name: &str, err_msg: &str, @@ -447,9 +447,9 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { self.make_assert_impl(generator, cond, err_name, err_msg, params, loc) } - pub fn make_assert_impl( + pub fn make_assert_impl( &mut self, - generator: &mut G, + generator: &mut dyn CodeGenerator, cond: IntValue<'ctx>, err_name: &str, err_msg: BasicValueEnum<'ctx>, @@ -969,6 +969,7 @@ pub fn gen_expr<'ctx, 'a, G: CodeGenerator>( ctx: &mut CodeGenContext<'ctx, 'a>, expr: &Expr>, ) -> Result>, String> { + ctx.current_loc = expr.location; let int32 = ctx.ctx.i32_type(); let zero = int32.const_int(0, false); Ok(Some(match &expr.node { diff --git a/nac3core/src/codegen/mod.rs b/nac3core/src/codegen/mod.rs index 7e0b0f924..191b023ed 100644 --- a/nac3core/src/codegen/mod.rs +++ b/nac3core/src/codegen/mod.rs @@ -20,7 +20,7 @@ use inkwell::{ values::{BasicValueEnum, FunctionValue, PhiValue, PointerValue} }; use itertools::Itertools; -use nac3parser::ast::{Stmt, StrRef}; +use nac3parser::ast::{Stmt, StrRef, Location}; use parking_lot::{Condvar, Mutex}; use std::collections::{HashMap, HashSet}; use std::sync::{ @@ -77,6 +77,7 @@ pub struct CodeGenContext<'ctx, 'a> { pub outer_catch_clauses: Option<(Vec>>, BasicBlock<'ctx>, PhiValue<'ctx>)>, pub need_sret: bool, + pub current_loc: Location, } impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { @@ -570,7 +571,8 @@ pub fn gen_func_impl<'ctx, G: CodeGenerator, F: FnOnce(&mut G, &mut CodeGenConte module, unifier, static_value_store, - need_sret: has_sret + need_sret: has_sret, + current_loc: Default::default(), }; let result = codegen_function(generator, &mut code_gen_context); diff --git a/nac3core/src/codegen/stmt.rs b/nac3core/src/codegen/stmt.rs index 18ffc823f..6fddfb2fd 100644 --- a/nac3core/src/codegen/stmt.rs +++ b/nac3core/src/codegen/stmt.rs @@ -422,8 +422,8 @@ pub fn final_proxy<'ctx, 'a>( final_paths.push(block); } -pub fn get_builtins<'ctx, 'a, G: CodeGenerator>( - generator: &mut G, +pub fn get_builtins<'ctx, 'a>( + generator: &mut dyn CodeGenerator, ctx: &mut CodeGenContext<'ctx, 'a>, symbol: &str, ) -> FunctionValue<'ctx> { @@ -519,8 +519,8 @@ pub fn exn_constructor<'ctx, 'a>( Ok(Some(zelf.into())) } -pub fn gen_raise<'ctx, 'a, G: CodeGenerator>( - generator: &mut G, +pub fn gen_raise<'ctx, 'a>( + generator: &mut dyn CodeGenerator, ctx: &mut CodeGenContext<'ctx, 'a>, exception: Option<&BasicValueEnum<'ctx>>, loc: Location, @@ -931,6 +931,7 @@ pub fn gen_stmt<'ctx, 'a, G: CodeGenerator>( ctx: &mut CodeGenContext<'ctx, 'a>, stmt: &Stmt>, ) -> Result<(), String> { + ctx.current_loc = stmt.location; match &stmt.node { StmtKind::Pass { .. } => {} StmtKind::Expr { value, .. } => {