luaur-compiler 0.1.3

Luau source-to-bytecode compiler (Rust).
Documentation
use crate::enums::type_constant_folding::Type;
use crate::records::constant::Constant;
use luaur_common::macros::luau_assert::LUAU_ASSERT;
use luaur_common::FFlag::LuauCompilePropagateTableProps2;
use luaur_common::FFlag::LuauIntegerType2;

pub fn constants_equal(la: &Constant, ra: &Constant) -> bool {
    LUAU_ASSERT!(la.r#type != Type::Type_Unknown && ra.r#type != Type::Type_Unknown);

    match la.r#type {
        Type::Type_Nil => ra.r#type == Type::Type_Nil,
        Type::Type_Boolean => {
            ra.r#type == Type::Type_Boolean
                && unsafe { la.data.value_boolean == ra.data.value_boolean }
        }
        Type::Type_Number => {
            ra.r#type == Type::Type_Number
                && unsafe { la.data.value_number == ra.data.value_number }
        }
        Type::Type_Vector => {
            ra.r#type == Type::Type_Vector
                && unsafe { la.data.value_vector[0] == ra.data.value_vector[0] }
                && unsafe { la.data.value_vector[1] == ra.data.value_vector[1] }
                && unsafe { la.data.value_vector[2] == ra.data.value_vector[2] }
                && unsafe { la.data.value_vector[3] == ra.data.value_vector[3] }
        }
        Type::Type_String => {
            ra.r#type == Type::Type_String
                && la.string_length == ra.string_length
                && unsafe {
                    std::slice::from_raw_parts(
                        la.data.value_string as *const u8,
                        la.string_length as usize,
                    ) == std::slice::from_raw_parts(
                        ra.data.value_string as *const u8,
                        ra.string_length as usize,
                    )
                }
        }
        Type::Type_Table => {
            if LuauCompilePropagateTableProps2.get() {
                ra.r#type == Type::Type_Table
                    && unsafe { la.data.value_table == ra.data.value_table }
            } else {
                LUAU_ASSERT!(false);
                false
            }
        }
        Type::Type_Integer => {
            if LuauIntegerType2.get() {
                ra.r#type == Type::Type_Integer
                    && unsafe { la.data.value_integer64 == ra.data.value_integer64 }
            } else {
                LUAU_ASSERT!(false);
                false
            }
        }
        _ => {
            LUAU_ASSERT!(false);
            false
        }
    }
}