summaryrefslogtreecommitdiff
path: root/filter/f-inst.h
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2022-03-09 02:32:29 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2022-06-27 21:13:32 +0200
commita2527ee53d9d8fe7a1c29b56f8450b9ef1f9c7bc (patch)
treea4dbac6cea35ef3c675c9a12b37dc67719b1b5ac /filter/f-inst.h
parentf31f4e6eef1762a4b9bf54a274f1ba9e9e161802 (diff)
Filter: Improve handling of stack frames in filter bytecode
When f_line is done, we have to pop the stack frame. The old code just removed nominal number of args/vars. Change it to use stored ventry value modified by number of returned values. This allows to allocate variables on a stack frame during execution of f_lines instead of just at start. But we need to know the number of returned values for a f_line. It is 1 for term, 0 for cmd. Store that to f_line during linearization.
Diffstat (limited to 'filter/f-inst.h')
-rw-r--r--filter/f-inst.h7
1 files changed, 4 insertions, 3 deletions
diff --git a/filter/f-inst.h b/filter/f-inst.h
index 58563c79..e35f71c6 100644
--- a/filter/f-inst.h
+++ b/filter/f-inst.h
@@ -46,14 +46,15 @@ struct f_line {
uint len; /* Line length */
u8 args; /* Function: Args required */
u8 vars;
+ u8 results; /* Results left on stack: cmd -> 0, term -> 1 */
struct f_arg *arg_list;
struct f_line_item items[0]; /* The items themselves */
};
/* Convert the f_inst infix tree to the f_line structures */
-struct f_line *f_linearize_concat(const struct f_inst * const inst[], uint count);
-static inline struct f_line *f_linearize(const struct f_inst *root)
-{ return f_linearize_concat(&root, 1); }
+struct f_line *f_linearize_concat(const struct f_inst * const inst[], uint count, uint results);
+static inline struct f_line *f_linearize(const struct f_inst *root, uint results)
+{ return f_linearize_concat(&root, 1, results); }
void f_dump_line(const struct f_line *, uint indent);