diff options
author | Alice Frosi <afrosi@redhat.com> | 2023-02-16 13:48:40 +0100 |
---|---|---|
committer | Alice Frosi <afrosi@redhat.com> | 2023-02-16 14:07:12 +0100 |
commit | 3b82d1514d30db14823849a978d7fab5989f9762 (patch) | |
tree | 51cd4e655b4a0e8aa3755c54b6ceb23c15c5baa8 | |
parent | 9e1bf7183af59307c2321b731c5b9f725e94eae1 (diff) | |
download | seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar.gz seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar.bz2 seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar.lz seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar.xz seitan-3b82d1514d30db14823849a978d7fab5989f9762.tar.zst seitan-3b82d1514d30db14823849a978d7fab5989f9762.zip |
actions: add reference to a_return
The action return can return either a constant value or a reference to a
value.
Signed-off-by: Alice Frosi <afrosi@redhat.com>
-rw-r--r-- | actions.c | 10 | ||||
-rw-r--r-- | gluten.h | 11 |
2 files changed, 19 insertions, 2 deletions
@@ -198,7 +198,15 @@ int do_actions(struct action actions[], unsigned int n_actions, int pid, resp.id = id; resp.flags = 0; resp.error = 0; - resp.val = actions[i].ret.value; + if (actions[i].ret.type == IMMEDIATE) { + resp.val = actions[i].ret.value; + } else if (actions[i].ret.value_p != NULL) { + resp.val = *(actions[i].ret.value_p); + } else { + fprintf(stderr, "empty reference for the return value"); + return -1; + } + if (send_target(&resp, notifyfd) == -1) return -1; break; @@ -52,6 +52,11 @@ enum action_type { A_RETURN, }; +enum value_type { + IMMEDIATE, + REFERENCE, +}; + struct act_call { long nr; void *args[6]; @@ -67,7 +72,11 @@ struct act_continue { }; struct act_return { - int64_t value; + enum value_type type; + union { + int64_t value; + int64_t *value_p; + }; }; struct act_inject { |