Compile derived structural equality

This commit is contained in:
Ayaz Hafiz 2022-10-05 17:17:35 -05:00
parent 54e977be2d
commit 3674f6861e
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
7 changed files with 41 additions and 1 deletions

View file

@ -184,6 +184,7 @@ macro_rules! map_symbol_to_lowlevel {
// Below, we explicitly handle some exceptions to the pattern where a lowlevel maps
// directly to a symbol. If you are unsure if your lowlevel is an exception, assume
// that it isn't and just see if that works.
#[allow(unreachable_patterns)] // TODO: remove after we replace `BOOL_EQ` with `EQ_EQ` wholly
match lowlevel {
$(
LowLevel::$lowlevel => Symbol::$symbol,
@ -310,6 +311,7 @@ map_symbol_to_lowlevel! {
NumShiftRightZfBy <= NUM_SHIFT_RIGHT_ZERO_FILL,
NumToStr <= NUM_TO_STR,
Eq <= BOOL_EQ,
Eq <= EQ_STRUCTURAL_EQ,
NotEq <= BOOL_NEQ,
And <= BOOL_AND,
Or <= BOOL_OR,

View file

@ -99,6 +99,17 @@ impl Symbol {
DERIVABLE_ABILITIES.iter().find(|(name, _)| *name == self)
}
/// A symbol that should never be exposed to userspace, but needs to be exposed
/// to compiled modules for deriving abilities for structural types.
pub fn is_exposed_for_builtin_derivers(&self) -> bool {
matches!(
self,
// The `structuralEq` call used deriving structural equality, which will wrap the `Eq`
// low-level implementation.
&Self::EQ_STRUCTURAL_EQ
) && false
}
pub fn module_string<'a>(&self, interns: &'a Interns) -> &'a ModuleName {
interns
.module_ids