use wasm_encoder::{HeapType, Instruction};
use super::intrinsics::IntrinsicTypeIndices;
pub(crate) fn is_nullish<'a>(
load: &[Instruction<'a>],
intrinsics: IntrinsicTypeIndices,
) -> Vec<Instruction<'a>> {
either(
load,
Instruction::RefIsNull,
Instruction::RefTestNonNull(HeapType::Concrete(intrinsics.undefined)),
)
}
pub(crate) fn is_undefined_or_closure<'a>(
load: &[Instruction<'a>],
intrinsics: IntrinsicTypeIndices,
) -> Vec<Instruction<'a>> {
either(
load,
Instruction::RefTestNonNull(HeapType::Concrete(intrinsics.undefined)),
Instruction::RefTestNonNull(HeapType::Concrete(intrinsics.closure)),
)
}
fn either<'a>(
load: &[Instruction<'a>],
first: Instruction<'a>,
second: Instruction<'a>,
) -> Vec<Instruction<'a>> {
let mut sequence = Vec::with_capacity(load.len().saturating_mul(2).saturating_add(3));
sequence.extend_from_slice(load);
sequence.push(first);
sequence.extend_from_slice(load);
sequence.push(second);
sequence.push(Instruction::I32Or);
sequence
}