use std::array;
use allocative::Allocative;
use once_cell::sync::Lazy;
use starlark_derive::starlark_value;
use starlark_derive::NoSerialize;
use crate as starlark;
use crate::eval::runtime::slots::LocalSlotId;
use crate::starlark_simple_value;
use crate::values::FrozenHeap;
use crate::values::FrozenHeapRef;
use crate::values::FrozenValueTyped;
use crate::values::ProvidesStaticType;
use crate::values::StarlarkValue;
#[derive(
derive_more::Display,
Debug,
ProvidesStaticType,
NoSerialize,
Allocative
)]
#[display("{:?}", self)]
pub(crate) struct LocalAsValue {
#[allocative(skip)]
pub(crate) local: LocalSlotId,
}
#[starlark_value(type = "LocalAsValue")]
impl<'v> StarlarkValue<'v> for LocalAsValue {}
starlark_simple_value!(LocalAsValue);
pub(crate) fn local_as_value(
local: LocalSlotId,
) -> Option<FrozenValueTyped<'static, LocalAsValue>> {
static LOCALS: Lazy<(
FrozenHeapRef,
[FrozenValueTyped<'static, LocalAsValue>; 100],
)> = Lazy::new(|| {
let heap = FrozenHeap::new();
let locals = array::from_fn(|i| {
heap.alloc_simple_typed(LocalAsValue {
local: LocalSlotId(i as u32),
})
});
(heap.into_ref(), locals)
});
LOCALS.1.get(local.0 as usize).copied()
}