///|
#cfg(target="native")
fn Store::gc_reference_kind(self : Store, index : Int32) -> Int32 {
  if self.closed.val {
    return 0
  }
  if self.references.native.c_heap is Some(heap) {
    return heap.get_kind(index)
  }
  let object = self.heap.get(index) catch { _ => return 0 }
  match object {
    Struct(_) => 1
    Array(_) => 2
  }
}

///|
#cfg(target="wasm")
fn Store::gc_reference_kind(self : Store, index : Int32) -> Int32 {
  if self.closed.val {
    return 0
  }
  let object = self.heap.get(index) catch { _ => return 0 }
  match object {
    Struct(_) => 1
    Array(_) => 2
  }
}

///|
/// Check the live object's kind, independently of a raw Value variant.
pub fn Store::is_struct_reference(self : Store, index : Int32) -> Bool {
  self.gc_reference_kind(index) == 1
}

///|
/// Check the live object's kind, independently of a raw Value variant.
pub fn Store::is_array_reference(self : Store, index : Int32) -> Bool {
  self.gc_reference_kind(index) == 2
}