aboutsummaryrefslogtreecommitdiffstats
path: root/core/module-jit.c
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-18 17:45:16 +0100
committereunhhu <[email protected]>2026-10-18 17:45:16 +0100
commitd5f0cac74721863a91b0a799256b62c0b7b2a3c1 (patch)
tree4c97847d2accad5bbc66b947222b4fb242eeee8a /core/module-jit.c
parentd8e297452d8e0896d4733e09b70fdc3e6ce08a55 (diff)
downloadpure-d5f0cac74721863a91b0a799256b62c0b7b2a3c1.tar.gz
pure-d5f0cac74721863a91b0a799256b62c0b7b2a3c1.zip
Module executor: a kept list's lists through steps of their own (027's stage 3): the load gives ITEM_GET and ITEM_SET of a kept list's list field, and LIST_APPEND, LIST_INSERT and APPEND_IN of a kept list whose record holds lists, numbers past the module's (OP_KEPT_*, after verifying and planning: no module holds them, the JIT leaves their blocks to the executor), so the instructions' own steps are as before stage 3; the list module holds a list field's value as bytes (PURE_CELL_LIST only in images' headers and layouts) and text_field is a text's alone again: the stage 3 commit had cost BFS 1.4% of its instructions with batches and 1.7% without (its millions of appends asking each field twice), the five works now within 0.04% of before it
Diffstat (limited to 'core/module-jit.c')
-rw-r--r--core/module-jit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/core/module-jit.c b/core/module-jit.c
index ae0f24c..328a69f 100644
--- a/core/module-jit.c
+++ b/core/module-jit.c
@@ -5763,7 +5763,7 @@ static bool worth(const PureModule *m, PureBlock block) {
int input = tier_input(m, block);
for (uint32_t pc = block.start; pc < block.start + block.length; pc = after(&m->code[pc], pc)) {
const PureOp *op = &m->code[pc];
- if (op->op == PURE_OP_CALL) return false; /* the executor's frames (module.c's run_calls) */
+ if (op->op == PURE_OP_CALL || op->op >= PURE_OP_COUNT) return false; /* the executor's frames, a kept list's steps */
if ((op->op == PURE_OP_LOCAL_LOAD || op->op == PURE_OP_LOCAL_STORE) && (op->arg >> 8 & 0xFF) == 4) return false; /* a list */
if (op->op == PURE_OP_EACH || op->op == PURE_OP_LOOP) {
loops = true;