@llui/compiler 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80,40 +80,25 @@ function tryInjectDirty(node, fieldBits, f, fieldBitsHi = new Map()) {
80
80
  const topField = path.split('.')[0];
81
81
  topLevelBitsHi.set(topField, (topLevelBitsHi.get(topField) ?? 0) | bit);
82
82
  }
83
- // Structural mask — used by both __update and __handlers
83
+ // Structural mask — used by __handlers.
84
84
  const structuralMask = computeStructuralMask(configArg, fieldBits);
85
- const updateBody = buildUpdateBody(f, structuralMask);
86
- // `dHi` is the high-word dirty mask, appended as the trailing
87
- // positional arg so stale 5-param compiled bundles continue to gate
88
- // correctly: the runtime calls `__update(s, d, b, bl, p, dHi)`,
89
- // old bundles' 5-param arrow ignores the extra arg (for ≤31-prefix
90
- // components dHi is always 0 anyway). New bundles use it for
91
- // precise two-word Phase 1 gating.
92
- const updateFn = f.createArrowFunction(undefined, undefined, [
93
- f.createParameterDeclaration(undefined, undefined, 's'),
94
- f.createParameterDeclaration(undefined, undefined, 'd'),
95
- f.createParameterDeclaration(undefined, undefined, 'b'),
96
- f.createParameterDeclaration(undefined, undefined, 'bl'),
97
- f.createParameterDeclaration(undefined, undefined, 'p'),
98
- f.createParameterDeclaration(undefined, undefined, 'dHi', undefined, undefined, f.createNumericLiteral(0)),
99
- ], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), updateBody);
100
- const updateProp = f.createPropertyAssignment('__update', updateFn);
85
+ // v0.4 size-cut (Tier 2.4): the `__update` fast-path emission was
86
+ // removed. Empirically (see benchmarks/bundle-baseline.json + the
87
+ // strategy comparison in earlier work) it provided only ~3% wall-time
88
+ // improvement on a 200-binding sparse-update workload, but cost 200-400
89
+ // bytes per compiled component plus the dispatch branch in
90
+ // processMessages. The runtime always uses genericUpdate now.
101
91
  // __handlers: per-message-type specialized update functions.
102
92
  // Analyzes the update() switch/case and generates direct handlers
103
93
  // that bypass the generic Phase 1/2 pipeline for single-message updates.
94
+ // Tier 5 (drop __handlers) was attempted and REVERTED — see
95
+ // benchmarks/bundle-baseline.json#/abandoned. The 1.4 kB savings cost
96
+ // 23-89% perf on jfb's swap/remove/update/select.
104
97
  const handlersProp = tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMask, f);
105
- // Both `__update` and `__handlers` carry two-word gates: `__update`'s
106
- // Phase 1 block loop uses `(mask & d) | (maskHi & dHi)`, and
107
- // `__handlers` passes `caseDirtyHi` to `_handleMsg` which gates blocks
108
- // against both words. `dHi` defaults to 0 so any stale 5-arg call site
109
- // still works. `__dirty` is no longer emitted — `__prefixes` (below)
110
- // is strictly more precise, and the runtime throws on hand-authored
111
- // `__dirty`. `__maskLegend` survives because the agent layer uses it
112
- // to decode runtime dirty masks back to top-level field names.
113
98
  // `__maskLegend` is emitted by `maskLegendModule` via the registry
114
99
  // bridge (v2c/decomp-9); the umbrella's `applyRegistryEmissions` step
115
100
  // splices it into the same config-arg literal we return here.
116
- const extraProps = [updateProp];
101
+ const extraProps = [];
117
102
  if (handlersProp)
118
103
  extraProps.push(handlersProp);
119
104
  // __prefixes: opt-in path-keyed reactivity (see
@@ -196,7 +181,6 @@ function tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMas
196
181
  if (!stateParam || !msgParam || !ts.isIdentifier(stateParam) || !ts.isIdentifier(msgParam))
197
182
  return null;
198
183
  const stateName = stateParam.text;
199
- const _msgName = msgParam.text;
200
184
  // Analyze each case clause
201
185
  const handlers = [];
202
186
  for (const clause of switchStmt.caseBlock.clauses) {
@@ -269,7 +253,7 @@ function tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMas
269
253
  }
270
254
  }
271
255
  // Detect array operation pattern for structural block optimization
272
- const arrayOp = detectArrayOp(clause, stateName, modifiedFields, structuralMask, caseDirty);
256
+ const arrayOp = detectArrayOp(clause, modifiedFields, structuralMask, caseDirty);
273
257
  const handler = buildCaseHandler(f, caseDirty, caseDirtyHi, arrayOp);
274
258
  handlers.push(f.createPropertyAssignment(f.createStringLiteral(msgType), handler));
275
259
  }
@@ -284,7 +268,7 @@ function tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMas
284
268
  * - 'mutate': array created via `.slice()` then mutated in place (same keys)
285
269
  * - 'general': unknown pattern, use generic reconcile
286
270
  */
287
- function detectArrayOp(clause, stateName, modifiedFields, _structuralMask, _caseDirty) {
271
+ function detectArrayOp(clause, modifiedFields, _structuralMask, _caseDirty) {
288
272
  // No fields modified → no Phase 1 needed (no bindings can care if no
289
273
  // state field changed). Safe to return 'none' here because it's a
290
274
  // tautology: every binding mask ANDed with zero is zero.
@@ -372,7 +356,7 @@ function detectArrayOp(clause, stateName, modifiedFields, _structuralMask, _case
372
356
  // This catches: `const rows = state.rows.slice(); rows[i] = ...; return { ...state, rows }`
373
357
  if (ts.isShorthandPropertyAssignment(prop)) {
374
358
  const varName = prop.name.text;
375
- if (hasSliceAssignment(clause, stateName, varName)) {
359
+ if (hasSliceAssignment(clause, varName)) {
376
360
  // Check for strided for-loop: for (let i = 0; i < arr.length; i += STRIDE)
377
361
  const stride = detectStrideLoop(clause, varName);
378
362
  if (stride > 1)
@@ -430,7 +414,7 @@ function detectStrideLoop(clause, _arrName) {
430
414
  }
431
415
  return 0;
432
416
  }
433
- function hasSliceAssignment(clause, stateName, varName) {
417
+ function hasSliceAssignment(clause, varName) {
434
418
  function walk(node) {
435
419
  // Look for: const varName = stateName.field.slice()
436
420
  if (ts.isVariableDeclaration(node) &&
@@ -606,98 +590,6 @@ function computeStructuralMask(configArg, fieldBits) {
606
590
  walk(viewProp.initializer);
607
591
  return foundStructural ? mask || 0xffffffff | 0 : 0;
608
592
  }
609
- /**
610
- * Build the __update function body:
611
- * {
612
- * // Phase 1 — structural reconciliation (gated by structuralMask)
613
- * if (d & structuralMask) {
614
- * for (let i = 0; i < bl.length; i++) {
615
- * const bk = bl[i]
616
- * if (!bk || (bk.mask & d) === 0) continue
617
- * bk.reconcile(s, d)
618
- * }
619
- * // Compact dead bindings
620
- * if (b.length > p || (p > 0 && b[0].dead)) {
621
- * let w = 0
622
- * for (let r = 0; r < b.length; r++) { if (!b[r].dead) b[w++] = b[r] }
623
- * b.length = w
624
- * p = Math.min(w, p)
625
- * }
626
- * }
627
- * // Phase 2 — binding updates
628
- * if (d !== 0) {
629
- * for (let i = 0; i < p; i++) {
630
- * const bn = b[i]
631
- * if (bn.dead || (bn.mask & d) === 0) continue
632
- * const v = bn.accessor(s)
633
- * const l = bn.lastValue
634
- * if (v === l || (v !== v && l !== l)) continue
635
- * bn.lastValue = v
636
- * __runPhase2(s, d, b, p)
637
- * }
638
- * }
639
- * }
640
- */
641
- function buildUpdateBody(f, structuralMask) {
642
- const stmts = [];
643
- // Phase 1: structural block reconciliation, gated by aggregate mask
644
- if (structuralMask !== 0) {
645
- const phase1Stmts = [];
646
- // for (let i = 0; i < bl.length; i++) {
647
- // const bk = bl[i];
648
- // if (!bk || !((bk.mask & d) | (bk.maskHi & dHi))) continue;
649
- // bk.reconcile(s, d, dHi)
650
- // }
651
- // Two-word gate matches the runtime's `genericUpdate`: bits 0..30
652
- // in `d`, bits 31..61 in `dHi`. For ≤31-prefix components both
653
- // `bk.maskHi` and `dHi` are 0, so V8's inline cache collapses the
654
- // OR back to the single-word check. >31-prefix components use the
655
- // high word for precise gating.
656
- //
657
- // Re-read bl.length each iteration and null-check bk — a branch's
658
- // reconcile may dispose the old scope, whose disposers splice child
659
- // structural blocks out of this shared array mid-iteration.
660
- const blockLoop = f.createForStatement(f.createVariableDeclarationList([f.createVariableDeclaration('i', undefined, undefined, f.createNumericLiteral(0))], ts.NodeFlags.Let), f.createBinaryExpression(f.createIdentifier('i'), ts.SyntaxKind.LessThanToken, f.createPropertyAccessExpression(f.createIdentifier('bl'), 'length')), f.createPostfixUnaryExpression(f.createIdentifier('i'), ts.SyntaxKind.PlusPlusToken), f.createBlock([
661
- f.createVariableStatement(undefined, f.createVariableDeclarationList([
662
- f.createVariableDeclaration('bk', undefined, undefined, f.createElementAccessExpression(f.createIdentifier('bl'), f.createIdentifier('i'))),
663
- ], ts.NodeFlags.Const)),
664
- f.createIfStatement(f.createBinaryExpression(f.createPrefixUnaryExpression(ts.SyntaxKind.ExclamationToken, f.createIdentifier('bk')), ts.SyntaxKind.BarBarToken, f.createPrefixUnaryExpression(ts.SyntaxKind.ExclamationToken, f.createParenthesizedExpression(f.createBinaryExpression(f.createParenthesizedExpression(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier('bk'), 'mask'), ts.SyntaxKind.AmpersandToken, f.createIdentifier('d'))), ts.SyntaxKind.BarToken, f.createParenthesizedExpression(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier('bk'), 'maskHi'), ts.SyntaxKind.AmpersandToken, f.createIdentifier('dHi'))))))), f.createContinueStatement()),
665
- f.createExpressionStatement(f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier('bk'), 'reconcile'), undefined, [f.createIdentifier('s'), f.createIdentifier('d'), f.createIdentifier('dHi')])),
666
- ], true));
667
- phase1Stmts.push(blockLoop);
668
- // Compaction: if (b.length > p || (p > 0 && b[0].dead)) { ... }
669
- const compactBody = f.createBlock([
670
- // let w = 0
671
- f.createVariableStatement(undefined, f.createVariableDeclarationList([f.createVariableDeclaration('w', undefined, undefined, f.createNumericLiteral(0))], ts.NodeFlags.Let)),
672
- // for (let r = 0; r < b.length; r++) { if (!b[r].dead) b[w++] = b[r] }
673
- f.createForStatement(f.createVariableDeclarationList([f.createVariableDeclaration('r', undefined, undefined, f.createNumericLiteral(0))], ts.NodeFlags.Let), f.createBinaryExpression(f.createIdentifier('r'), ts.SyntaxKind.LessThanToken, f.createPropertyAccessExpression(f.createIdentifier('b'), 'length')), f.createPostfixUnaryExpression(f.createIdentifier('r'), ts.SyntaxKind.PlusPlusToken), f.createBlock([
674
- f.createIfStatement(f.createPrefixUnaryExpression(ts.SyntaxKind.ExclamationToken, f.createPropertyAccessExpression(f.createElementAccessExpression(f.createIdentifier('b'), f.createIdentifier('r')), 'dead')), f.createExpressionStatement(f.createBinaryExpression(f.createElementAccessExpression(f.createIdentifier('b'), f.createPostfixUnaryExpression(f.createIdentifier('w'), ts.SyntaxKind.PlusPlusToken)), ts.SyntaxKind.EqualsToken, f.createElementAccessExpression(f.createIdentifier('b'), f.createIdentifier('r'))))),
675
- ], true)),
676
- // b.length = w
677
- f.createExpressionStatement(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier('b'), 'length'), ts.SyntaxKind.EqualsToken, f.createIdentifier('w'))),
678
- // p = Math.min(w, p)
679
- f.createExpressionStatement(f.createBinaryExpression(f.createIdentifier('p'), ts.SyntaxKind.EqualsToken, f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier('Math'), 'min'), undefined, [f.createIdentifier('w'), f.createIdentifier('p')]))),
680
- ], true);
681
- const compactCondition = f.createBinaryExpression(f.createBinaryExpression(f.createPropertyAccessExpression(f.createIdentifier('b'), 'length'), ts.SyntaxKind.GreaterThanToken, f.createIdentifier('p')), ts.SyntaxKind.BarBarToken, f.createParenthesizedExpression(f.createBinaryExpression(f.createBinaryExpression(f.createIdentifier('p'), ts.SyntaxKind.GreaterThanToken, f.createNumericLiteral(0)), ts.SyntaxKind.AmpersandAmpersandToken, f.createPropertyAccessExpression(f.createElementAccessExpression(f.createIdentifier('b'), f.createNumericLiteral(0)), 'dead'))));
682
- phase1Stmts.push(f.createIfStatement(compactCondition, compactBody));
683
- // Wrap Phase 1 in mask gate
684
- if (structuralMask !== (0xffffffff | 0)) {
685
- stmts.push(f.createIfStatement(f.createBinaryExpression(f.createParenthesizedExpression(f.createBinaryExpression(f.createIdentifier('d'), ts.SyntaxKind.AmpersandToken, createMaskLiteral(f, structuralMask))), ts.SyntaxKind.ExclamationEqualsEqualsToken, f.createNumericLiteral(0)), f.createBlock(phase1Stmts, true)));
686
- }
687
- else {
688
- stmts.push(...phase1Stmts);
689
- }
690
- }
691
- // Phase 2: delegate to shared runtime — __runPhase2(s, d, dHi, b, p)
692
- stmts.push(f.createExpressionStatement(f.createCallExpression(f.createIdentifier('__runPhase2'), undefined, [
693
- f.createIdentifier('s'),
694
- f.createIdentifier('d'),
695
- f.createIdentifier('dHi'),
696
- f.createIdentifier('b'),
697
- f.createIdentifier('p'),
698
- ])));
699
- return f.createBlock(stmts, true);
700
- }
701
593
  /**
702
594
  * Build the `__prefixes` property assignment from path → bit maps.
703
595
  *
@@ -1 +1 @@
1
- {"version":3,"file":"core-synthesis.js","sourceRoot":"","sources":["../../src/modules/core-synthesis.ts"],"names":[],"mappings":"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","sourcesContent":["// `core-synthesis` — owns the co-emitted core trio:\n// - `__update` — Phase 1/2 dispatcher; reads `structuralMask`\n// - `__handlers` — per-message-type specialized handlers\n// - `__prefixes` — array of path-keyed reference-stable closures\n//\n// The three are NOT decomposable into separate modules (per v2c §7.9.2\n// design decision (a) vs (b)): they share `topLevelBits` /\n// `structuralMask` / `fieldBits` intermediates, and `__prefixes`\n// ordering is bit-position-keyed (the array index *is* the bit position\n// used by every binding's mask). Producing them in three independent\n// emit passes would either duplicate the analysis or require a shared\n// scratchpad slot — both lose vs the function's existing single pass.\n//\n// So this module owns the entire synthesis: `tryInjectDirty` plus its\n// ~600 lines of supporting helpers (`tryBuildHandlers`,\n// `buildCaseHandler`, `buildUpdateBody`, `buildPrefixesProp`,\n// `computeStructuralMask`, `buildAccess`, plus the case-analysis\n// helpers `detectArrayOp`, `findReturnArray`, `detectStrideLoop`,\n// `hasSliceAssignment`, `analyzeModifiedFields`). Moved verbatim from\n// transform.ts in v2c/decomp-21.\n//\n// Side-effect: the inline call sets `usesApplyBinding = true` when\n// the rewrite fires (drives `__runPhase2` + `__handleMsg` imports in\n// `cleanupImports`). The module surfaces this via `CORE_SYNTHESIS_SLOT`\n// for the umbrella to read after `registry.run`.\n\nimport ts from 'typescript'\nimport type { CompilerModule } from '../module.js'\nimport { computeAccessorMask, createMaskLiteral, isComponentCall } from '../transform.js'\n\nexport interface CoreSynthesisModuleOptions {\n fieldBits: Map<string, number>\n fieldBitsHi: Map<string, number>\n /** Component() call detection requires the @llui/dom import binding\n * to disambiguate from user-local `component` identifiers. */\n lluiImport: ts.ImportDeclaration\n}\n\nexport interface CoreSynthesisSlot {\n /** True when at least one component() call got the __update/__handlers/__prefixes\n * trio injected — drives `cleanupImports`'s decision about `__runPhase2`\n * + `__handleMsg` runtime imports. */\n usesApplyBinding: boolean\n}\n\nexport const CORE_SYNTHESIS_SLOT = 'core-synthesis:state'\n\nexport function coreSynthesisModule(opts: CoreSynthesisModuleOptions): CompilerModule {\n const { fieldBits, fieldBitsHi, lluiImport } = opts\n return {\n name: 'core-synthesis',\n compilerVersion: '^0.3.0',\n diagnostics: [],\n visitors: {},\n\n transformCallEnter(ctx, node) {\n if (!isComponentCall(node, lluiImport)) return null\n const rewritten = tryInjectDirty(node, fieldBits, ctx.factory, fieldBitsHi)\n if (!rewritten) return null\n const slot = ctx.analysis.perModule.get(CORE_SYNTHESIS_SLOT) as CoreSynthesisSlot | undefined\n if (slot) slot.usesApplyBinding = true\n else\n ctx.analysis.perModule.set(CORE_SYNTHESIS_SLOT, {\n usesApplyBinding: true,\n } as CoreSynthesisSlot)\n return rewritten\n },\n }\n}\n\n// ─── Synthesis implementation (moved verbatim from transform.ts) ────\n\nfunction tryInjectDirty(\n node: ts.CallExpression,\n fieldBits: Map<string, number>,\n f: ts.NodeFactory,\n fieldBitsHi: Map<string, number> = new Map(),\n): ts.CallExpression | null {\n if (fieldBits.size === 0 && fieldBitsHi.size === 0) return null\n const configArg = node.arguments[0]\n if (!configArg || !ts.isObjectLiteralExpression(configArg)) return null\n\n // Check if __dirty already exists\n for (const prop of configArg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === '__dirty'\n ) {\n return null\n }\n }\n\n // Top-level field → aggregated bit mask. Sub-paths under one field\n // (`route.page`, `route.data`) collapse into a single entry so\n // `tryBuildHandlers` can reason per-field. Positions 0..30 live here;\n // 31..61 in the parallel high-word map below. `__maskLegend` itself\n // is now owned by `maskLegendModule` (v2c/decomp-9).\n const topLevelBits = new Map<string, number>()\n for (const [path, bit] of fieldBits) {\n const topField = path.split('.')[0]!\n topLevelBits.set(topField, (topLevelBits.get(topField) ?? 0) | bit)\n }\n const topLevelBitsHi = new Map<string, number>()\n for (const [path, bit] of fieldBitsHi) {\n const topField = path.split('.')[0]!\n topLevelBitsHi.set(topField, (topLevelBitsHi.get(topField) ?? 0) | bit)\n }\n\n // Structural mask — used by both __update and __handlers\n const structuralMask = computeStructuralMask(configArg, fieldBits)\n\n const updateBody = buildUpdateBody(f, structuralMask)\n // `dHi` is the high-word dirty mask, appended as the trailing\n // positional arg so stale 5-param compiled bundles continue to gate\n // correctly: the runtime calls `__update(s, d, b, bl, p, dHi)`,\n // old bundles' 5-param arrow ignores the extra arg (for ≤31-prefix\n // components dHi is always 0 anyway). New bundles use it for\n // precise two-word Phase 1 gating.\n const updateFn = f.createArrowFunction(\n undefined,\n undefined,\n [\n f.createParameterDeclaration(undefined, undefined, 's'),\n f.createParameterDeclaration(undefined, undefined, 'd'),\n f.createParameterDeclaration(undefined, undefined, 'b'),\n f.createParameterDeclaration(undefined, undefined, 'bl'),\n f.createParameterDeclaration(undefined, undefined, 'p'),\n f.createParameterDeclaration(\n undefined,\n undefined,\n 'dHi',\n undefined,\n undefined,\n f.createNumericLiteral(0),\n ),\n ],\n undefined,\n f.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n updateBody,\n )\n const updateProp = f.createPropertyAssignment('__update', updateFn)\n\n // __handlers: per-message-type specialized update functions.\n // Analyzes the update() switch/case and generates direct handlers\n // that bypass the generic Phase 1/2 pipeline for single-message updates.\n const handlersProp = tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMask, f)\n\n // Both `__update` and `__handlers` carry two-word gates: `__update`'s\n // Phase 1 block loop uses `(mask & d) | (maskHi & dHi)`, and\n // `__handlers` passes `caseDirtyHi` to `_handleMsg` which gates blocks\n // against both words. `dHi` defaults to 0 so any stale 5-arg call site\n // still works. `__dirty` is no longer emitted — `__prefixes` (below)\n // is strictly more precise, and the runtime throws on hand-authored\n // `__dirty`. `__maskLegend` survives because the agent layer uses it\n // to decode runtime dirty masks back to top-level field names.\n // `__maskLegend` is emitted by `maskLegendModule` via the registry\n // bridge (v2c/decomp-9); the umbrella's `applyRegistryEmissions` step\n // splices it into the same config-arg literal we return here.\n const extraProps: ts.ObjectLiteralElementLike[] = [updateProp]\n if (handlersProp) extraProps.push(handlersProp)\n\n // __prefixes: opt-in path-keyed reactivity (see\n // docs/proposals/unified-composition-model.md). One closure per\n // distinct path that an accessor reads, hoisted into a stable array;\n // the array position IS the bit position used by the path's bindings.\n // The runtime prefers __prefixes when present and computes the\n // combinedDirty mask by reference-comparing `prefix(prev)` vs\n // `prefix(next)` for each entry — strictly more precise than the\n // top-level-conflated __dirty (which always co-fires bindings sharing\n // a top-level field even when only one sub-path actually mutated).\n //\n // Emit `__prefixes` whenever any reactive paths are present. For\n // components with ≤31 paths, the runtime's\n // `computeDirtyFromPrefixes` returns a single `number`; for\n // 32..61-path components it returns a `[lo, hi]` tuple that the\n // runtime fans out into `combinedDirty` + `combinedDirtyHi`. The\n // binding-level mask gating is still single-word at the compiler\n // emit layer today, so high-position bindings still re-evaluate\n // every cycle — but the dirty computation itself is now precise,\n // which lets memo()'d aggregates short-circuit correctly.\n const prefixesProp = buildPrefixesProp(fieldBits, fieldBitsHi, f)\n if (prefixesProp) extraProps.push(prefixesProp)\n\n const newConfig = f.createObjectLiteralExpression([...configArg.properties, ...extraProps], true)\n\n // `updateCallExpression` (not `createCallExpression`) so the new\n // node inherits `node.pos` / `node.end` from the original. Phase 2b\n // downstream consumers (componentMetaModule, etc.) read pos via\n // `getStart(sf)` for line info; a synthetic node (pos=-1) would\n // collapse every `component()` call's `__componentMeta.line` to 0.\n return f.updateCallExpression(node, node.expression, node.typeArguments, [\n newConfig,\n ...node.arguments.slice(1),\n ])\n}\n\n/**\n * Analyze update() switch/case and generate per-message-type handlers.\n *\n * Each handler receives (inst, msg) and returns [newState, effects].\n * The handler calls update() to get the new state, then directly invokes\n * the appropriate runtime primitives (reconcileItems, __directUpdate, etc.)\n * instead of going through the generic Phase 1/2 pipeline.\n *\n * Conservative: only generates handlers for cases where the field\n * modifications are statically determinable. Complex cases are skipped.\n */\nfunction tryBuildHandlers(\n configArg: ts.ObjectLiteralExpression,\n topLevelBits: Map<string, number>,\n topLevelBitsHi: Map<string, number>,\n structuralMask: number,\n f: ts.NodeFactory,\n): ts.PropertyAssignment | null {\n if (topLevelBits.size === 0 && topLevelBitsHi.size === 0) return null\n\n // Find the update function in the component config\n let updateFn: ts.ArrowFunction | ts.FunctionExpression | null = null\n for (const prop of configArg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === 'update'\n ) {\n if (ts.isArrowFunction(prop.initializer) || ts.isFunctionExpression(prop.initializer)) {\n updateFn = prop.initializer\n }\n break\n }\n }\n if (!updateFn) return null\n\n // Find the switch statement in the update body\n const body = ts.isBlock(updateFn.body) ? updateFn.body : null\n if (!body) return null\n\n let switchStmt: ts.SwitchStatement | null = null\n for (const stmt of body.statements) {\n if (ts.isSwitchStatement(stmt)) {\n switchStmt = stmt\n break\n }\n }\n if (!switchStmt) return null\n\n // Check the switch discriminant is msg.type pattern\n const stateParam = updateFn.parameters[0]?.name\n const msgParam = updateFn.parameters[1]?.name\n if (!stateParam || !msgParam || !ts.isIdentifier(stateParam) || !ts.isIdentifier(msgParam))\n return null\n const stateName = stateParam.text\n const _msgName = msgParam.text\n\n // Analyze each case clause\n const handlers: ts.PropertyAssignment[] = []\n\n for (const clause of switchStmt.caseBlock.clauses) {\n if (!ts.isCaseClause(clause)) continue\n\n // Extract the case label — must be a string literal like 'select'\n if (!ts.isStringLiteral(clause.expression)) continue\n const msgType = clause.expression.text\n\n // Collect ALL return [newState, effects] statements recursively from the\n // case body. Multiple returns (from if/else branches) must all be analyzed\n // so the handler's dirty mask covers every possible modified field.\n const returnExprs: ts.ArrayLiteralExpression[] = []\n const collectReturns = (node: ts.Node): void => {\n if (\n ts.isReturnStatement(node) &&\n node.expression &&\n ts.isArrayLiteralExpression(node.expression) &&\n node.expression.elements.length >= 2\n ) {\n returnExprs.push(node.expression)\n return\n }\n // Don't descend into nested functions — their returns are unrelated.\n if (\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isArrowFunction(node) ||\n ts.isMethodDeclaration(node)\n ) {\n return\n }\n ts.forEachChild(node, collectReturns)\n }\n for (const stmt of clause.statements) {\n collectReturns(stmt)\n }\n if (returnExprs.length === 0) continue\n\n // Union modified fields across all return paths.\n const allModified = new Set<string>()\n let bailOut = false\n for (const returnExpr of returnExprs) {\n const stateExpr = returnExpr.elements[0]!\n const fields = analyzeModifiedFields(stateExpr, stateName, topLevelBits, topLevelBitsHi)\n if (!fields) {\n bailOut = true\n break\n }\n for (const f of fields) allModified.add(f)\n }\n if (bailOut) continue // at least one return path was too complex\n\n const modifiedFields = Array.from(allModified)\n\n // Compute the dirty mask for this case across both words. Fields\n // tracked in `topLevelBitsHi` contribute to `caseDirtyHi`; fields\n // tracked nowhere (`undefined` lookup in both) fall back to\n // FULL_MASK in the low word — same conservative behavior as\n // before, just preserved per-word now.\n let caseDirty = 0\n let caseDirtyHi = 0\n for (const field of modifiedFields) {\n const lo = topLevelBits.get(field)\n const hi = topLevelBitsHi.get(field)\n if (lo === undefined && hi === undefined) {\n caseDirty |= 0xffffffff | 0\n } else {\n if (lo !== undefined) caseDirty |= lo\n if (hi !== undefined) caseDirtyHi |= hi\n }\n }\n\n // Detect array operation pattern for structural block optimization\n const arrayOp = detectArrayOp(clause, stateName, modifiedFields, structuralMask, caseDirty)\n\n const handler = buildCaseHandler(f, caseDirty, caseDirtyHi, arrayOp)\n handlers.push(f.createPropertyAssignment(f.createStringLiteral(msgType), handler))\n }\n\n if (handlers.length === 0) return null\n\n return f.createPropertyAssignment('__handlers', f.createObjectLiteralExpression(handlers, true))\n}\n\ntype ArrayOp =\n | 'none'\n | 'clear'\n | 'mutate'\n | 'remove'\n | 'general'\n | { type: 'strided'; stride: number } // for (i = 0; i < len; i += stride) pattern\n\n/**\n * Detect the array operation pattern in a case body.\n * - 'none': no array field modified (e.g., only `selected` changes)\n * - 'clear': array set to empty literal `[]`\n * - 'mutate': array created via `.slice()` then mutated in place (same keys)\n * - 'general': unknown pattern, use generic reconcile\n */\nfunction detectArrayOp(\n clause: ts.CaseClause,\n stateName: string,\n modifiedFields: string[],\n _structuralMask?: number,\n _caseDirty?: number,\n): ArrayOp {\n // No fields modified → no Phase 1 needed (no bindings can care if no\n // state field changed). Safe to return 'none' here because it's a\n // tautology: every binding mask ANDed with zero is zero.\n if (modifiedFields.length === 0) return 'none'\n\n // The specialized methods (`reconcileClear`, `reconcileItems`,\n // `reconcileRemove`, `reconcileChanged`) only exist on `each` blocks.\n // Non-each blocks (`show`, `branch`, `scope`) leave them undefined,\n // so a method other than 0 (general reconcile) silently no-ops on\n // those blocks at runtime. If the case modifies fields BEYOND the\n // array op (e.g. `{ ...state, open: true, name: '', tags: [] }`),\n // any show/branch block whose mask intersects the case's dirty bits\n // would be selected for reconcile but then skipped by the no-op\n // method invocation — its `when`/`on` accessor never re-evaluates,\n // and the component appears structurally inert after mount.\n //\n // Conservative correctness: only emit a non-general method when the\n // array op is the SOLE field modification. With one modified field,\n // the only blocks selected by mask gating are ones that read that\n // single field — and the optimization is well-defined for that\n // narrow case (each blocks operating on the array). Multi-field\n // cases fall through to `'general'` (method=0), so every selected\n // block runs the standard `reconcile` path. We trade a niche\n // optimization (small benefit even when applicable) for guaranteed\n // structural reconciliation across the framework's primitive set.\n //\n // Sister of show-helper-reconcile.test.ts, which fixed the same\n // class of bug on the method=-1 path. Same architectural principle:\n // the compiler can't see every block in the view, so optimizations\n // that route around `reconcile` must be ironclad. When in doubt,\n // emit method=0 and let `_handleMsg`'s per-block mask gate filter.\n //\n // Previously: if `(structuralMask & caseDirty) === 0`, return 'none'\n // on the theory that no structural block's mask could intersect this\n // case's dirty bits. That optimization was UNSAFE: `computeStructuralMask`\n // only walks the view function's lexical AST and does not descend into\n // helper function calls. A view like\n //\n // view: () => [\n // ...show({ when: s => s.mode === 'signin', render: () => [signinFormBody()] }),\n // ]\n //\n // where `signinFormBody()` is a helper that internally does\n // ...show({ when: s => s.errors.email !== undefined, ... })\n //\n // produces a `structuralMask` that covers `mode` but MISSES\n // `errors.email`. At runtime the inner show block is still registered\n // in `inst.structuralBlocks`, and it legitimately needs to reconcile\n // when `errors` changes — but the compiler was emitting `method = -1`\n // (skip blocks entirely) for cases that only touch `errors`, and the\n // error paragraphs would never mount.\n if (modifiedFields.length !== 1) return 'general'\n const onlyField = modifiedFields[0]!\n\n // Look at the return expression's array field values\n for (const stmt of clause.statements) {\n const returnExpr = findReturnArray(stmt)\n if (!returnExpr) continue\n\n const stateExpr = returnExpr.elements[0]\n if (!stateExpr || !ts.isObjectLiteralExpression(stateExpr)) continue\n\n for (const prop of stateExpr.properties) {\n const name =\n ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)\n ? prop.name.text\n : ts.isShorthandPropertyAssignment(prop)\n ? prop.name.text\n : null\n if (!name) continue\n // The optimization only applies when the array op is on the\n // single tracked field. A `field: []` on a different field\n // (one not in modifiedFields, e.g. an untracked field) would\n // still no-op safely on each blocks via the mask gate, but to\n // keep the analysis tight we require an exact match.\n if (name !== onlyField) continue\n\n // Check for empty array literal: `field: []`\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isArrayLiteralExpression(prop.initializer) &&\n prop.initializer.elements.length === 0\n ) {\n return 'clear'\n }\n\n // Check for shorthand `field` where field was assigned via `.slice()` earlier\n // This catches: `const rows = state.rows.slice(); rows[i] = ...; return { ...state, rows }`\n if (ts.isShorthandPropertyAssignment(prop)) {\n const varName = prop.name.text\n if (hasSliceAssignment(clause, stateName, varName)) {\n // Check for strided for-loop: for (let i = 0; i < arr.length; i += STRIDE)\n const stride = detectStrideLoop(clause, varName)\n if (stride > 1) return { type: 'strided', stride }\n return 'mutate'\n }\n }\n\n // Check for property assignment with filter: `field: state.field.filter(...)`\n if (ts.isPropertyAssignment(prop) && ts.isCallExpression(prop.initializer)) {\n const call = prop.initializer\n if (\n ts.isPropertyAccessExpression(call.expression) &&\n call.expression.name.text === 'filter'\n ) {\n return 'remove'\n }\n }\n }\n }\n\n return 'general'\n}\n\nfunction findReturnArray(stmt: ts.Statement): ts.ArrayLiteralExpression | null {\n if (ts.isReturnStatement(stmt) && stmt.expression && ts.isArrayLiteralExpression(stmt.expression))\n return stmt.expression\n if (ts.isBlock(stmt)) {\n for (const inner of stmt.statements) {\n const result = findReturnArray(inner)\n if (result) return result\n }\n }\n return null\n}\n\n/**\n * Detect a strided for-loop: `for (let i = 0; i < arr.length; i += STRIDE)`\n * where `arr` is the named variable. Returns the stride or 0 if not found.\n */\nfunction detectStrideLoop(clause: ts.CaseClause, _arrName: string): number {\n function walk(node: ts.Node): number {\n if (ts.isForStatement(node) && node.incrementor) {\n // Check incrementor: i += STRIDE\n const inc = node.incrementor\n if (\n ts.isBinaryExpression(inc) &&\n inc.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken &&\n ts.isNumericLiteral(inc.right)\n ) {\n const stride = parseInt(inc.right.text, 10)\n if (stride > 1) return stride\n }\n }\n return ts.forEachChild(node, walk) ?? 0\n }\n for (const stmt of clause.statements) {\n const result = walk(stmt)\n if (result > 0) return result\n }\n return 0\n}\n\nfunction hasSliceAssignment(clause: ts.CaseClause, stateName: string, varName: string): boolean {\n function walk(node: ts.Node): boolean {\n // Look for: const varName = stateName.field.slice()\n if (\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === varName &&\n node.initializer\n ) {\n const init = node.initializer\n if (\n ts.isCallExpression(init) &&\n ts.isPropertyAccessExpression(init.expression) &&\n init.expression.name.text === 'slice'\n ) {\n return true\n }\n }\n return ts.forEachChild(node, walk) ?? false\n }\n for (const stmt of clause.statements) {\n if (walk(stmt)) return true\n }\n return false\n}\n\n/**\n * Analyze which top-level state fields are modified in a return expression.\n * Returns the set of field names, or null if too complex to determine.\n */\nfunction analyzeModifiedFields(\n stateExpr: ts.Expression,\n stateName: string,\n topLevelBits: Map<string, number>,\n topLevelBitsHi: Map<string, number> = new Map(),\n): string[] | null {\n // Recognize fields tracked in EITHER the low-word or high-word map.\n // 32..61-prefix components have their overflow paths in\n // `topLevelBitsHi`; the case handler's `caseDirty` / `caseDirtyHi`\n // logic depends on us recognizing those fields here.\n const isTracked = (name: string): boolean => topLevelBits.has(name) || topLevelBitsHi.has(name)\n // Pattern: { ...state, field1: ..., field2: ... } or { field1: ..., field2: ... }\n if (ts.isObjectLiteralExpression(stateExpr)) {\n const modified: string[] = []\n for (const prop of stateExpr.properties) {\n if (ts.isSpreadAssignment(prop)) {\n // Only `...state` is safe to ignore — re-spreading state back into\n // state doesn't change any field's identity. ANY other spread\n // (e.g. `...msg.props`, `...someObj`) can overwrite arbitrary\n // top-level fields with new references, and we cannot know which\n // ones statically. Bail out so the generic Phase 2 path runs\n // `__dirty` at runtime and produces a correct mask.\n if (ts.isIdentifier(prop.expression) && prop.expression.text === stateName) {\n continue\n }\n return null\n }\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const fieldName = prop.name.text\n if (isTracked(fieldName)) {\n modified.push(fieldName)\n }\n }\n // Handle shorthand: { ...state, rows } where rows is a local variable\n if (ts.isShorthandPropertyAssignment(prop)) {\n const fieldName = prop.name.text\n if (isTracked(fieldName)) {\n modified.push(fieldName)\n }\n }\n }\n return modified.length > 0 ? modified : null\n }\n\n // Pattern: state (no change — early return)\n if (ts.isIdentifier(stateExpr) && stateExpr.text === stateName) {\n return [] // no fields modified\n }\n\n return null // too complex\n}\n\n/**\n * Build a handler function for a specific message type case.\n *\n * Generated: (inst, msg) => {\n * const [s, e] = inst.def.update(inst.state, msg)\n * inst.state = s\n * const bl = inst.structuralBlocks, b = inst.allBindings, p = b.length\n * // Phase 1: gated by caseDirty\n * for (let i = 0; i < bl.length; i++) {\n * if (bl[i].mask & caseDirty) bl[i].reconcile(s, caseDirty)\n * }\n * // Phase 2\n * __runPhase2(s, caseDirty, b, p)\n * return [s, e]\n * }\n */\n/**\n * Build a handler that delegates to __handleMsg(inst, msg, dirty, method).\n * method: 0=reconcile, 1=reconcileItems, 2=reconcileClear, 3=reconcileRemove, -1=skip blocks\n */\nfunction buildCaseHandler(\n f: ts.NodeFactory,\n caseDirty: number,\n caseDirtyHi: number,\n arrayOp: ArrayOp,\n): ts.ArrowFunction {\n const method =\n typeof arrayOp === 'object' && arrayOp.type === 'strided'\n ? 10 + arrayOp.stride // reconcileChanged with stride\n : arrayOp === 'none'\n ? -1\n : arrayOp === 'mutate'\n ? 1\n : arrayOp === 'clear'\n ? 2\n : arrayOp === 'remove'\n ? 3\n : 0 // general\n\n // (inst, msg) => __handleMsg(inst, msg, dirty, method, [dirtyHi])\n const args: ts.Expression[] = [\n f.createIdentifier('inst'),\n f.createIdentifier('msg'),\n createMaskLiteral(f, caseDirty),\n method >= 0\n ? f.createNumericLiteral(method)\n : f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(1)),\n ]\n // Emit the 5th positional arg only when the case touches a high-word\n // field. Stale runtime bundles' _handleMsg signatures ignored that\n // slot anyway; new ones (defaulted to 0) make it explicit when needed.\n if (caseDirtyHi !== 0) args.push(createMaskLiteral(f, caseDirtyHi))\n return f.createArrowFunction(\n undefined,\n undefined,\n [\n f.createParameterDeclaration(undefined, undefined, 'inst'),\n f.createParameterDeclaration(undefined, undefined, 'msg'),\n ],\n undefined,\n f.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n f.createCallExpression(f.createIdentifier('__handleMsg'), undefined, args),\n )\n}\n\n/**\n * Compute the OR of all structural block masks found in the view function.\n * Returns FULL_MASK if any structural block uses FULL_MASK or if no blocks found.\n */\nfunction computeStructuralMask(\n configArg: ts.ObjectLiteralExpression,\n fieldBits: Map<string, number>,\n): number {\n const viewProp = configArg.properties.find(\n (p) => ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === 'view',\n )\n if (!viewProp || !ts.isPropertyAssignment(viewProp)) return 0xffffffff | 0\n\n let mask = 0\n let foundStructural = false\n\n function walk(node: ts.Node): void {\n if (ts.isCallExpression(node)) {\n const name = ts.isIdentifier(node.expression) ? node.expression.text : ''\n if (['each', 'branch', 'scope', 'show'].includes(name) && node.arguments[0]) {\n foundStructural = true\n const opts = node.arguments[0]\n if (ts.isObjectLiteralExpression(opts)) {\n // Check for __mask property (already injected by tryInjectStructuralMask)\n for (const prop of opts.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === '__mask'\n ) {\n if (ts.isNumericLiteral(prop.initializer)) {\n mask |= parseInt(prop.initializer.text, 10)\n return\n }\n if (ts.isPrefixUnaryExpression(prop.initializer)) {\n // Handle negative literals like -1\n mask = 0xffffffff | 0\n return\n }\n }\n }\n // No __mask found — use driving accessor mask\n const driverProp = name === 'each' ? 'items' : name === 'branch' ? 'on' : 'when'\n for (const prop of opts.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === driverProp\n ) {\n if (\n ts.isArrowFunction(prop.initializer) ||\n ts.isFunctionExpression(prop.initializer)\n ) {\n const { mask: m } = computeAccessorMask(prop.initializer, fieldBits)\n mask |= m || 0xffffffff | 0\n }\n break\n }\n }\n }\n }\n }\n ts.forEachChild(node, walk)\n }\n\n walk(viewProp.initializer)\n return foundStructural ? mask || 0xffffffff | 0 : 0\n}\n\n/**\n * Build the __update function body:\n * {\n * // Phase 1 — structural reconciliation (gated by structuralMask)\n * if (d & structuralMask) {\n * for (let i = 0; i < bl.length; i++) {\n * const bk = bl[i]\n * if (!bk || (bk.mask & d) === 0) continue\n * bk.reconcile(s, d)\n * }\n * // Compact dead bindings\n * if (b.length > p || (p > 0 && b[0].dead)) {\n * let w = 0\n * for (let r = 0; r < b.length; r++) { if (!b[r].dead) b[w++] = b[r] }\n * b.length = w\n * p = Math.min(w, p)\n * }\n * }\n * // Phase 2 — binding updates\n * if (d !== 0) {\n * for (let i = 0; i < p; i++) {\n * const bn = b[i]\n * if (bn.dead || (bn.mask & d) === 0) continue\n * const v = bn.accessor(s)\n * const l = bn.lastValue\n * if (v === l || (v !== v && l !== l)) continue\n * bn.lastValue = v\n * __runPhase2(s, d, b, p)\n * }\n * }\n * }\n */\nfunction buildUpdateBody(f: ts.NodeFactory, structuralMask: number): ts.Block {\n const stmts: ts.Statement[] = []\n\n // Phase 1: structural block reconciliation, gated by aggregate mask\n if (structuralMask !== 0) {\n const phase1Stmts: ts.Statement[] = []\n\n // for (let i = 0; i < bl.length; i++) {\n // const bk = bl[i];\n // if (!bk || !((bk.mask & d) | (bk.maskHi & dHi))) continue;\n // bk.reconcile(s, d, dHi)\n // }\n // Two-word gate matches the runtime's `genericUpdate`: bits 0..30\n // in `d`, bits 31..61 in `dHi`. For ≤31-prefix components both\n // `bk.maskHi` and `dHi` are 0, so V8's inline cache collapses the\n // OR back to the single-word check. >31-prefix components use the\n // high word for precise gating.\n //\n // Re-read bl.length each iteration and null-check bk — a branch's\n // reconcile may dispose the old scope, whose disposers splice child\n // structural blocks out of this shared array mid-iteration.\n const blockLoop = f.createForStatement(\n f.createVariableDeclarationList(\n [f.createVariableDeclaration('i', undefined, undefined, f.createNumericLiteral(0))],\n ts.NodeFlags.Let,\n ),\n f.createBinaryExpression(\n f.createIdentifier('i'),\n ts.SyntaxKind.LessThanToken,\n f.createPropertyAccessExpression(f.createIdentifier('bl'), 'length'),\n ),\n f.createPostfixUnaryExpression(f.createIdentifier('i'), ts.SyntaxKind.PlusPlusToken),\n f.createBlock(\n [\n f.createVariableStatement(\n undefined,\n f.createVariableDeclarationList(\n [\n f.createVariableDeclaration(\n 'bk',\n undefined,\n undefined,\n f.createElementAccessExpression(\n f.createIdentifier('bl'),\n f.createIdentifier('i'),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n f.createIfStatement(\n f.createBinaryExpression(\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.ExclamationToken,\n f.createIdentifier('bk'),\n ),\n ts.SyntaxKind.BarBarToken,\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.ExclamationToken,\n f.createParenthesizedExpression(\n f.createBinaryExpression(\n f.createParenthesizedExpression(\n f.createBinaryExpression(\n f.createPropertyAccessExpression(f.createIdentifier('bk'), 'mask'),\n ts.SyntaxKind.AmpersandToken,\n f.createIdentifier('d'),\n ),\n ),\n ts.SyntaxKind.BarToken,\n f.createParenthesizedExpression(\n f.createBinaryExpression(\n f.createPropertyAccessExpression(f.createIdentifier('bk'), 'maskHi'),\n ts.SyntaxKind.AmpersandToken,\n f.createIdentifier('dHi'),\n ),\n ),\n ),\n ),\n ),\n ),\n f.createContinueStatement(),\n ),\n f.createExpressionStatement(\n f.createCallExpression(\n f.createPropertyAccessExpression(f.createIdentifier('bk'), 'reconcile'),\n undefined,\n [f.createIdentifier('s'), f.createIdentifier('d'), f.createIdentifier('dHi')],\n ),\n ),\n ],\n true,\n ),\n )\n phase1Stmts.push(blockLoop)\n\n // Compaction: if (b.length > p || (p > 0 && b[0].dead)) { ... }\n const compactBody = f.createBlock(\n [\n // let w = 0\n f.createVariableStatement(\n undefined,\n f.createVariableDeclarationList(\n [f.createVariableDeclaration('w', undefined, undefined, f.createNumericLiteral(0))],\n ts.NodeFlags.Let,\n ),\n ),\n // for (let r = 0; r < b.length; r++) { if (!b[r].dead) b[w++] = b[r] }\n f.createForStatement(\n f.createVariableDeclarationList(\n [f.createVariableDeclaration('r', undefined, undefined, f.createNumericLiteral(0))],\n ts.NodeFlags.Let,\n ),\n f.createBinaryExpression(\n f.createIdentifier('r'),\n ts.SyntaxKind.LessThanToken,\n f.createPropertyAccessExpression(f.createIdentifier('b'), 'length'),\n ),\n f.createPostfixUnaryExpression(f.createIdentifier('r'), ts.SyntaxKind.PlusPlusToken),\n f.createBlock(\n [\n f.createIfStatement(\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.ExclamationToken,\n f.createPropertyAccessExpression(\n f.createElementAccessExpression(\n f.createIdentifier('b'),\n f.createIdentifier('r'),\n ),\n 'dead',\n ),\n ),\n f.createExpressionStatement(\n f.createBinaryExpression(\n f.createElementAccessExpression(\n f.createIdentifier('b'),\n f.createPostfixUnaryExpression(\n f.createIdentifier('w'),\n ts.SyntaxKind.PlusPlusToken,\n ),\n ),\n ts.SyntaxKind.EqualsToken,\n f.createElementAccessExpression(\n f.createIdentifier('b'),\n f.createIdentifier('r'),\n ),\n ),\n ),\n ),\n ],\n true,\n ),\n ),\n // b.length = w\n f.createExpressionStatement(\n f.createBinaryExpression(\n f.createPropertyAccessExpression(f.createIdentifier('b'), 'length'),\n ts.SyntaxKind.EqualsToken,\n f.createIdentifier('w'),\n ),\n ),\n // p = Math.min(w, p)\n f.createExpressionStatement(\n f.createBinaryExpression(\n f.createIdentifier('p'),\n ts.SyntaxKind.EqualsToken,\n f.createCallExpression(\n f.createPropertyAccessExpression(f.createIdentifier('Math'), 'min'),\n undefined,\n [f.createIdentifier('w'), f.createIdentifier('p')],\n ),\n ),\n ),\n ],\n true,\n )\n\n const compactCondition = f.createBinaryExpression(\n f.createBinaryExpression(\n f.createPropertyAccessExpression(f.createIdentifier('b'), 'length'),\n ts.SyntaxKind.GreaterThanToken,\n f.createIdentifier('p'),\n ),\n ts.SyntaxKind.BarBarToken,\n f.createParenthesizedExpression(\n f.createBinaryExpression(\n f.createBinaryExpression(\n f.createIdentifier('p'),\n ts.SyntaxKind.GreaterThanToken,\n f.createNumericLiteral(0),\n ),\n ts.SyntaxKind.AmpersandAmpersandToken,\n f.createPropertyAccessExpression(\n f.createElementAccessExpression(f.createIdentifier('b'), f.createNumericLiteral(0)),\n 'dead',\n ),\n ),\n ),\n )\n phase1Stmts.push(f.createIfStatement(compactCondition, compactBody))\n\n // Wrap Phase 1 in mask gate\n if (structuralMask !== (0xffffffff | 0)) {\n stmts.push(\n f.createIfStatement(\n f.createBinaryExpression(\n f.createParenthesizedExpression(\n f.createBinaryExpression(\n f.createIdentifier('d'),\n ts.SyntaxKind.AmpersandToken,\n createMaskLiteral(f, structuralMask),\n ),\n ),\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n f.createNumericLiteral(0),\n ),\n f.createBlock(phase1Stmts, true),\n ),\n )\n } else {\n stmts.push(...phase1Stmts)\n }\n }\n\n // Phase 2: delegate to shared runtime — __runPhase2(s, d, dHi, b, p)\n stmts.push(\n f.createExpressionStatement(\n f.createCallExpression(f.createIdentifier('__runPhase2'), undefined, [\n f.createIdentifier('s'),\n f.createIdentifier('d'),\n f.createIdentifier('dHi'),\n f.createIdentifier('b'),\n f.createIdentifier('p'),\n ]),\n ),\n )\n\n return f.createBlock(stmts, true)\n}\n\n/**\n * Build the `__prefixes` property assignment from path → bit maps.\n *\n * Emits one arrow `(s) => s.<path>` per distinct path. Array index =\n * the path's bit position: positions 0..30 come from `fieldBits` (low\n * word), positions 31..61 from `fieldBitsHi` (high word). The runtime\n * walks this array and reference-compares `prefix(prev)` vs\n * `prefix(next)` per entry, fanning bits into a `(lo, hi)` pair when\n * the array length exceeds 31.\n *\n * Returns null if no paths are present.\n */\nfunction buildPrefixesProp(\n fieldBits: Map<string, number>,\n fieldBitsHi: Map<string, number>,\n f: ts.NodeFactory,\n): ts.PropertyAssignment | null {\n if (fieldBits.size === 0 && fieldBitsHi.size === 0) return null\n // Sort paths by bit value within each word. Bits are powers of two\n // inside their word (1, 2, 4, …, 1<<30), so sorting numerically gives\n // ascending bit position. FULL_MASK (-1) entries from past-61\n // overflow shouldn't drive a prefix entry — defensively skip them.\n const orderedLo = [...fieldBits.entries()]\n .filter(([, bit]) => bit > 0)\n .sort(([, a], [, b]) => a - b)\n const orderedHi = [...fieldBitsHi.entries()].sort(([, a], [, b]) => a - b)\n const buildArrow = (path: string): ts.ArrowFunction => {\n const parts = path.split('.')\n const body = buildAccess(f, 's', parts)\n return f.createArrowFunction(\n undefined,\n undefined,\n [f.createParameterDeclaration(undefined, undefined, 's')],\n undefined,\n f.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n body,\n )\n }\n const arrows = [\n ...orderedLo.map(([path]) => buildArrow(path)),\n ...orderedHi.map(([path]) => buildArrow(path)),\n ]\n return f.createPropertyAssignment('__prefixes', f.createArrayLiteralExpression(arrows, false))\n}\n\nfunction buildAccess(f: ts.NodeFactory, root: string, parts: string[]): ts.Expression {\n let expr: ts.Expression = f.createIdentifier(root)\n for (const part of parts) {\n // Use optional chaining for nested paths\n if (parts.length > 1) {\n expr = f.createPropertyAccessChain(expr, f.createToken(ts.SyntaxKind.QuestionDotToken), part)\n } else {\n expr = f.createPropertyAccessExpression(expr, part)\n }\n }\n return expr\n}\n"]}
1
+ {"version":3,"file":"core-synthesis.js","sourceRoot":"","sources":["../../src/modules/core-synthesis.ts"],"names":[],"mappings":"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","sourcesContent":["// `core-synthesis` — owns the co-emitted core trio:\n// - `__update` — Phase 1/2 dispatcher; reads `structuralMask`\n// - `__handlers` — per-message-type specialized handlers\n// - `__prefixes` — array of path-keyed reference-stable closures\n//\n// The three are NOT decomposable into separate modules (per v2c §7.9.2\n// design decision (a) vs (b)): they share `topLevelBits` /\n// `structuralMask` / `fieldBits` intermediates, and `__prefixes`\n// ordering is bit-position-keyed (the array index *is* the bit position\n// used by every binding's mask). Producing them in three independent\n// emit passes would either duplicate the analysis or require a shared\n// scratchpad slot — both lose vs the function's existing single pass.\n//\n// So this module owns the entire synthesis: `tryInjectDirty` plus its\n// ~600 lines of supporting helpers (`tryBuildHandlers`,\n// `buildCaseHandler`, `buildUpdateBody`, `buildPrefixesProp`,\n// `computeStructuralMask`, `buildAccess`, plus the case-analysis\n// helpers `detectArrayOp`, `findReturnArray`, `detectStrideLoop`,\n// `hasSliceAssignment`, `analyzeModifiedFields`). Moved verbatim from\n// transform.ts in v2c/decomp-21.\n//\n// Side-effect: the inline call sets `usesApplyBinding = true` when\n// the rewrite fires (drives `__runPhase2` + `__handleMsg` imports in\n// `cleanupImports`). The module surfaces this via `CORE_SYNTHESIS_SLOT`\n// for the umbrella to read after `registry.run`.\n\nimport ts from 'typescript'\nimport type { CompilerModule } from '../module.js'\nimport { computeAccessorMask, createMaskLiteral, isComponentCall } from '../transform.js'\n\nexport interface CoreSynthesisModuleOptions {\n fieldBits: Map<string, number>\n fieldBitsHi: Map<string, number>\n /** Component() call detection requires the @llui/dom import binding\n * to disambiguate from user-local `component` identifiers. */\n lluiImport: ts.ImportDeclaration\n}\n\nexport interface CoreSynthesisSlot {\n /** True when at least one component() call got the __update/__handlers/__prefixes\n * trio injected — drives `cleanupImports`'s decision about `__runPhase2`\n * + `__handleMsg` runtime imports. */\n usesApplyBinding: boolean\n}\n\nexport const CORE_SYNTHESIS_SLOT = 'core-synthesis:state'\n\nexport function coreSynthesisModule(opts: CoreSynthesisModuleOptions): CompilerModule {\n const { fieldBits, fieldBitsHi, lluiImport } = opts\n return {\n name: 'core-synthesis',\n compilerVersion: '^0.3.0',\n diagnostics: [],\n visitors: {},\n\n transformCallEnter(ctx, node) {\n if (!isComponentCall(node, lluiImport)) return null\n const rewritten = tryInjectDirty(node, fieldBits, ctx.factory, fieldBitsHi)\n if (!rewritten) return null\n const slot = ctx.analysis.perModule.get(CORE_SYNTHESIS_SLOT) as CoreSynthesisSlot | undefined\n if (slot) slot.usesApplyBinding = true\n else\n ctx.analysis.perModule.set(CORE_SYNTHESIS_SLOT, {\n usesApplyBinding: true,\n } as CoreSynthesisSlot)\n return rewritten\n },\n }\n}\n\n// ─── Synthesis implementation (moved verbatim from transform.ts) ────\n\nfunction tryInjectDirty(\n node: ts.CallExpression,\n fieldBits: Map<string, number>,\n f: ts.NodeFactory,\n fieldBitsHi: Map<string, number> = new Map(),\n): ts.CallExpression | null {\n if (fieldBits.size === 0 && fieldBitsHi.size === 0) return null\n const configArg = node.arguments[0]\n if (!configArg || !ts.isObjectLiteralExpression(configArg)) return null\n\n // Check if __dirty already exists\n for (const prop of configArg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === '__dirty'\n ) {\n return null\n }\n }\n\n // Top-level field → aggregated bit mask. Sub-paths under one field\n // (`route.page`, `route.data`) collapse into a single entry so\n // `tryBuildHandlers` can reason per-field. Positions 0..30 live here;\n // 31..61 in the parallel high-word map below. `__maskLegend` itself\n // is now owned by `maskLegendModule` (v2c/decomp-9).\n const topLevelBits = new Map<string, number>()\n for (const [path, bit] of fieldBits) {\n const topField = path.split('.')[0]!\n topLevelBits.set(topField, (topLevelBits.get(topField) ?? 0) | bit)\n }\n const topLevelBitsHi = new Map<string, number>()\n for (const [path, bit] of fieldBitsHi) {\n const topField = path.split('.')[0]!\n topLevelBitsHi.set(topField, (topLevelBitsHi.get(topField) ?? 0) | bit)\n }\n\n // Structural mask — used by __handlers.\n const structuralMask = computeStructuralMask(configArg, fieldBits)\n\n // v0.4 size-cut (Tier 2.4): the `__update` fast-path emission was\n // removed. Empirically (see benchmarks/bundle-baseline.json + the\n // strategy comparison in earlier work) it provided only ~3% wall-time\n // improvement on a 200-binding sparse-update workload, but cost 200-400\n // bytes per compiled component plus the dispatch branch in\n // processMessages. The runtime always uses genericUpdate now.\n\n // __handlers: per-message-type specialized update functions.\n // Analyzes the update() switch/case and generates direct handlers\n // that bypass the generic Phase 1/2 pipeline for single-message updates.\n // Tier 5 (drop __handlers) was attempted and REVERTED — see\n // benchmarks/bundle-baseline.json#/abandoned. The 1.4 kB savings cost\n // 23-89% perf on jfb's swap/remove/update/select.\n const handlersProp = tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMask, f)\n\n // `__maskLegend` is emitted by `maskLegendModule` via the registry\n // bridge (v2c/decomp-9); the umbrella's `applyRegistryEmissions` step\n // splices it into the same config-arg literal we return here.\n const extraProps: ts.ObjectLiteralElementLike[] = []\n if (handlersProp) extraProps.push(handlersProp)\n\n // __prefixes: opt-in path-keyed reactivity (see\n // docs/proposals/unified-composition-model.md). One closure per\n // distinct path that an accessor reads, hoisted into a stable array;\n // the array position IS the bit position used by the path's bindings.\n // The runtime prefers __prefixes when present and computes the\n // combinedDirty mask by reference-comparing `prefix(prev)` vs\n // `prefix(next)` for each entry — strictly more precise than the\n // top-level-conflated __dirty (which always co-fires bindings sharing\n // a top-level field even when only one sub-path actually mutated).\n //\n // Emit `__prefixes` whenever any reactive paths are present. For\n // components with ≤31 paths, the runtime's\n // `computeDirtyFromPrefixes` returns a single `number`; for\n // 32..61-path components it returns a `[lo, hi]` tuple that the\n // runtime fans out into `combinedDirty` + `combinedDirtyHi`. The\n // binding-level mask gating is still single-word at the compiler\n // emit layer today, so high-position bindings still re-evaluate\n // every cycle — but the dirty computation itself is now precise,\n // which lets memo()'d aggregates short-circuit correctly.\n const prefixesProp = buildPrefixesProp(fieldBits, fieldBitsHi, f)\n if (prefixesProp) extraProps.push(prefixesProp)\n\n const newConfig = f.createObjectLiteralExpression([...configArg.properties, ...extraProps], true)\n\n // `updateCallExpression` (not `createCallExpression`) so the new\n // node inherits `node.pos` / `node.end` from the original. Phase 2b\n // downstream consumers (componentMetaModule, etc.) read pos via\n // `getStart(sf)` for line info; a synthetic node (pos=-1) would\n // collapse every `component()` call's `__componentMeta.line` to 0.\n return f.updateCallExpression(node, node.expression, node.typeArguments, [\n newConfig,\n ...node.arguments.slice(1),\n ])\n}\n\n/**\n * Analyze update() switch/case and generate per-message-type handlers.\n *\n * Each handler receives (inst, msg) and returns [newState, effects].\n * The handler calls update() to get the new state, then directly invokes\n * the appropriate runtime primitives (reconcileItems, __directUpdate, etc.)\n * instead of going through the generic Phase 1/2 pipeline.\n *\n * Conservative: only generates handlers for cases where the field\n * modifications are statically determinable. Complex cases are skipped.\n */\nfunction tryBuildHandlers(\n configArg: ts.ObjectLiteralExpression,\n topLevelBits: Map<string, number>,\n topLevelBitsHi: Map<string, number>,\n structuralMask: number,\n f: ts.NodeFactory,\n): ts.PropertyAssignment | null {\n if (topLevelBits.size === 0 && topLevelBitsHi.size === 0) return null\n\n // Find the update function in the component config\n let updateFn: ts.ArrowFunction | ts.FunctionExpression | null = null\n for (const prop of configArg.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === 'update'\n ) {\n if (ts.isArrowFunction(prop.initializer) || ts.isFunctionExpression(prop.initializer)) {\n updateFn = prop.initializer\n }\n break\n }\n }\n if (!updateFn) return null\n\n // Find the switch statement in the update body\n const body = ts.isBlock(updateFn.body) ? updateFn.body : null\n if (!body) return null\n\n let switchStmt: ts.SwitchStatement | null = null\n for (const stmt of body.statements) {\n if (ts.isSwitchStatement(stmt)) {\n switchStmt = stmt\n break\n }\n }\n if (!switchStmt) return null\n\n // Check the switch discriminant is msg.type pattern\n const stateParam = updateFn.parameters[0]?.name\n const msgParam = updateFn.parameters[1]?.name\n if (!stateParam || !msgParam || !ts.isIdentifier(stateParam) || !ts.isIdentifier(msgParam))\n return null\n const stateName = stateParam.text\n\n // Analyze each case clause\n const handlers: ts.PropertyAssignment[] = []\n\n for (const clause of switchStmt.caseBlock.clauses) {\n if (!ts.isCaseClause(clause)) continue\n\n // Extract the case label — must be a string literal like 'select'\n if (!ts.isStringLiteral(clause.expression)) continue\n const msgType = clause.expression.text\n\n // Collect ALL return [newState, effects] statements recursively from the\n // case body. Multiple returns (from if/else branches) must all be analyzed\n // so the handler's dirty mask covers every possible modified field.\n const returnExprs: ts.ArrayLiteralExpression[] = []\n const collectReturns = (node: ts.Node): void => {\n if (\n ts.isReturnStatement(node) &&\n node.expression &&\n ts.isArrayLiteralExpression(node.expression) &&\n node.expression.elements.length >= 2\n ) {\n returnExprs.push(node.expression)\n return\n }\n // Don't descend into nested functions — their returns are unrelated.\n if (\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isArrowFunction(node) ||\n ts.isMethodDeclaration(node)\n ) {\n return\n }\n ts.forEachChild(node, collectReturns)\n }\n for (const stmt of clause.statements) {\n collectReturns(stmt)\n }\n if (returnExprs.length === 0) continue\n\n // Union modified fields across all return paths.\n const allModified = new Set<string>()\n let bailOut = false\n for (const returnExpr of returnExprs) {\n const stateExpr = returnExpr.elements[0]!\n const fields = analyzeModifiedFields(stateExpr, stateName, topLevelBits, topLevelBitsHi)\n if (!fields) {\n bailOut = true\n break\n }\n for (const f of fields) allModified.add(f)\n }\n if (bailOut) continue // at least one return path was too complex\n\n const modifiedFields = Array.from(allModified)\n\n // Compute the dirty mask for this case across both words. Fields\n // tracked in `topLevelBitsHi` contribute to `caseDirtyHi`; fields\n // tracked nowhere (`undefined` lookup in both) fall back to\n // FULL_MASK in the low word — same conservative behavior as\n // before, just preserved per-word now.\n let caseDirty = 0\n let caseDirtyHi = 0\n for (const field of modifiedFields) {\n const lo = topLevelBits.get(field)\n const hi = topLevelBitsHi.get(field)\n if (lo === undefined && hi === undefined) {\n caseDirty |= 0xffffffff | 0\n } else {\n if (lo !== undefined) caseDirty |= lo\n if (hi !== undefined) caseDirtyHi |= hi\n }\n }\n\n // Detect array operation pattern for structural block optimization\n const arrayOp = detectArrayOp(clause, modifiedFields, structuralMask, caseDirty)\n\n const handler = buildCaseHandler(f, caseDirty, caseDirtyHi, arrayOp)\n handlers.push(f.createPropertyAssignment(f.createStringLiteral(msgType), handler))\n }\n\n if (handlers.length === 0) return null\n\n return f.createPropertyAssignment('__handlers', f.createObjectLiteralExpression(handlers, true))\n}\n\ntype ArrayOp =\n | 'none'\n | 'clear'\n | 'mutate'\n | 'remove'\n | 'general'\n | { type: 'strided'; stride: number } // for (i = 0; i < len; i += stride) pattern\n\n/**\n * Detect the array operation pattern in a case body.\n * - 'none': no array field modified (e.g., only `selected` changes)\n * - 'clear': array set to empty literal `[]`\n * - 'mutate': array created via `.slice()` then mutated in place (same keys)\n * - 'general': unknown pattern, use generic reconcile\n */\nfunction detectArrayOp(\n clause: ts.CaseClause,\n modifiedFields: string[],\n _structuralMask?: number,\n _caseDirty?: number,\n): ArrayOp {\n // No fields modified → no Phase 1 needed (no bindings can care if no\n // state field changed). Safe to return 'none' here because it's a\n // tautology: every binding mask ANDed with zero is zero.\n if (modifiedFields.length === 0) return 'none'\n\n // The specialized methods (`reconcileClear`, `reconcileItems`,\n // `reconcileRemove`, `reconcileChanged`) only exist on `each` blocks.\n // Non-each blocks (`show`, `branch`, `scope`) leave them undefined,\n // so a method other than 0 (general reconcile) silently no-ops on\n // those blocks at runtime. If the case modifies fields BEYOND the\n // array op (e.g. `{ ...state, open: true, name: '', tags: [] }`),\n // any show/branch block whose mask intersects the case's dirty bits\n // would be selected for reconcile but then skipped by the no-op\n // method invocation — its `when`/`on` accessor never re-evaluates,\n // and the component appears structurally inert after mount.\n //\n // Conservative correctness: only emit a non-general method when the\n // array op is the SOLE field modification. With one modified field,\n // the only blocks selected by mask gating are ones that read that\n // single field — and the optimization is well-defined for that\n // narrow case (each blocks operating on the array). Multi-field\n // cases fall through to `'general'` (method=0), so every selected\n // block runs the standard `reconcile` path. We trade a niche\n // optimization (small benefit even when applicable) for guaranteed\n // structural reconciliation across the framework's primitive set.\n //\n // Sister of show-helper-reconcile.test.ts, which fixed the same\n // class of bug on the method=-1 path. Same architectural principle:\n // the compiler can't see every block in the view, so optimizations\n // that route around `reconcile` must be ironclad. When in doubt,\n // emit method=0 and let `_handleMsg`'s per-block mask gate filter.\n //\n // Previously: if `(structuralMask & caseDirty) === 0`, return 'none'\n // on the theory that no structural block's mask could intersect this\n // case's dirty bits. That optimization was UNSAFE: `computeStructuralMask`\n // only walks the view function's lexical AST and does not descend into\n // helper function calls. A view like\n //\n // view: () => [\n // ...show({ when: s => s.mode === 'signin', render: () => [signinFormBody()] }),\n // ]\n //\n // where `signinFormBody()` is a helper that internally does\n // ...show({ when: s => s.errors.email !== undefined, ... })\n //\n // produces a `structuralMask` that covers `mode` but MISSES\n // `errors.email`. At runtime the inner show block is still registered\n // in `inst.structuralBlocks`, and it legitimately needs to reconcile\n // when `errors` changes — but the compiler was emitting `method = -1`\n // (skip blocks entirely) for cases that only touch `errors`, and the\n // error paragraphs would never mount.\n if (modifiedFields.length !== 1) return 'general'\n const onlyField = modifiedFields[0]!\n\n // Look at the return expression's array field values\n for (const stmt of clause.statements) {\n const returnExpr = findReturnArray(stmt)\n if (!returnExpr) continue\n\n const stateExpr = returnExpr.elements[0]\n if (!stateExpr || !ts.isObjectLiteralExpression(stateExpr)) continue\n\n for (const prop of stateExpr.properties) {\n const name =\n ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)\n ? prop.name.text\n : ts.isShorthandPropertyAssignment(prop)\n ? prop.name.text\n : null\n if (!name) continue\n // The optimization only applies when the array op is on the\n // single tracked field. A `field: []` on a different field\n // (one not in modifiedFields, e.g. an untracked field) would\n // still no-op safely on each blocks via the mask gate, but to\n // keep the analysis tight we require an exact match.\n if (name !== onlyField) continue\n\n // Check for empty array literal: `field: []`\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isArrayLiteralExpression(prop.initializer) &&\n prop.initializer.elements.length === 0\n ) {\n return 'clear'\n }\n\n // Check for shorthand `field` where field was assigned via `.slice()` earlier\n // This catches: `const rows = state.rows.slice(); rows[i] = ...; return { ...state, rows }`\n if (ts.isShorthandPropertyAssignment(prop)) {\n const varName = prop.name.text\n if (hasSliceAssignment(clause, varName)) {\n // Check for strided for-loop: for (let i = 0; i < arr.length; i += STRIDE)\n const stride = detectStrideLoop(clause, varName)\n if (stride > 1) return { type: 'strided', stride }\n return 'mutate'\n }\n }\n\n // Check for property assignment with filter: `field: state.field.filter(...)`\n if (ts.isPropertyAssignment(prop) && ts.isCallExpression(prop.initializer)) {\n const call = prop.initializer\n if (\n ts.isPropertyAccessExpression(call.expression) &&\n call.expression.name.text === 'filter'\n ) {\n return 'remove'\n }\n }\n }\n }\n\n return 'general'\n}\n\nfunction findReturnArray(stmt: ts.Statement): ts.ArrayLiteralExpression | null {\n if (ts.isReturnStatement(stmt) && stmt.expression && ts.isArrayLiteralExpression(stmt.expression))\n return stmt.expression\n if (ts.isBlock(stmt)) {\n for (const inner of stmt.statements) {\n const result = findReturnArray(inner)\n if (result) return result\n }\n }\n return null\n}\n\n/**\n * Detect a strided for-loop: `for (let i = 0; i < arr.length; i += STRIDE)`\n * where `arr` is the named variable. Returns the stride or 0 if not found.\n */\nfunction detectStrideLoop(clause: ts.CaseClause, _arrName: string): number {\n function walk(node: ts.Node): number {\n if (ts.isForStatement(node) && node.incrementor) {\n // Check incrementor: i += STRIDE\n const inc = node.incrementor\n if (\n ts.isBinaryExpression(inc) &&\n inc.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken &&\n ts.isNumericLiteral(inc.right)\n ) {\n const stride = parseInt(inc.right.text, 10)\n if (stride > 1) return stride\n }\n }\n return ts.forEachChild(node, walk) ?? 0\n }\n for (const stmt of clause.statements) {\n const result = walk(stmt)\n if (result > 0) return result\n }\n return 0\n}\n\nfunction hasSliceAssignment(clause: ts.CaseClause, varName: string): boolean {\n function walk(node: ts.Node): boolean {\n // Look for: const varName = stateName.field.slice()\n if (\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === varName &&\n node.initializer\n ) {\n const init = node.initializer\n if (\n ts.isCallExpression(init) &&\n ts.isPropertyAccessExpression(init.expression) &&\n init.expression.name.text === 'slice'\n ) {\n return true\n }\n }\n return ts.forEachChild(node, walk) ?? false\n }\n for (const stmt of clause.statements) {\n if (walk(stmt)) return true\n }\n return false\n}\n\n/**\n * Analyze which top-level state fields are modified in a return expression.\n * Returns the set of field names, or null if too complex to determine.\n */\nfunction analyzeModifiedFields(\n stateExpr: ts.Expression,\n stateName: string,\n topLevelBits: Map<string, number>,\n topLevelBitsHi: Map<string, number> = new Map(),\n): string[] | null {\n // Recognize fields tracked in EITHER the low-word or high-word map.\n // 32..61-prefix components have their overflow paths in\n // `topLevelBitsHi`; the case handler's `caseDirty` / `caseDirtyHi`\n // logic depends on us recognizing those fields here.\n const isTracked = (name: string): boolean => topLevelBits.has(name) || topLevelBitsHi.has(name)\n // Pattern: { ...state, field1: ..., field2: ... } or { field1: ..., field2: ... }\n if (ts.isObjectLiteralExpression(stateExpr)) {\n const modified: string[] = []\n for (const prop of stateExpr.properties) {\n if (ts.isSpreadAssignment(prop)) {\n // Only `...state` is safe to ignore — re-spreading state back into\n // state doesn't change any field's identity. ANY other spread\n // (e.g. `...msg.props`, `...someObj`) can overwrite arbitrary\n // top-level fields with new references, and we cannot know which\n // ones statically. Bail out so the generic Phase 2 path runs\n // `__dirty` at runtime and produces a correct mask.\n if (ts.isIdentifier(prop.expression) && prop.expression.text === stateName) {\n continue\n }\n return null\n }\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const fieldName = prop.name.text\n if (isTracked(fieldName)) {\n modified.push(fieldName)\n }\n }\n // Handle shorthand: { ...state, rows } where rows is a local variable\n if (ts.isShorthandPropertyAssignment(prop)) {\n const fieldName = prop.name.text\n if (isTracked(fieldName)) {\n modified.push(fieldName)\n }\n }\n }\n return modified.length > 0 ? modified : null\n }\n\n // Pattern: state (no change — early return)\n if (ts.isIdentifier(stateExpr) && stateExpr.text === stateName) {\n return [] // no fields modified\n }\n\n return null // too complex\n}\n\n/**\n * Build a handler function for a specific message type case.\n *\n * Generated: (inst, msg) => {\n * const [s, e] = inst.def.update(inst.state, msg)\n * inst.state = s\n * const bl = inst.structuralBlocks, b = inst.allBindings, p = b.length\n * // Phase 1: gated by caseDirty\n * for (let i = 0; i < bl.length; i++) {\n * if (bl[i].mask & caseDirty) bl[i].reconcile(s, caseDirty)\n * }\n * // Phase 2\n * __runPhase2(s, caseDirty, b, p)\n * return [s, e]\n * }\n */\n/**\n * Build a handler that delegates to __handleMsg(inst, msg, dirty, method).\n * method: 0=reconcile, 1=reconcileItems, 2=reconcileClear, 3=reconcileRemove, -1=skip blocks\n */\nfunction buildCaseHandler(\n f: ts.NodeFactory,\n caseDirty: number,\n caseDirtyHi: number,\n arrayOp: ArrayOp,\n): ts.ArrowFunction {\n const method =\n typeof arrayOp === 'object' && arrayOp.type === 'strided'\n ? 10 + arrayOp.stride // reconcileChanged with stride\n : arrayOp === 'none'\n ? -1\n : arrayOp === 'mutate'\n ? 1\n : arrayOp === 'clear'\n ? 2\n : arrayOp === 'remove'\n ? 3\n : 0 // general\n\n // (inst, msg) => __handleMsg(inst, msg, dirty, method, [dirtyHi])\n const args: ts.Expression[] = [\n f.createIdentifier('inst'),\n f.createIdentifier('msg'),\n createMaskLiteral(f, caseDirty),\n method >= 0\n ? f.createNumericLiteral(method)\n : f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(1)),\n ]\n // Emit the 5th positional arg only when the case touches a high-word\n // field. Stale runtime bundles' _handleMsg signatures ignored that\n // slot anyway; new ones (defaulted to 0) make it explicit when needed.\n if (caseDirtyHi !== 0) args.push(createMaskLiteral(f, caseDirtyHi))\n return f.createArrowFunction(\n undefined,\n undefined,\n [\n f.createParameterDeclaration(undefined, undefined, 'inst'),\n f.createParameterDeclaration(undefined, undefined, 'msg'),\n ],\n undefined,\n f.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n f.createCallExpression(f.createIdentifier('__handleMsg'), undefined, args),\n )\n}\n\n/**\n * Compute the OR of all structural block masks found in the view function.\n * Returns FULL_MASK if any structural block uses FULL_MASK or if no blocks found.\n */\nfunction computeStructuralMask(\n configArg: ts.ObjectLiteralExpression,\n fieldBits: Map<string, number>,\n): number {\n const viewProp = configArg.properties.find(\n (p) => ts.isPropertyAssignment(p) && ts.isIdentifier(p.name) && p.name.text === 'view',\n )\n if (!viewProp || !ts.isPropertyAssignment(viewProp)) return 0xffffffff | 0\n\n let mask = 0\n let foundStructural = false\n\n function walk(node: ts.Node): void {\n if (ts.isCallExpression(node)) {\n const name = ts.isIdentifier(node.expression) ? node.expression.text : ''\n if (['each', 'branch', 'scope', 'show'].includes(name) && node.arguments[0]) {\n foundStructural = true\n const opts = node.arguments[0]\n if (ts.isObjectLiteralExpression(opts)) {\n // Check for __mask property (already injected by tryInjectStructuralMask)\n for (const prop of opts.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === '__mask'\n ) {\n if (ts.isNumericLiteral(prop.initializer)) {\n mask |= parseInt(prop.initializer.text, 10)\n return\n }\n if (ts.isPrefixUnaryExpression(prop.initializer)) {\n // Handle negative literals like -1\n mask = 0xffffffff | 0\n return\n }\n }\n }\n // No __mask found — use driving accessor mask\n const driverProp = name === 'each' ? 'items' : name === 'branch' ? 'on' : 'when'\n for (const prop of opts.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === driverProp\n ) {\n if (\n ts.isArrowFunction(prop.initializer) ||\n ts.isFunctionExpression(prop.initializer)\n ) {\n const { mask: m } = computeAccessorMask(prop.initializer, fieldBits)\n mask |= m || 0xffffffff | 0\n }\n break\n }\n }\n }\n }\n }\n ts.forEachChild(node, walk)\n }\n\n walk(viewProp.initializer)\n return foundStructural ? mask || 0xffffffff | 0 : 0\n}\n\n/**\n * Build the `__prefixes` property assignment from path → bit maps.\n *\n * Emits one arrow `(s) => s.<path>` per distinct path. Array index =\n * the path's bit position: positions 0..30 come from `fieldBits` (low\n * word), positions 31..61 from `fieldBitsHi` (high word). The runtime\n * walks this array and reference-compares `prefix(prev)` vs\n * `prefix(next)` per entry, fanning bits into a `(lo, hi)` pair when\n * the array length exceeds 31.\n *\n * Returns null if no paths are present.\n */\nfunction buildPrefixesProp(\n fieldBits: Map<string, number>,\n fieldBitsHi: Map<string, number>,\n f: ts.NodeFactory,\n): ts.PropertyAssignment | null {\n if (fieldBits.size === 0 && fieldBitsHi.size === 0) return null\n // Sort paths by bit value within each word. Bits are powers of two\n // inside their word (1, 2, 4, …, 1<<30), so sorting numerically gives\n // ascending bit position. FULL_MASK (-1) entries from past-61\n // overflow shouldn't drive a prefix entry — defensively skip them.\n const orderedLo = [...fieldBits.entries()]\n .filter(([, bit]) => bit > 0)\n .sort(([, a], [, b]) => a - b)\n const orderedHi = [...fieldBitsHi.entries()].sort(([, a], [, b]) => a - b)\n const buildArrow = (path: string): ts.ArrowFunction => {\n const parts = path.split('.')\n const body = buildAccess(f, 's', parts)\n return f.createArrowFunction(\n undefined,\n undefined,\n [f.createParameterDeclaration(undefined, undefined, 's')],\n undefined,\n f.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n body,\n )\n }\n const arrows = [\n ...orderedLo.map(([path]) => buildArrow(path)),\n ...orderedHi.map(([path]) => buildArrow(path)),\n ]\n return f.createPropertyAssignment('__prefixes', f.createArrayLiteralExpression(arrows, false))\n}\n\nfunction buildAccess(f: ts.NodeFactory, root: string, parts: string[]): ts.Expression {\n let expr: ts.Expression = f.createIdentifier(root)\n for (const part of parts) {\n // Use optional chaining for nested paths\n if (parts.length > 1) {\n expr = f.createPropertyAccessChain(expr, f.createToken(ts.SyntaxKind.QuestionDotToken), part)\n } else {\n expr = f.createPropertyAccessExpression(expr, part)\n }\n }\n return expr\n}\n"]}
@@ -16,6 +16,12 @@ export interface ElementRewriteSlot {
16
16
  usesElTemplate: boolean;
17
17
  /** Module emitted at least one `__cloneStaticTemplate(...)` call. */
18
18
  usesCloneStaticTemplate: boolean;
19
+ /**
20
+ * v0.4 size-cut — module emitted at least one `__bindUncertain(...)`
21
+ * call for a prop value with unresolvable type (function parameter,
22
+ * etc.). Drives the runtime import addition.
23
+ */
24
+ usesBindUncertain: boolean;
19
25
  }
20
26
  export declare const ELEMENT_REWRITE_SLOT = "element-rewrite:state";
21
27
  export declare function elementRewriteModule(options: ElementRewriteModuleOptions): CompilerModule;
@@ -1 +1 @@
1
- {"version":3,"file":"element-rewrite.d.ts","sourceRoot":"","sources":["../../src/modules/element-rewrite.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAMlD,MAAM,WAAW,2BAA2B;IAC1C,yEAAyE;IACzE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAA;IACpB,0DAA0D;IAC1D,cAAc,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,uBAAuB,EAAE,OAAO,CAAA;CACjC;AAED,eAAO,MAAM,oBAAoB,0BAA0B,CAAA;AAE3D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CAyCzF"}
1
+ {"version":3,"file":"element-rewrite.d.ts","sourceRoot":"","sources":["../../src/modules/element-rewrite.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAMlD,MAAM,WAAW,2BAA2B;IAC1C,yEAAyE;IACzE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACrB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAA;IACpB,0DAA0D;IAC1D,cAAc,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,uBAAuB,EAAE,OAAO,CAAA;IAChC;;;;OAIG;IACH,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,0BAA0B,CAAA;AAE3D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CA2CzF"}