import { useDebugAbstractInterp } from '../../api/queries/debug'; import { ApiError } from '../../api/client'; import { EmptyState } from '../../components/ui/EmptyState'; import { ErrorState } from '../../components/ui/ErrorState'; import { LoadingState } from '../../components/ui/LoadingState'; import type { AbstractBlockView, AbstractValueView, TypeFactView, ConstValueViewEntry, } from '../../api/types'; interface AbstractInterpAnalysisPanelProps { file: string; functionName: string; } export function AbstractInterpAnalysisPanel({ file, functionName, }: AbstractInterpAnalysisPanelProps) { const { data, isLoading, error } = useDebugAbstractInterp(file, functionName); if (isLoading) { return ; } if (error) { if (error instanceof ApiError && error.status === 404) { return ( ); } return ; } if ( !data || (data.blocks.length === 0 && data.type_facts.length === 0 && data.const_values.length === 0) ) { return ( ); } return (
{data.blocks.length > 0 && ( <>

Abstract Domain Facts

{data.blocks.map((block) => ( ))} )} {data.type_facts.length > 0 && (

Type Facts

{data.type_facts.length} typed values
{data.type_facts.map((tf) => ( ))}
Value Name Type Nullable
v{tf.ssa_value} {tf.var_name ?? '-'} {tf.type_kind} {tf.nullable ? 'Yes' : 'No'}
)} {data.const_values.length > 0 && (

Constant Values

{data.const_values.length} constants
{data.const_values.map((cv) => ( ))}
Value Name Constant
v{cv.ssa_value} {cv.var_name ?? '-'} {cv.value}
)}
); } function AbstractBlock({ block }: { block: AbstractBlockView }) { return (
B{block.block_id} {block.values.length} tracked values
{block.values.map((v) => ( ))}
Value Name Interval String Prefix String Suffix Bit Masks
); } function AbstractValueRow({ value }: { value: AbstractValueView }) { const lo = value.interval_lo != null ? `${value.interval_lo}` : '-inf'; const hi = value.interval_hi != null ? `${value.interval_hi}` : '+inf'; const interval = `[${lo}, ${hi}]`; const hasBits = value.known_zero !== 0 || value.known_one !== 0; return ( v{value.ssa_value} {value.var_name ?? '-'} {interval} {value.string_prefix ?? '-'} {value.string_suffix ?? '-'} {hasBits ? `zero=0x${value.known_zero.toString(16)} one=0x${value.known_one.toString(16)}` : '-'} ); }