Make machine configuration authoritative and restore native checkpoints exactly

This commit is contained in:
2026-09-18 09:09:41 +08:00
parent 6a69511276
commit 4a568f1f4c
94 changed files with 10882 additions and 301 deletions

View File

@@ -85,6 +85,28 @@ static int code_is(double value, int integer_code) {
return isfinite(value) && fabs(value - (double)integer_code) <= 1e-12;
}
typedef struct { uint32_t magic, size; sim_interpreter interpreter; interpreter_meta meta; } interpreter_checkpoint;
uint32_t sim_interpreter_checkpoint_size(void) { return sizeof(interpreter_checkpoint); }
int32_t sim_interpreter_checkpoint_export(const sim_interpreter *interpreter, uint8_t *output, uint32_t capacity) {
const interpreter_meta *meta = meta_for(interpreter, 0);
if (meta == NULL || output == NULL || capacity != sizeof(interpreter_checkpoint)) return SIM_INTERP_ERR_ARGUMENT;
interpreter_checkpoint *saved = (interpreter_checkpoint *)output;
memset(saved, 0, sizeof(*saved));
saved->magic = UINT32_C(0x49504331); saved->size = sizeof(*saved);
saved->interpreter = *interpreter; saved->meta = *meta; saved->meta.owner = NULL;
return SIM_INTERP_OK;
}
int32_t sim_interpreter_checkpoint_restore(sim_interpreter *interpreter, const uint8_t *input, uint32_t length) {
if (interpreter == NULL || input == NULL || length != sizeof(interpreter_checkpoint)) return SIM_INTERP_ERR_ARGUMENT;
const interpreter_checkpoint *saved = (const interpreter_checkpoint *)input;
if (saved->magic != UINT32_C(0x49504331) || saved->size != sizeof(*saved) || saved->meta.owner != NULL || !finite_state(&saved->interpreter.state) || saved->interpreter.canonical_length >= SIM_INTERPRETER_CANONICAL_CAPACITY || saved->meta.coordinate_system < 0 || saved->meta.coordinate_system > 9) return SIM_INTERP_ERR_ARGUMENT;
for (unsigned i = 0; i < NAMED_PARAMETER_CAPACITY; ++i) if (saved->meta.named[i].used && memchr(saved->meta.named[i].name, '\0', NAMED_PARAMETER_LENGTH) == NULL) return SIM_INTERP_ERR_ARGUMENT;
interpreter_meta *meta = meta_for(interpreter, 1);
if (meta == NULL) return SIM_INTERP_ERR_ARGUMENT;
*interpreter = saved->interpreter; *meta = saved->meta; meta->owner = interpreter;
return SIM_INTERP_OK;
}
static int code_is_value(double value, double expected) {
return isfinite(value) && fabs(value - expected) <= 1e-12;
}