Plan 2026-10-20 (ENGINE step 4), Task A1, for #189 -- Captain Bob, 2026-11-12: the physics blocks alpha.5; order A, 1, 2, then 7. - exec.h/exec.c: v4_call_hook, es->on_call/on_call_ctx; called at `call` once the return address is pushed, before P moves. NULL: as before. - heat.h/heat.c: the per-call-target table (4096 slots, no capsule word counted), its freeze mask and v4_heat_call_* go (ENGINE.md step 3: "The per-call-target count goes"); the kernel will keep a word's accounts. - tests: test_call_hook_sees_every_call, seen to fail first (no on_call); test_heat's per-call tests go with the table. - the plan records today's rulings (order; HEAT-OP: both, a full array). Suite (logs/20261112-225951/v4-tests): test, test-32, sanitize, 0 failures; hosted-check, the three alike. amd64 boot: POST 538/538, dict_hash 0x8c92508f748f99cf, unchanged -- nothing sets the hook yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
66 lines
2.0 KiB
C
66 lines
2.0 KiB
C
/* SPDX-License-Identifier: LicenseRef-Starship-1.0
|
|
* Copyright (c) 2023-2026 Robert A. James
|
|
*/
|
|
/* test_heat.c -- heat and anti-clock. A call's target is counted through exec.h's hook
|
|
* (test_exec.c), not here: the per-call-target table is gone (#189). */
|
|
#include "v4/heat.h"
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static int failures = 0;
|
|
static int checks = 0;
|
|
|
|
#define CHECK(cond, ...) \
|
|
do { \
|
|
checks++; \
|
|
if (!(cond)) { \
|
|
failures++; \
|
|
printf(" FAIL %s:%d: ", __FILE__, __LINE__); \
|
|
printf(__VA_ARGS__); \
|
|
printf("\n"); \
|
|
} \
|
|
} while (0)
|
|
|
|
static void test_reset(void)
|
|
{
|
|
v4_heat h;
|
|
memset(&h, 0xFF, sizeof h);
|
|
v4_heat_reset(&h);
|
|
|
|
for (unsigned i = 0; i < V4_OPCODE_COUNT; i++) {
|
|
CHECK(h.op[i] == 0, "op %u heat non-zero after reset", i);
|
|
}
|
|
v4_uheat_t ac = 999;
|
|
v4_heat_on_retire(&h, V4_OP_NOP, &ac);
|
|
CHECK(ac == 1000, "anticlock not advanced");
|
|
CHECK(h.op[V4_OP_NOP] == 1, "nop heat");
|
|
}
|
|
|
|
static void test_retire_advances_anticlock_and_opcode(void)
|
|
{
|
|
v4_heat h;
|
|
v4_heat_reset(&h);
|
|
v4_uheat_t ac = 0;
|
|
for (int i = 0; i < 100; i++) {
|
|
v4_heat_on_retire(&h, V4_OP_ADD, &ac);
|
|
}
|
|
CHECK(ac == 100, "anticlock");
|
|
CHECK(h.op[V4_OP_ADD] == 100, "add heat");
|
|
for (unsigned i = 0; i < V4_OPCODE_COUNT; i++) {
|
|
if (i == V4_OP_ADD) continue;
|
|
CHECK(h.op[i] == 0, "other op %u", i);
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
printf("v4 heat tests: V4_CELL_BITS=%d\n", V4_CELL_BITS);
|
|
|
|
test_reset();
|
|
test_retire_advances_anticlock_and_opcode();
|
|
|
|
printf(" %d checks, %d failures\n", checks, failures);
|
|
return failures ? 1 : 0;
|
|
}
|