From 3a49192f3a1e8a5d348cdbfccd0a16d74ba61e3d Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 6 Feb 2022 00:12:48 +0100 Subject: treewide: rework function memory model - Instead of treating individual program functions as managed ucode types, demote uc_function_t values to pointers into a uc_program_t entity - Promote uc_program_t to a managed type - Let uc_closure_t claim references to the owning program of the enclosed uc_function_t - Redefine public APIs uc_compile() and uc_vm_execute() APIs to return and expect an uc_program_t object respectively - Remove vallist indirection for function loading and let the compiler emit the function id directly when producing function construction code Signed-off-by: Jo-Philipp Wich --- examples/native-function.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'examples/native-function.c') diff --git a/examples/native-function.c b/examples/native-function.c index 9c643ec..5c2f6da 100644 --- a/examples/native-function.c +++ b/examples/native-function.c @@ -23,7 +23,7 @@ #define MULTILINE_STRING(...) #__VA_ARGS__ -static const char *program = MULTILINE_STRING( +static const char *program_code = MULTILINE_STRING( {% print("add() = " + add(5, 3.1, 2) + "\n"); print("multiply() = " + multiply(7.3, 5) + "\n"); @@ -61,17 +61,17 @@ int main(int argc, char **argv) int exit_code = 0; /* create a source buffer containing the program code */ - uc_source_t *src = uc_source_new_buffer("my program", strdup(program), strlen(program)); + uc_source_t *src = uc_source_new_buffer("my program", strdup(program_code), strlen(program_code)); /* compile source buffer into function */ char *syntax_error = NULL; - uc_function_t *progfunc = uc_compile(&config, src, &syntax_error); + uc_program_t *program = uc_compile(&config, src, &syntax_error); /* release source buffer */ uc_source_put(src); /* check if compilation failed */ - if (!progfunc) { + if (!program) { fprintf(stderr, "Failed to compile program: %s\n", syntax_error); return 1; @@ -89,7 +89,10 @@ int main(int argc, char **argv) uc_function_register(uc_vm_scope_get(&vm), "multiply", multiply_two_numbers); /* execute program function */ - int return_code = uc_vm_execute(&vm, progfunc, NULL); + int return_code = uc_vm_execute(&vm, program, NULL); + + /* release program */ + uc_program_put(program); /* handle return status */ if (return_code == ERROR_COMPILE || return_code == ERROR_RUNTIME) { -- cgit v1.2.3