From b7bf6ffc5b57f633aafa2079f233987f3ca0b502 Mon Sep 17 00:00:00 2001 From: lyken Date: Wed, 12 Jun 2024 12:43:37 +0800 Subject: [PATCH] core: add sanity checks in `BuiltinBuilder::build_builin_of_prim` --- nac3core/src/toplevel/builtins.rs | 31 +++++++++++++++++++++++++++++-- nac3core/src/toplevel/helper.rs | 4 ++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/nac3core/src/toplevel/builtins.rs b/nac3core/src/toplevel/builtins.rs index 6283b14..a0dbb5d 100644 --- a/nac3core/src/toplevel/builtins.rs +++ b/nac3core/src/toplevel/builtins.rs @@ -1,6 +1,6 @@ use std::iter::once; -use helper::debug_assert_prim_is_allowed; +use helper::{debug_assert_prim_is_allowed, PrimDefDetails}; use indexmap::IndexMap; use inkwell::{ attributes::{Attribute, AttributeLoc}, @@ -441,7 +441,7 @@ impl<'a> BuiltinBuilder<'a> { /// Build the [`TopLevelDef`] associated of a [`PrimDef`]. fn build_builtin_of_prim(&mut self, prim: PrimDef) -> TopLevelDef { - match prim { + let tld = match prim { PrimDef::Int32 | PrimDef::Int64 | PrimDef::UInt32 @@ -544,7 +544,34 @@ impl<'a> BuiltinBuilder<'a> { | PrimDef::FunNpLdExp | PrimDef::FunNpHypot | PrimDef::FunNpNextAfter => self.build_np_2ary_function(prim), + }; + + if cfg!(debug_assertions) { + // Sanity checks on the constructed [`TopLevelDef`] + + match (&tld, prim.details()) { + ( + TopLevelDef::Class { name, object_id, .. }, + PrimDefDetails::PrimClass { name: exp_name }, + ) => { + let exp_object_id = prim.id(); + assert_eq!(name, &exp_name.into()); + assert_eq!(object_id, &exp_object_id); + } + ( + TopLevelDef::Function { name, simple_name, .. }, + PrimDefDetails::PrimFunction { name: exp_name, simple_name: exp_simple_name }, + ) => { + assert_eq!(name, exp_name); + assert_eq!(simple_name, &exp_simple_name.into()); + } + _ => { + panic!("Class/function variant of the constructed TopLevelDef of PrimDef {prim:?} is different than what is defined by {prim:?}") + } + } } + + tld } /// Build "simple" primitive classes. diff --git a/nac3core/src/toplevel/helper.rs b/nac3core/src/toplevel/helper.rs index d7436e3..b8d5689 100644 --- a/nac3core/src/toplevel/helper.rs +++ b/nac3core/src/toplevel/helper.rs @@ -103,7 +103,7 @@ pub enum PrimDef { } /// Associated details of a [`PrimDef`] -enum PrimDefDetails { +pub enum PrimDefDetails { PrimFunction { name: &'static str, simple_name: &'static str }, PrimClass { name: &'static str }, } @@ -153,7 +153,7 @@ impl PrimDef { /// Get the associated details of this [`PrimDef`] #[must_use] - fn details(self) -> PrimDefDetails { + pub fn details(self) -> PrimDefDetails { fn class(name: &'static str) -> PrimDefDetails { PrimDefDetails::PrimClass { name } }