From fffa0bac27a452009814838ec8ef66c7f3436282 Mon Sep 17 00:00:00 2001 From: David Mak Date: Fri, 9 Aug 2024 15:26:33 +0800 Subject: [PATCH] WIP6 - gen_string returns StructValue --- nac3artiq/src/codegen.rs | 3 ++- nac3core/src/codegen/expr.rs | 13 ++++++++----- nac3core/src/codegen/numpy.rs | 4 ++-- nac3core/src/codegen/stmt.rs | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/nac3artiq/src/codegen.rs b/nac3artiq/src/codegen.rs index ee7f39dd..dbde7ec3 100644 --- a/nac3artiq/src/codegen.rs +++ b/nac3artiq/src/codegen.rs @@ -762,11 +762,12 @@ fn polymorphic_print<'ctx>( }); let fmt = ctx.gen_string(generator, fmt); + let fmt = unsafe { fmt.get_field_at_index_unchecked(0) }.into_pointer_value(); ctx.builder .build_call( print_fn, - &once(fmt).chain(args).map(BasicValueEnum::into).collect_vec(), + &once(fmt.into()).chain(args).map(BasicValueEnum::into).collect_vec(), "", ) .unwrap(); diff --git a/nac3core/src/codegen/expr.rs b/nac3core/src/codegen/expr.rs index b63da080..b81ca66d 100644 --- a/nac3core/src/codegen/expr.rs +++ b/nac3core/src/codegen/expr.rs @@ -29,6 +29,7 @@ use crate::{ typedef::{FunSignature, FuncArg, Type, TypeEnum, TypeVarId, Unifier, VarMap}, }, }; +use inkwell::values::StructValue; use inkwell::{ attributes::{Attribute, AttributeLoc}, types::{AnyType, BasicType, BasicTypeEnum}, @@ -322,7 +323,7 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { self.raise_exn( generator, "0:NotImplementedError", - msg, + msg.into(), [None, None, None], self.current_loc, ); @@ -582,12 +583,14 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { } /// Helper function for generating a LLVM variable storing a [String]. - pub fn gen_string(&mut self, generator: &mut G, s: S) -> BasicValueEnum<'ctx> + pub fn gen_string(&mut self, generator: &mut G, s: S) -> StructValue<'ctx> where G: CodeGenerator + ?Sized, S: Into, { - self.gen_const(generator, &Constant::Str(s.into()), self.primitives.str).unwrap() + self.gen_const(generator, &Constant::Str(s.into()), self.primitives.str) + .map(BasicValueEnum::into_struct_value) + .unwrap() } pub fn raise_exn( @@ -646,7 +649,7 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { loc: Location, ) { let err_msg = self.gen_string(generator, err_msg); - self.make_assert_impl(generator, cond, err_name, err_msg, params, loc); + self.make_assert_impl(generator, cond, err_name, err_msg.into(), params, loc); } pub fn make_assert_impl( @@ -3067,7 +3070,7 @@ pub fn gen_expr<'ctx, G: CodeGenerator>( ctx.raise_exn( generator, "0:UnwrapNoneError", - err_msg, + err_msg.into(), [None, None, None], ctx.current_loc, ); diff --git a/nac3core/src/codegen/numpy.rs b/nac3core/src/codegen/numpy.rs index 6ebffe80..ff8c55eb 100644 --- a/nac3core/src/codegen/numpy.rs +++ b/nac3core/src/codegen/numpy.rs @@ -257,7 +257,7 @@ fn ndarray_zero_value<'ctx, G: CodeGenerator + ?Sized>( } else if ctx.unifier.unioned(elem_ty, ctx.primitives.bool) { ctx.ctx.bool_type().const_zero().into() } else if ctx.unifier.unioned(elem_ty, ctx.primitives.str) { - ctx.gen_string(generator, "") + ctx.gen_string(generator, "").into() } else { unreachable!() } @@ -285,7 +285,7 @@ fn ndarray_one_value<'ctx, G: CodeGenerator + ?Sized>( } else if ctx.unifier.unioned(elem_ty, ctx.primitives.bool) { ctx.ctx.bool_type().const_int(1, false).into() } else if ctx.unifier.unioned(elem_ty, ctx.primitives.str) { - ctx.gen_string(generator, "1") + ctx.gen_string(generator, "1").into() } else { unreachable!() } diff --git a/nac3core/src/codegen/stmt.rs b/nac3core/src/codegen/stmt.rs index ea5869d6..4b2cf4e2 100644 --- a/nac3core/src/codegen/stmt.rs +++ b/nac3core/src/codegen/stmt.rs @@ -1780,7 +1780,7 @@ pub fn gen_stmt( return Ok(()); } } - None => ctx.gen_string(generator, ""), + None => ctx.gen_string(generator, "").into(), }; ctx.make_assert_impl( generator,