summaryrefslogtreecommitdiffhomepage
path: root/examples
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-02-06 00:12:48 +0100
committerJo-Philipp Wich <jo@mein.io>2022-02-07 00:04:35 +0100
commit3a49192f3a1e8a5d348cdbfccd0a16d74ba61e3d (patch)
tree6d8a4b620b362ab4f707678a5b626a85e1531c0b /examples
parent5bd764a35aeaf50b54957bfa94ba94198514baf0 (diff)
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 <jo@mein.io>
Diffstat (limited to 'examples')
-rw-r--r--examples/exception-handler.c10
-rw-r--r--examples/execute-file.c6
-rw-r--r--examples/execute-string.c13
-rw-r--r--examples/native-function.c13
-rw-r--r--examples/state-reset.c15
-rw-r--r--examples/state-reuse.c15
6 files changed, 36 insertions, 36 deletions
diff --git a/examples/exception-handler.c b/examples/exception-handler.c
index a9a0299..324a350 100644
--- a/examples/exception-handler.c
+++ b/examples/exception-handler.c
@@ -23,7 +23,7 @@
#define MULTILINE_STRING(...) #__VA_ARGS__
-static const char *program = MULTILINE_STRING(
+static const char *program_code = MULTILINE_STRING(
{%
function fail() {
/* invoke not existing function to raise runtime error */
@@ -58,17 +58,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;
@@ -85,7 +85,7 @@ int main(int argc, char **argv)
uc_vm_exception_handler_set(&vm, log_exception);
/* execute program function */
- int return_code = uc_vm_execute(&vm, progfunc, NULL);
+ int return_code = uc_vm_execute(&vm, program, NULL);
/* handle return status */
if (return_code == ERROR_COMPILE || return_code == ERROR_RUNTIME) {
diff --git a/examples/execute-file.c b/examples/execute-file.c
index 12910e3..1895cda 100644
--- a/examples/execute-file.c
+++ b/examples/execute-file.c
@@ -49,13 +49,13 @@ int main(int argc, char **argv)
/* 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;
@@ -74,7 +74,7 @@ int main(int argc, char **argv)
/* execute compiled program function */
uc_value_t *last_expression_result = NULL;
- int return_code = uc_vm_execute(&vm, progfunc, &last_expression_result);
+ int return_code = uc_vm_execute(&vm, program, &last_expression_result);
/* handle return status */
switch (return_code) {
diff --git a/examples/execute-string.c b/examples/execute-string.c
index 1fcc966..fe5e8e9 100644
--- a/examples/execute-string.c
+++ b/examples/execute-string.c
@@ -28,7 +28,7 @@
#define MULTILINE_STRING(...) #__VA_ARGS__
-static const char *program = MULTILINE_STRING(
+static const char *program_code = MULTILINE_STRING(
{%
function add(a, b) {
c = a + b;
@@ -55,17 +55,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;
@@ -84,7 +84,10 @@ int main(int argc, char **argv)
/* execute compiled program function */
uc_value_t *last_expression_result = NULL;
- int return_code = uc_vm_execute(&vm, progfunc, &last_expression_result);
+ int return_code = uc_vm_execute(&vm, program, &last_expression_result);
+
+ /* release program */
+ uc_program_put(program);
/* handle return status */
switch (return_code) {
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) {
diff --git a/examples/state-reset.c b/examples/state-reset.c
index 692aa76..ce61e7f 100644
--- a/examples/state-reset.c
+++ b/examples/state-reset.c
@@ -23,7 +23,7 @@
#define MULTILINE_STRING(...) #__VA_ARGS__
-static const char *program = MULTILINE_STRING(
+static const char *program_code = MULTILINE_STRING(
{%
/* the global test variable should've been reset since the previous run */
print("Global variable is null? " + (global.test == null) + "\n");
@@ -43,17 +43,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;
@@ -70,11 +70,8 @@ int main(int argc, char **argv)
printf("Iteration %d: ", i + 1);
- /* take additional reference to progfunc to avoid freeing it after execution */
- ucv_get(&progfunc->header);
-
/* execute program function */
- int return_code = uc_vm_execute(&vm, progfunc, NULL);
+ int return_code = uc_vm_execute(&vm, program, NULL);
/* handle return status */
if (return_code == ERROR_COMPILE || return_code == ERROR_RUNTIME) {
@@ -88,7 +85,7 @@ int main(int argc, char **argv)
}
/* release program function */
- ucv_put(&progfunc->header);
+ uc_program_put(program);
return exit_code;
}
diff --git a/examples/state-reuse.c b/examples/state-reuse.c
index 7e2c44f..f7321f6 100644
--- a/examples/state-reuse.c
+++ b/examples/state-reuse.c
@@ -23,7 +23,7 @@
#define MULTILINE_STRING(...) #__VA_ARGS__
-static const char *program = MULTILINE_STRING(
+static const char *program_code = MULTILINE_STRING(
{%
let n = global.value || 1;
@@ -44,17 +44,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;
@@ -71,11 +71,8 @@ int main(int argc, char **argv)
for (int i = 0; i < 5; i++) {
printf("Iteration %d: ", i + 1);
- /* take additional reference to progfunc to avoid freeing it after execution */
- ucv_get(&progfunc->header);
-
/* execute program function */
- int return_code = uc_vm_execute(&vm, progfunc, NULL);
+ int return_code = uc_vm_execute(&vm, program, NULL);
/* handle return status */
if (return_code == ERROR_COMPILE || return_code == ERROR_RUNTIME) {
@@ -89,7 +86,7 @@ int main(int argc, char **argv)
}
/* release program function */
- ucv_put(&progfunc->header);
+ uc_program_put(program);
/* free VM context */
uc_vm_free(&vm);