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

@@ -318,6 +318,30 @@ static void reset_runtime(sim_program *program) {
uint32_t sim_program_size(void) { return (uint32_t)sizeof(sim_program); }
typedef struct { uint32_t magic, size; sim_program program; } program_checkpoint;
uint32_t sim_program_checkpoint_size(void) { return sizeof(program_checkpoint) + sim_interpreter_checkpoint_size(); }
int32_t sim_program_checkpoint_export(const sim_program *program, uint8_t *output, uint32_t capacity) {
if (program == NULL || output == NULL || capacity != sim_program_checkpoint_size()) return SIM_PROGRAM_ERR_ARGUMENT;
program_checkpoint *saved = (program_checkpoint *)output;
memset(saved, 0, sizeof(*saved)); saved->magic = UINT32_C(0x50524331); saved->size = sizeof(*saved);
saved->program = *program;
saved->program.source = NULL; saved->program.line_offsets = NULL;
saved->program.source_capacity = 0; saved->program.line_capacity = 0;
return sim_interpreter_checkpoint_export(&program->interpreter, output + sizeof(*saved), sim_interpreter_checkpoint_size()) == SIM_INTERP_OK ? SIM_PROGRAM_OK : SIM_PROGRAM_ERR_INTERPRETER;
}
int32_t sim_program_checkpoint_restore(sim_program *program, const uint8_t *input, uint32_t length) {
if (program == NULL || input == NULL || length != sim_program_checkpoint_size()) return SIM_PROGRAM_ERR_ARGUMENT;
const program_checkpoint *saved = (const program_checkpoint *)input;
if (saved->magic != UINT32_C(0x50524331) || saved->size != sizeof(*saved) || saved->program.source != NULL || saved->program.line_offsets != NULL || saved->program.source_length != program->source_length || saved->program.line_count != program->line_count || saved->program.current_line > program->line_count || saved->program.call_depth > SIM_PROGRAM_CALL_DEPTH || saved->program.subroutine_count > SIM_PROGRAM_SUBROUTINE_CAPACITY || saved->program.status > SIM_PROGRAM_ERROR) return SIM_PROGRAM_ERR_ARGUMENT;
if (sim_interpreter_checkpoint_restore(&program->interpreter, input + sizeof(*saved), sim_interpreter_checkpoint_size()) != SIM_INTERP_OK) return SIM_PROGRAM_ERR_INTERPRETER;
char *source = program->source; uint32_t *lines = program->line_offsets;
uint32_t source_capacity = program->source_capacity, line_capacity = program->line_capacity;
*program = saved->program;
program->source = source; program->line_offsets = lines;
program->source_capacity = source_capacity; program->line_capacity = line_capacity;
return SIM_PROGRAM_OK;
}
int32_t sim_program_init(sim_program *program) {
if (program == NULL) return SIM_PROGRAM_ERR_ARGUMENT;
memset(program, 0, sizeof(*program));