use super::jit_kinds::UnifiedValue;
use super::value_ffi::{
HK_BIG_INT, HK_BOOL_ARRAY, HK_COLUMN_REF, HK_DATATABLE, HK_DECIMAL, HK_DURATION, HK_ENUM,
HK_ERR, HK_EXPR_PROXY, HK_FLOAT_ARRAY, HK_FLOAT_ARRAY_SLICE, HK_FUTURE, HK_HASHMAP,
HK_HOST_CLOSURE, HK_INDEXED_TABLE, HK_INT_ARRAY, HK_MATRIX, HK_OK, HK_RANGE, HK_ROW_VIEW,
HK_SIMULATION_CALL, HK_SOME, HK_STRING, HK_TASK_GROUP, HK_TIME, HK_TIMEFRAME, HK_TIMESPAN,
HK_TIME_REFERENCE, HK_TRAIT_OBJECT, HK_TYPED_OBJECT, HK_TYPED_TABLE,
};
use std::collections::HashMap;
use std::sync::Arc;
#[inline]
unsafe fn read_kind(ptr: *const u8) -> u16 {
unsafe { *(ptr as *const u16) }
}
pub(super) fn release_unified_value_by_kind(ptr: *const u8) {
let kind = unsafe { read_kind(ptr) };
unsafe {
match kind {
HK_STRING => drop_box::<Arc<String>>(ptr),
HK_TYPED_OBJECT => drop_box::<*const u8>(ptr),
HK_OK | HK_ERR | HK_SOME => drop_box::<u64>(ptr),
HK_HASHMAP => drop_box::<HashMap<String, u64>>(ptr),
HK_RANGE => drop_box::<crate::context::JITRange>(ptr),
HK_COLUMN_REF => drop_box::<(*const f64, usize)>(ptr),
HK_FLOAT_ARRAY | HK_INT_ARRAY | HK_BOOL_ARRAY | HK_FLOAT_ARRAY_SLICE | HK_MATRIX
| HK_DATATABLE | HK_TYPED_TABLE | HK_INDEXED_TABLE | HK_ROW_VIEW | HK_TIME
| HK_DURATION | HK_TIMESPAN | HK_TIMEFRAME | HK_TIME_REFERENCE | HK_DECIMAL
| HK_BIG_INT | HK_HOST_CLOSURE | HK_ENUM | HK_TRAIT_OBJECT | HK_EXPR_PROXY
| HK_FUTURE | HK_TASK_GROUP | HK_SIMULATION_CALL => {
surface_and_stop_unknown_kind(kind);
}
_ => {
surface_and_stop_unknown_kind(kind);
}
}
}
}
#[inline]
unsafe fn drop_box<T>(ptr: *const u8) {
let typed = ptr as *mut UnifiedValue<T>;
unsafe {
drop(Box::from_raw(typed));
}
}
fn surface_and_stop_unknown_kind(kind: u16) {
eprintln!(
"jit_release SURFACE-AND-STOP: UnifiedValue<T> reclaim has no arm for \
kind={} at the W11-jit-new-array boundary. The allocation is leaked \
intentionally pending a kinded arm for this discriminator. \
ADR-006 §2.7.6 / Q8 / §2.7.14. \
(NB: CLAUDE.md \"Forbidden rationalizations\" — do not turn this \
into a silent skip; add the missing arm with the matching `T` of \
the producing `unified_box::<T>` call site.)",
kind
);
}