aboutsummaryrefslogtreecommitdiffstats
path: root/core/module.h
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-10-05 07:32:17 +0100
committereunhhu <[email protected]>2026-10-05 07:38:00 +0100
commit75b9c1c1e936e2b7c55275139897e1c78d7939c1 (patch)
tree63f4a2c15a9ca651b9ce7f961683692626e551e0 /core/module.h
parent71f1de8416a01ce6305ec9c5ed29895f4344886b (diff)
downloadpure-75b9c1c1e936e2b7c55275139897e1c78d7939c1.tar.gz
pure-75b9c1c1e936e2b7c55275139897e1c78d7939c1.zip
Run a block through a frame and step, and compile blocks to AArch64 that call the same steps (021)
- run() keeps a block's operand stack and open loops in a Frame; step() runs one instruction (branches and loops too, one dispatch), and enter_each, enter_loop, leave_loop and iterate are their own functions. The executor is the same machine code, 7% fewer instructions. - The verifier records each instruction's stack height (from its block's start), so compiled code knows each slot's place. - module-jit.c (AArch64 Linux; elsewhere, or PURE_JIT=0, none): a module's handlers', views' and folds' blocks compiled when it loads. Branches and loops are branches; every other instruction calls the executor's own step, so both run the same meaning. A loop that is not opened lands where its iteration would have ended; an empty loop iterates in place. - test-module recompiles a module whose code a test changes after load. - A search (100,000 nodes, 1,000,000 edges, core only) is 150 ms compiled, against 122 ms executed: a call of step for every instruction costs more than the executor's switch; the hot instructions are written as code next.
Diffstat (limited to 'core/module.h')
-rw-r--r--core/module.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/core/module.h b/core/module.h
index 9562358..9b425b2 100644
--- a/core/module.h
+++ b/core/module.h
@@ -255,6 +255,8 @@ typedef struct {
* (numbers by value, texts by bytes), each key once, and keys do not change. */
uint8_t state_key[PURE_MODULE_STATES];
bool state_indexed[PURE_MODULE_STATES]; /* list: an index state refers to it (set at load) */
+ uint8_t *height; /* the operand stack's height at each instruction, from its block's start (the verifier's) */
+ struct PureJit *jit; /* its blocks compiled (module-jit.c, docs/design/021), or NULL */
PureInputShape input[PURE_MODULE_INPUTS];
PureField field[PURE_MODULE_FIELDS];
PureValue initial[PURE_MODULE_STATES];