Added scheme-aware dispatch for in‑memory exec so non‑SchemeRef_DAG_1 refs are rejected, and exposed it via the CLI.

This commit is contained in:
Carl Niklas Rydberg 2025-12-22 08:34:40 +01:00
parent 6dfcb2bfc6
commit d301823c12
3 changed files with 117 additions and 14 deletions

View file

@ -30,6 +30,16 @@ bool amduat_pel_surf_run_with_result(amduat_asl_store_t *store,
amduat_reference_t params_ref, amduat_reference_t params_ref,
amduat_pel_run_result_t *out_run); amduat_pel_run_result_t *out_run);
bool amduat_pel_exec_program_artifact_with_scheme(
amduat_reference_t scheme_ref,
amduat_artifact_t program_artifact,
const amduat_artifact_t *inputs,
size_t inputs_len,
const amduat_artifact_t *params,
amduat_artifact_t **out_outputs,
size_t *out_outputs_len,
amduat_pel_execution_result_value_t *out_result);
bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact,
const amduat_artifact_t *inputs, const amduat_artifact_t *inputs,
size_t inputs_len, size_t inputs_len,

View file

@ -226,13 +226,14 @@ static bool amduat_pel_exec_program_bytes_unchecked(
return ok; return ok;
} }
bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact, static bool amduat_pel_exec_program_artifact_core(
const amduat_artifact_t *inputs, amduat_artifact_t program_artifact,
size_t inputs_len, const amduat_artifact_t *inputs,
const amduat_artifact_t *params, size_t inputs_len,
amduat_artifact_t **out_outputs, const amduat_artifact_t *params,
size_t *out_outputs_len, amduat_artifact_t **out_outputs,
amduat_pel_execution_result_value_t *out_result) { size_t *out_outputs_len,
amduat_pel_execution_result_value_t *out_result) {
amduat_type_tag_t expected_type_tag; amduat_type_tag_t expected_type_tag;
amduat_asl_encoding_profile_id_t expected_profile; amduat_asl_encoding_profile_id_t expected_profile;
@ -272,3 +273,54 @@ bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact,
out_outputs_len, out_outputs_len,
out_result); out_result);
} }
bool amduat_pel_exec_program_artifact_with_scheme(
amduat_reference_t scheme_ref,
amduat_artifact_t program_artifact,
const amduat_artifact_t *inputs,
size_t inputs_len,
const amduat_artifact_t *params,
amduat_artifact_t **out_outputs,
size_t *out_outputs_len,
amduat_pel_execution_result_value_t *out_result) {
if (out_outputs == NULL || out_outputs_len == NULL || out_result == NULL) {
return false;
}
memset(out_result, 0, sizeof(*out_result));
if (!amduat_reference_eq(scheme_ref,
amduat_pel_program_dag_scheme_ref())) {
out_result->pel1_version = 1;
out_result->status = AMDUAT_PEL_EXEC_STATUS_SCHEME_UNSUPPORTED;
out_result->scheme_ref = scheme_ref;
out_result->summary.kind = AMDUAT_PEL_EXEC_ERROR_SCHEME;
out_result->summary.status_code = 1;
*out_outputs = NULL;
*out_outputs_len = 0;
return true;
}
return amduat_pel_exec_program_artifact_core(program_artifact,
inputs,
inputs_len,
params,
out_outputs,
out_outputs_len,
out_result);
}
bool amduat_pel_exec_program_artifact(amduat_artifact_t program_artifact,
const amduat_artifact_t *inputs,
size_t inputs_len,
const amduat_artifact_t *params,
amduat_artifact_t **out_outputs,
size_t *out_outputs_len,
amduat_pel_execution_result_value_t *out_result) {
return amduat_pel_exec_program_artifact_core(program_artifact,
inputs,
inputs_len,
params,
out_outputs,
out_outputs_len,
out_result);
}

View file

@ -84,6 +84,7 @@ static void amduat_pel_cli_print_usage(FILE *stream) {
"exec:\n" "exec:\n"
" amduat-pel exec --program PATH|-\n" " amduat-pel exec --program PATH|-\n"
" [--program-format raw|artifact]\n" " [--program-format raw|artifact]\n"
" [--scheme-ref REF|dag]\n"
" [--input PATH ...] [--input-format raw|artifact]\n" " [--input PATH ...] [--input-format raw|artifact]\n"
" [--output-dir DIR] [--output-format raw|artifact]\n" " [--output-dir DIR] [--output-format raw|artifact]\n"
" [--result-out PATH|-] [--format text|json]\n" " [--result-out PATH|-] [--format text|json]\n"
@ -665,6 +666,7 @@ static int amduat_pel_cli_cmd_exec(int argc,
char **argv, char **argv,
const amduat_pel_cli_global_opts_t *global) { const amduat_pel_cli_global_opts_t *global) {
const char *program_path = NULL; const char *program_path = NULL;
const char *scheme_ref_text = "dag";
const char **input_paths = NULL; const char **input_paths = NULL;
size_t input_paths_len = 0; size_t input_paths_len = 0;
amduat_asl_io_format_t input_format = AMDUAT_ASL_IO_RAW; amduat_asl_io_format_t input_format = AMDUAT_ASL_IO_RAW;
@ -680,6 +682,7 @@ static int amduat_pel_cli_cmd_exec(int argc,
amduat_pel_execution_result_value_t result; amduat_pel_execution_result_value_t result;
uint8_t *program_bytes = NULL; uint8_t *program_bytes = NULL;
size_t program_len = 0; size_t program_len = 0;
amduat_reference_t scheme_ref;
bool stdin_used = false; bool stdin_used = false;
int exit_code = AMDUAT_PEL_CLI_EXIT_OK; int exit_code = AMDUAT_PEL_CLI_EXIT_OK;
FILE *out_stream = NULL; FILE *out_stream = NULL;
@ -732,6 +735,12 @@ static int amduat_pel_cli_cmd_exec(int argc,
return AMDUAT_PEL_CLI_EXIT_USAGE; return AMDUAT_PEL_CLI_EXIT_USAGE;
} }
program_format_set = true; program_format_set = true;
} else if (strcmp(argv[i], "--scheme-ref") == 0) {
if (i + 1 >= argc) {
fprintf(stderr, "error: --scheme-ref requires a value\n");
return AMDUAT_PEL_CLI_EXIT_USAGE;
}
scheme_ref_text = argv[++i];
} else if (strcmp(argv[i], "--output-dir") == 0) { } else if (strcmp(argv[i], "--output-dir") == 0) {
if (i + 1 >= argc) { if (i + 1 >= argc) {
fprintf(stderr, "error: --output-dir requires a path\n"); fprintf(stderr, "error: --output-dir requires a path\n");
@ -792,11 +801,26 @@ static int amduat_pel_cli_cmd_exec(int argc,
return AMDUAT_PEL_CLI_EXIT_IO; return AMDUAT_PEL_CLI_EXIT_IO;
} }
if (strcmp(scheme_ref_text, "dag") == 0) {
scheme_ref = amduat_pel_program_dag_scheme_ref();
} else if (!amduat_pel_cli_ref_from_text(scheme_ref_text,
global->ref_format,
&stdin_used,
&scheme_ref)) {
fprintf(stderr, "error: invalid --scheme-ref\n");
free(program_bytes);
free(input_paths);
return AMDUAT_PEL_CLI_EXIT_CODEC;
}
if (input_paths_len > 0) { if (input_paths_len > 0) {
inputs = (amduat_artifact_t *)calloc( inputs = (amduat_artifact_t *)calloc(
input_paths_len, sizeof(*inputs)); input_paths_len, sizeof(*inputs));
if (inputs == NULL) { if (inputs == NULL) {
fprintf(stderr, "error: out of memory\n"); fprintf(stderr, "error: out of memory\n");
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
free(program_bytes); free(program_bytes);
free(input_paths); free(input_paths);
return AMDUAT_PEL_CLI_EXIT_STORE; return AMDUAT_PEL_CLI_EXIT_STORE;
@ -823,6 +847,9 @@ static int amduat_pel_cli_cmd_exec(int argc,
&inputs[i])) { &inputs[i])) {
free(bytes); free(bytes);
fprintf(stderr, "error: invalid input artifact\n"); fprintf(stderr, "error: invalid input artifact\n");
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
free(program_bytes); free(program_bytes);
program_bytes = NULL; program_bytes = NULL;
exit_code = AMDUAT_PEL_CLI_EXIT_CODEC; exit_code = AMDUAT_PEL_CLI_EXIT_CODEC;
@ -845,20 +872,28 @@ static int amduat_pel_cli_cmd_exec(int argc,
amduat_type_tag(0), amduat_type_tag(0),
&program_artifact)) { &program_artifact)) {
fprintf(stderr, "error: invalid program artifact\n"); fprintf(stderr, "error: invalid program artifact\n");
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
free(program_bytes); free(program_bytes);
program_bytes = NULL; program_bytes = NULL;
exit_code = AMDUAT_PEL_CLI_EXIT_CODEC; exit_code = AMDUAT_PEL_CLI_EXIT_CODEC;
goto exec_cleanup; goto exec_cleanup;
} }
if (!amduat_pel_exec_program_artifact(program_artifact, if (!amduat_pel_exec_program_artifact_with_scheme(
inputs, scheme_ref,
input_paths_len, program_artifact,
NULL, inputs,
&outputs, input_paths_len,
&outputs_len, NULL,
&result)) { &outputs,
&outputs_len,
&result)) {
amduat_asl_artifact_free(&program_artifact); amduat_asl_artifact_free(&program_artifact);
fprintf(stderr, "error: exec failed\n"); fprintf(stderr, "error: exec failed\n");
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
free(program_bytes); free(program_bytes);
program_bytes = NULL; program_bytes = NULL;
exit_code = AMDUAT_PEL_CLI_EXIT_STORE; exit_code = AMDUAT_PEL_CLI_EXIT_STORE;
@ -868,6 +903,9 @@ static int amduat_pel_cli_cmd_exec(int argc,
} }
free(program_bytes); free(program_bytes);
program_bytes = NULL; program_bytes = NULL;
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
for (i = 0; i < (int)outputs_len; ++i) { for (i = 0; i < (int)outputs_len; ++i) {
char path_buf[4096]; char path_buf[4096];
@ -988,6 +1026,9 @@ exec_cleanup:
amduat_pel_program_dag_free_outputs(outputs, outputs_len); amduat_pel_program_dag_free_outputs(outputs, outputs_len);
} }
amduat_pel_execution_result_free(&result); amduat_pel_execution_result_free(&result);
if (strcmp(scheme_ref_text, "dag") != 0) {
amduat_pel_cli_free_reference(&scheme_ref);
}
if (inputs != NULL) { if (inputs != NULL) {
for (i = 0; i < (int)input_paths_len; ++i) { for (i = 0; i < (int)input_paths_len; ++i) {
amduat_asl_artifact_free(&inputs[i]); amduat_asl_artifact_free(&inputs[i]);