From 9200ba252109d0b8fe6fa1e2bfcdeaa69997839f Mon Sep 17 00:00:00 2001 From: lyken Date: Tue, 20 Aug 2024 23:23:30 +0800 Subject: [PATCH] core/ndstrides: add NDArrayObject::to_any --- nac3core/src/codegen/object/ndarray/mod.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/nac3core/src/codegen/object/ndarray/mod.rs b/nac3core/src/codegen/object/ndarray/mod.rs index 3f0e2120..8664d618 100644 --- a/nac3core/src/codegen/object/ndarray/mod.rs +++ b/nac3core/src/codegen/object/ndarray/mod.rs @@ -28,7 +28,10 @@ use crate::{ model::*, CodeGenContext, CodeGenerator, }, - toplevel::{helper::extract_ndims, numpy::unpack_ndarray_var_tys}, + toplevel::{ + helper::{create_ndims, extract_ndims}, + numpy::{make_ndarray_ty, unpack_ndarray_var_tys}, + }, typecheck::typedef::{Type, TypeEnum}, }; @@ -105,6 +108,18 @@ impl<'ctx> NDArrayObject<'ctx> { Int(SizeT).const_int(generator, ctx, self.ndims) } + /// Get the typechecker ndarray type of this [`NDArrayObject`]. + pub fn get_type(&self, ctx: &mut CodeGenContext<'ctx, '_>) -> Type { + let ndims = create_ndims(&mut ctx.unifier, self.ndims); + make_ndarray_ty(&mut ctx.unifier, &ctx.primitives, Some(self.dtype), Some(ndims)) + } + + /// Forget that this is an ndarray and convert into an [`AnyObject`]. + pub fn to_any(&self, ctx: &mut CodeGenContext<'ctx, '_>) -> AnyObject<'ctx> { + let ty = self.get_type(ctx); + AnyObject { value: self.instance.value.as_basic_value_enum(), ty } + } + /// Allocate an ndarray on the stack given its `ndims` and `dtype`. /// /// `shape` and `strides` will be automatically allocated on the stack.