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
| Value |
Name |
Type |
Nullable |
{data.type_facts.map((tf) => (
| 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
| Value |
Name |
Constant |
{data.const_values.map((cv) => (
| v{cv.ssa_value} |
{cv.var_name ?? '-'} |
{cv.value} |
))}
)}
);
}
function AbstractBlock({ block }: { block: AbstractBlockView }) {
return (
B{block.block_id}
{block.values.length} tracked values
| Value |
Name |
Interval |
String Prefix |
String Suffix |
Bit Masks |
{block.values.map((v) => (
))}
);
}
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)}`
: '-'}
|
);
}