parseman 0.26.2 → 0.27.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,19 @@ type NodeDef = Extract<ParserDef, {
4
4
  }>;
5
5
  export declare function buildReadsFields(def: NodeDef): boolean;
6
6
  export declare function parserHasOwnFields(p: Combinator<unknown>, seen?: Set<Combinator<unknown>>): boolean;
7
+ /**
8
+ * Does the node's OWN parse frame ever have a trivia run logged into it?
9
+ * Trivia is logged only by the trivia-skip fn, which runs at `sequence`/`many`/
10
+ * repeat boundaries. A bare terminal (regex/literal/keywords/…) has NO trivia
11
+ * site, so its `_cstTriviaLog` stays empty and its `captureTrivia`/`_cstTriviaLog`/
12
+ * `_triviaCaptureMask` save+install+restore is dead work — the per-node scope
13
+ * trivia frame can be elided for it (see emitNode `needsTriviaFrame`).
14
+ *
15
+ * Stops at a nested `node()` (it manages its OWN trivia frame; trivia inside it
16
+ * never logs to THIS node's frame). CONSERVATIVE: any unknown / trivia-bearing
17
+ * shape returns `true` (keep the frame) — we only elide when provably safe.
18
+ */
19
+ export declare function parserHasTriviaSite(p: Combinator<unknown>, seen?: Set<Combinator<unknown>>): boolean;
7
20
  export declare function buildFieldMap(captures: ReadonlyArray<{
8
21
  name: string;
9
22
  value: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/compiler/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGlE,KAAK,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CA+B9G;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAW/J"}
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/compiler/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGlE,KAAK,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CA+B9G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CAwC/G;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAW/J"}
@@ -1 +1 @@
1
- {"version":3,"file":"ir-serialize.d.ts","sourceRoot":"","sources":["../../src/compiler/ir-serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAiBxD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AA4C/B,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAC9C,MAAM,GAAG,IAAI,CAUf;AAED;;oFAEoF;AACpF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAgE/D"}
1
+ {"version":3,"file":"ir-serialize.d.ts","sourceRoot":"","sources":["../../src/compiler/ir-serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAkBxD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AA4C/B,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAC9C,MAAM,GAAG,IAAI,CAUf;AAED;;oFAEoF;AACpF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAiF/D"}
@@ -51,6 +51,33 @@ export type RunOptions = {
51
51
  * fails, so none of the machinery runs.
52
52
  */
53
53
  tolerant?: boolean;
54
+ /**
55
+ * Run three compiled-parser-only profiling passes: recognizer (no global
56
+ * sinks), structural capture without the host, then the normal host path. This
57
+ * is a measurement boundary, not a parser mode; ordinary `run()` output is
58
+ * unchanged when omitted. The input is parsed THREE times — each pass gets its
59
+ * own shallow copy of `options.state`, so keep per-parse state shallow (only
60
+ * the top level is isolated between passes).
61
+ */
62
+ profile?: boolean;
63
+ };
64
+ export type RunProfilePass = {
65
+ ms: number;
66
+ nodes: number;
67
+ childSlots: number;
68
+ rawSlots: number;
69
+ triviaSlots: number;
70
+ fieldSlots: number;
71
+ hostCalls: number;
72
+ };
73
+ export type RunProfile = {
74
+ /** Existing `voidOf(transform(..., () => undefined))` semantics, generalized
75
+ * to compiled structural nodes: no `ch`/`raw`/`tl` capture or raw entries. */
76
+ recognizer: RunProfilePass;
77
+ /** Captures children/raw/trivia/fields but suppresses node construction. */
78
+ structuralCapture: RunProfilePass;
79
+ /** The ordinary parser path, including its injected build host. */
80
+ hostConstruction: RunProfilePass;
54
81
  };
55
82
  export type RunResult = {
56
83
  ok: boolean;
@@ -78,6 +105,8 @@ export type RunResult = {
78
105
  * there's junk here". Only meaningful on success — a failed parse reports its own
79
106
  * `span`/`expected`. */
80
107
  unconsumedFrom: number | null;
108
+ /** Present only when `RunOptions.profile` is true. */
109
+ profile?: RunProfile;
81
110
  };
82
111
  export declare function run(entry: Runnable, input: string, options?: RunOptions): RunResult;
83
112
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/functional/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGpF;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAChB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,GACzE,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB;qFACiF;IACjF,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,OAAO,CAAA;IACX,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gGAAgG;IAChG,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB;;;;4BAIwB;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAKD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CA+CvF"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/functional/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGpF;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAChB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,GACzE,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB;qFACiF;IACjF,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB;kFAC8E;IAC9E,UAAU,EAAE,cAAc,CAAA;IAC1B,4EAA4E;IAC5E,iBAAiB,EAAE,cAAc,CAAA;IACjC,mEAAmE;IACnE,gBAAgB,EAAE,cAAc,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,OAAO,CAAA;IACX,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gGAAgG;IAChG,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB;;;;4BAIwB;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sDAAsD;IACtD,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB,CAAA;AAoFD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CAsBvF"}
package/dist/index.cjs CHANGED
@@ -2305,6 +2305,55 @@ function parserHasOwnFields(p, seen = /* @__PURE__ */ new Set()) {
2305
2305
  return false;
2306
2306
  }
2307
2307
  }
2308
+ function parserHasTriviaSite(p, seen = /* @__PURE__ */ new Set()) {
2309
+ if (seen.has(p)) return true;
2310
+ seen.add(p);
2311
+ const d = p._def;
2312
+ switch (d.tag) {
2313
+ // Trivia is skipped between/around elements or iterations → a site.
2314
+ case "sequence":
2315
+ case "many":
2316
+ case "oneOrMore":
2317
+ case "sepBy":
2318
+ case "scanTo":
2319
+ case "recover":
2320
+ case "skip":
2321
+ return true;
2322
+ // Nested node manages its own trivia frame; none logs here.
2323
+ case "node":
2324
+ return false;
2325
+ // Pure terminals + trivia-suppressing token: no site.
2326
+ case "regex":
2327
+ case "literal":
2328
+ case "keywords":
2329
+ case "guard":
2330
+ case "token":
2331
+ return false;
2332
+ // Transparent single-child wrappers: recurse.
2333
+ case "optional":
2334
+ case "transform":
2335
+ case "trivia":
2336
+ case "label":
2337
+ case "expect":
2338
+ case "withCtx":
2339
+ case "not":
2340
+ case "field":
2341
+ return parserHasTriviaSite(d.parser, seen);
2342
+ case "choice":
2343
+ return d.parsers.some((x) => parserHasTriviaSite(x, seen));
2344
+ case "grammar":
2345
+ return parserHasTriviaSite(d.parser, seen);
2346
+ case "lazy": {
2347
+ try {
2348
+ return parserHasTriviaSite(d.thunk(), seen);
2349
+ } catch {
2350
+ return true;
2351
+ }
2352
+ }
2353
+ default:
2354
+ return true;
2355
+ }
2356
+ }
2308
2357
  function buildFieldMap(captures) {
2309
2358
  if (!captures?.length) return void 0;
2310
2359
  const out = {};
@@ -5296,32 +5345,49 @@ function emitNode(def, ctx, pos) {
5296
5345
  const smk = structural ? v(ctx, "_smk") : null;
5297
5346
  if (structural) ctx.needsHostReads = true;
5298
5347
  const hostTriviaGate = `_ctx.build !== undefined && (_ctx.build._parsemanCaptureTrivia !== undefined ? _ctx.build._parsemanCaptureTrivia(${JSON.stringify(def.type)}) : (_ctx._pmCapTL ??= _hostReads(_ctx.build, 5)))`;
5299
- const allocStmt = structural ? `${i}const ${capTLv} = ${hostTriviaGate}, ${capSTv} = _ctx._pmCapST ??= (_ctx.build === undefined || _hostReads(_ctx.build, 6))${capFv ? `, ${capFv} = _ctx.build !== undefined && _hostReads(_ctx.build, 2)` : ""}
5300
- ${i}const ${chV} = [], ${rawV} = [], ${tlV} = ${capTLv} ? [] : _EMPTY_TL` : capturesTrivia ? `${i}const ${chV} = [], ${rawV} = [], ${tlV} = []` : `${i}const ${chV} = [], ${rawV} = []`;
5348
+ const pmV = v(ctx, "_pm"), recV = v(ctx, "_rec"), capV = v(ctx, "_cap");
5349
+ const profHoist = `${i}const ${pmV} = _ctx._pmProfile, ${recV} = ${pmV}?.phase === 'recognizer', ${capV} = ${pmV}?.phase === 'capture'`;
5350
+ const profileRecognizer = recV;
5351
+ const profileCapture = capV;
5352
+ const allocStmt = structural ? `${i}const ${capTLv} = !(${profileRecognizer}) && (${profileCapture} || ${hostTriviaGate}), ${capSTv} = !(${profileRecognizer} || ${profileCapture}) && (_ctx._pmCapST ??= (_ctx.build === undefined || _hostReads(_ctx.build, 6)))${capFv ? `, ${capFv} = !(${profileRecognizer}) && (${profileCapture} || (_ctx.build !== undefined && _hostReads(_ctx.build, 2)))` : ""}
5353
+ ${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : [], ${tlV} = ${capTLv} ? [] : _EMPTY_TL` : capturesTrivia ? `${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : [], ${tlV} = ${profileRecognizer} ? undefined : []` : `${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : []`;
5301
5354
  const innerTl = structural ? `${capTLv} ? ${tlV} : undefined` : capturesTrivia ? tlV : "undefined";
5302
- const fieldsOn = structural ? capFv ?? "false" : capturesFields ? "true" : "false";
5355
+ const fieldsOn = structural ? capFv ?? "false" : `${profileRecognizer} ? false : ${capturesFields ? "true" : "false"}`;
5303
5356
  const sf = hasFields ? v(ctx, "_sf") : null;
5304
5357
  const fArr = hasFields ? v(ctx, "_fa") : null;
5305
5358
  const fObj = hasFields ? v(ctx, "_fields") : "undefined";
5359
+ const needsTriviaFrame = parserHasTriviaSite(def.parser);
5360
+ const saveTrivia = needsTriviaFrame ? `, ${st} = _ctx.captureTrivia, ${stl} = _ctx._cstTriviaLog${smk ? `, ${smk} = _ctx._triviaCaptureMask` : ""}` : "";
5361
+ const installTrivia = needsTriviaFrame ? `; _ctx.captureTrivia = true; _ctx._cstTriviaLog = ${innerTl}${smk ? `; _ctx._triviaCaptureMask = ${capTLv} && _ctx.build._parsemanTriviaKinds !== undefined ? _ctx.build._parsemanTriviaKinds(${JSON.stringify(def.type)}) : ${smk}` : ""}` : "";
5362
+ const restoreTrivia = needsTriviaFrame ? `; _ctx.captureTrivia = ${st}; _ctx._cstTriviaLog = ${stl}${smk ? `; _ctx._triviaCaptureMask = ${smk}` : ""}` : "";
5306
5363
  const stmts = [
5364
+ profHoist,
5307
5365
  allocStmt,
5308
- `${i}const ${sc} = _ctx._cstChildren, ${sl} = _ctx._cstLeaves, ${sr} = _ctx._cstRawChildren, ${st} = _ctx.captureTrivia, ${stl} = _ctx._cstTriviaLog${smk ? `, ${smk} = _ctx._triviaCaptureMask` : ""}${sf ? `, ${sf} = _ctx._fields` : ""}`,
5309
- `${i}_ctx._cstChildren = ${chV}; _ctx._cstLeaves = ${chV}; _ctx._cstRawChildren = ${rawV}; _ctx.captureTrivia = true; _ctx._cstTriviaLog = ${innerTl}${smk ? `; _ctx._triviaCaptureMask = ${capTLv} && _ctx.build._parsemanTriviaKinds !== undefined ? _ctx.build._parsemanTriviaKinds(${JSON.stringify(def.type)}) : ${smk}` : ""}${sf ? `; _ctx._fields = ${fieldsOn} ? [] : undefined` : ""}`
5366
+ `${i}const ${sc} = _ctx._cstChildren, ${sl} = _ctx._cstLeaves, ${sr} = _ctx._cstRawChildren${saveTrivia}${sf ? `, ${sf} = _ctx._fields` : ""}`,
5367
+ `${i}_ctx._cstChildren = ${chV}; _ctx._cstLeaves = ${chV}; _ctx._cstRawChildren = ${rawV}${installTrivia}${sf ? `; _ctx._fields = ${fieldsOn} ? [] : undefined` : ""}`
5310
5368
  ];
5311
5369
  const { stmts: innerStmts, okVar, endVar } = emitFallible(def.parser, ctx, pos);
5312
5370
  stmts.push(...innerStmts);
5313
5371
  if (sf && fArr) {
5314
5372
  stmts.push(`${i}const ${fArr} = _ctx._fields`);
5315
5373
  }
5316
- stmts.push(`${i}_ctx._cstChildren = ${sc}; _ctx._cstLeaves = ${sl}; _ctx._cstRawChildren = ${sr}; _ctx.captureTrivia = ${st}; _ctx._cstTriviaLog = ${stl}${smk ? `; _ctx._triviaCaptureMask = ${smk}` : ""}${sf ? `; _ctx._fields = ${sf}` : ""}`);
5374
+ stmts.push(`${i}_ctx._cstChildren = ${sc}; _ctx._cstLeaves = ${sl}; _ctx._cstRawChildren = ${sr}${restoreTrivia}${sf ? `; _ctx._fields = ${sf}` : ""}`);
5317
5375
  stmts.push(...emitIfFail(ctx, `!${okVar}`, propagateFailBody(ctx)));
5376
+ stmts.push(
5377
+ `${i}if (_ctx._pmProfile) {`,
5378
+ `${i} _ctx._pmProfile.nodes++`,
5379
+ `${i} if (${profileCapture}) {`,
5380
+ `${i} _ctx._pmProfile.childSlots += ${chV}.length; _ctx._pmProfile.rawSlots += ${rawV}.length; _ctx._pmProfile.triviaSlots += ${tlV}.length${fArr ? `; _ctx._pmProfile.fieldSlots += ${fArr} ? ${fArr}.length : 0` : ""}`,
5381
+ `${i} }`,
5382
+ `${i}}`
5383
+ );
5318
5384
  let stV = "undefined";
5319
5385
  if (structural) {
5320
5386
  stV = v(ctx, "_nst");
5321
5387
  stmts.push(`${i}const ${stV} = ${capSTv} && _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
5322
5388
  } else if (clonesState) {
5323
5389
  stV = v(ctx, "_nst");
5324
- stmts.push(`${i}const ${stV} = _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
5390
+ stmts.push(`${i}const ${stV} = !(${profileRecognizer} || ${profileCapture}) && _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
5325
5391
  }
5326
5392
  if (sf && fArr) {
5327
5393
  const fe = v(ctx, "_fe");
@@ -5341,15 +5407,17 @@ ${i}const ${chV} = [], ${rawV} = [], ${tlV} = ${capTLv} ? [] : _EMPTY_TL` : capt
5341
5407
  }
5342
5408
  const ndV = v(ctx, "_nd");
5343
5409
  const buildExpr = structural ? `{ _tag: 'node', type: ${JSON.stringify(def.type)}, span: { start: ${pos}, end: ${endVar} }, state: ${stV} ?? null, children: ${chV} }` : mkType ? emitInlineMkNodeExpr(mkType, chV, rawV, pos, endVar, tlV) : `${buildRef(ctx)}[${buildIdx}](${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV})`;
5344
- const ndExpr = ctx.ns || structural ? `_ctx.build !== undefined ? _ctx.build(${JSON.stringify(def.type)}, ${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV}) : (${buildExpr})` : buildExpr;
5410
+ const ndExpr = ctx.ns || structural ? `_ctx.build !== undefined ? (_ctx._pmProfile?.phase === 'host' && _ctx._pmProfile.hostCalls++, _ctx.build(${JSON.stringify(def.type)}, ${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV})) : (${buildExpr})` : buildExpr;
5345
5411
  const hostCollapseExpr = ctx.ns || structural ? `_ctx.build !== undefined && _ctx.build._parsemanCstCollapse !== undefined && ${chV}.length === 1 && ${rawV}.length === 1 && _ctx.build._parsemanCstCollapse(${JSON.stringify(def.type)}, ${chV}[0], ${chV}, ${rawV}) ? ${chV}[0] : (${ndExpr})` : ndExpr;
5346
5412
  const unwrapExpr = `${chV}.length === 1 ? (${chV}[0] !== null && typeof ${chV}[0] === 'object' && ${chV}[0]._tag === 'leaf' ? ${chV}[0].value : ${chV}[0]) : (${ndExpr})`;
5347
5413
  const collapseExpr = `${chV}.length === 1 ? ${chV}[0] : (${ndExpr})`;
5348
5414
  const finalExpr = def.unwrap ? unwrapExpr : def.collapse ? collapseExpr : hostCollapseExpr;
5349
5415
  stmts.push(
5350
- `${i}const ${ndV} = ${finalExpr}`,
5351
- `${i}if (${sc}) ${sc}.push(${ndV})`,
5352
- `${i}if (${sr}) ${sr}.push((typeof ${ndV} === 'object' && ${ndV} !== null && (${ndV}._tag === 'node' || ${ndV}._tag === 'leaf' || ${ndV}._tag === 'parseError')) ? ${ndV} : { _tag: 'leaf', value: typeof ${ndV} === 'string' ? ${ndV} : '', span: { start: ${pos}, end: ${endVar} } })`
5416
+ `${i}const ${ndV} = (${profileRecognizer} || ${profileCapture}) ? undefined : (${finalExpr})`,
5417
+ `${i}if (!(${profileRecognizer})) {`,
5418
+ `${i} if (${sc}) ${sc}.push(${ndV})`,
5419
+ `${i} if (${sr}) ${sr}.push((typeof ${ndV} === 'object' && ${ndV} !== null && (${ndV}._tag === 'node' || ${ndV}._tag === 'leaf' || ${ndV}._tag === 'parseError')) ? ${ndV} : { _tag: 'leaf', value: typeof ${ndV} === 'string' ? ${ndV} : '', span: { start: ${pos}, end: ${endVar} } })`,
5420
+ `${i}}`
5353
5421
  );
5354
5422
  return { stmts, valueVar: ndV, endVar };
5355
5423
  }
@@ -5635,7 +5703,7 @@ function emitDispatch(p, ctx, pos) {
5635
5703
  ctx.indent = 1;
5636
5704
  ctx.failLabel = "_pfail";
5637
5705
  ctx.recordFail = true;
5638
- const innerR = emit(innerParser, ctx, "_pos");
5706
+ const innerR = emitDispatch(innerParser, ctx, "_pos");
5639
5707
  ctx.indent = savedIndent;
5640
5708
  ctx.failLabel = savedFailLabel;
5641
5709
  ctx.recordFail = savedRecord;
@@ -6267,6 +6335,23 @@ function escapeClassChar(ch) {
6267
6335
  return ch.replace(/[\\\]^-]/g, "\\$&");
6268
6336
  }
6269
6337
 
6338
+ // src/combinators/withCtx.ts
6339
+ function withCtx(extra, combinator) {
6340
+ const meta = {
6341
+ firstSet: combinator._meta.firstSet,
6342
+ canMatchNewline: combinator._meta.canMatchNewline,
6343
+ isTrivia: false
6344
+ };
6345
+ return {
6346
+ _tag: "withCtx",
6347
+ _meta: meta,
6348
+ _def: { tag: "withCtx", extra, parser: combinator },
6349
+ parse(input, pos, ctx) {
6350
+ return combinator.parse(input, pos, { ...ctx, state: extra });
6351
+ }
6352
+ };
6353
+ }
6354
+
6270
6355
  // src/compiler/ir-serialize.ts
6271
6356
  function childrenOf2(def) {
6272
6357
  switch (def.tag) {
@@ -6283,6 +6368,7 @@ function childrenOf2(def) {
6283
6368
  case "field":
6284
6369
  case "not":
6285
6370
  case "node":
6371
+ case "withCtx":
6286
6372
  case "expect":
6287
6373
  return [def.parser];
6288
6374
  case "grammar":
@@ -6298,7 +6384,6 @@ function childrenOf2(def) {
6298
6384
  case "regex":
6299
6385
  case "keywords":
6300
6386
  case "guard":
6301
- case "withCtx":
6302
6387
  case "recover":
6303
6388
  case "unknown":
6304
6389
  return [];
@@ -6373,6 +6458,17 @@ function evalRuleMapIR(ir) {
6373
6458
  c._def.gateSrcs = gateSrcs;
6374
6459
  return c;
6375
6460
  };
6461
+ const _wc = (src, inner) => {
6462
+ let extra;
6463
+ try {
6464
+ extra = (0, eval)(`(${src})`);
6465
+ } catch {
6466
+ extra = void 0;
6467
+ }
6468
+ const w = withCtx(extra, inner);
6469
+ w._def.extraSrc = src;
6470
+ return w;
6471
+ };
6376
6472
  const fn = new Function(
6377
6473
  "rules",
6378
6474
  "ref",
@@ -6399,6 +6495,7 @@ function evalRuleMapIR(ir) {
6399
6495
  "_tf",
6400
6496
  "_nd",
6401
6497
  "_gch",
6498
+ "_wc",
6402
6499
  `return (${ir})`
6403
6500
  );
6404
6501
  const map = fn(
@@ -6426,7 +6523,8 @@ function evalRuleMapIR(ir) {
6426
6523
  expect,
6427
6524
  _tf,
6428
6525
  _nd,
6429
- _gch
6526
+ _gch,
6527
+ _wc
6430
6528
  );
6431
6529
  return Object.entries(map);
6432
6530
  }
@@ -6482,7 +6580,7 @@ ${body}
6482
6580
  this.analyze(target, active);
6483
6581
  return;
6484
6582
  }
6485
- if (def.tag === "guard" || def.tag === "withCtx" || def.tag === "recover" || def.tag === "unknown") {
6583
+ if (def.tag === "guard" || def.tag === "recover" || def.tag === "unknown") {
6486
6584
  throw new Unserializable(`unsupported tag ${def.tag}`);
6487
6585
  }
6488
6586
  this.counts.set(c, (this.counts.get(c) ?? 0) + 1);
@@ -6591,8 +6689,11 @@ ${body}
6591
6689
  const trivia2 = def.clearTrivia ? "null" : def.triviaParser ? kid(def.triviaParser) : "undefined";
6592
6690
  return `parser({ trivia: ${trivia2}${def.trackLines ? ", trackLines: true" : ""} }, ${kid(def.parser)})`;
6593
6691
  }
6692
+ case "withCtx": {
6693
+ if (def.extraSrc === void 0) throw new Unserializable("withCtx without extraSrc");
6694
+ return `_wc(${JSON.stringify(def.extraSrc)}, ${kid(def.parser)})`;
6695
+ }
6594
6696
  case "guard":
6595
- case "withCtx":
6596
6697
  case "recover":
6597
6698
  case "unknown":
6598
6699
  throw new Unserializable(`unsupported tag ${def.tag}`);
@@ -6766,23 +6867,6 @@ function guard(predicate) {
6766
6867
  };
6767
6868
  }
6768
6869
 
6769
- // src/combinators/withCtx.ts
6770
- function withCtx(extra, combinator) {
6771
- const meta = {
6772
- firstSet: combinator._meta.firstSet,
6773
- canMatchNewline: combinator._meta.canMatchNewline,
6774
- isTrivia: false
6775
- };
6776
- return {
6777
- _tag: "withCtx",
6778
- _meta: meta,
6779
- _def: { tag: "withCtx", extra, parser: combinator },
6780
- parse(input, pos, ctx) {
6781
- return combinator.parse(input, pos, { ...ctx, state: extra });
6782
- }
6783
- };
6784
- }
6785
-
6786
6870
  // src/combinators/completions.ts
6787
6871
  function completionsAt(target, input, offset, options = {}) {
6788
6872
  const probe = { offset, best: null };
@@ -7301,7 +7385,7 @@ function parseDoc(registry, rootRule, input, opts = {}) {
7301
7385
 
7302
7386
  // src/functional/run.ts
7303
7387
  var invoke = (r, input, pos, ctx) => typeof r === "function" ? r(input, pos, ctx) : r.parse(input, pos, ctx);
7304
- function run(entry, input, options = {}) {
7388
+ function runOnce(entry, input, options, phase, profileState) {
7305
7389
  if (typeof entry !== "function" && typeof entry?.parse !== "function") {
7306
7390
  throw new TypeError(
7307
7391
  `run(): start production is ${entry === null ? "null" : typeof entry}, not a rule \u2014 the requested grammar rule does not exist (check the rule name).`
@@ -7309,11 +7393,12 @@ function run(entry, input, options = {}) {
7309
7393
  }
7310
7394
  const triviaLog = [];
7311
7395
  const errors = [];
7396
+ const profile = profileState ?? (phase === void 0 ? void 0 : { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 });
7397
+ const skipGlobalSinks = phase === "recognizer" || phase === "capture";
7312
7398
  const grammarTrivia = typeof entry !== "function" ? entry._meta.grammarTrivia : void 0;
7313
7399
  const ctx = {
7314
7400
  trackLines: false,
7315
- _triviaLog: triviaLog,
7316
- _errors: errors,
7401
+ ...skipGlobalSinks ? { _pmProfile: profile } : { _triviaLog: triviaLog, _errors: errors, ...profile === void 0 ? {} : { _pmProfile: profile } },
7317
7402
  build: options.build,
7318
7403
  state: options.state,
7319
7404
  ...grammarTrivia !== void 0 ? { trivia: grammarTrivia, ...grammarTrivia._meta.triviaKindLabels ? { triviaKindLabels: grammarTrivia._meta.triviaKindLabels } : {} } : {},
@@ -7340,6 +7425,38 @@ function run(entry, input, options = {}) {
7340
7425
  unconsumedFrom
7341
7426
  };
7342
7427
  }
7428
+ function clonePassState(state) {
7429
+ if (state === null || typeof state !== "object") return state;
7430
+ return Array.isArray(state) ? [...state] : { ...state };
7431
+ }
7432
+ function profilePass(entry, input, options, phase) {
7433
+ const state = { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 };
7434
+ const passOptions = options.state === void 0 ? options : { ...options, state: clonePassState(options.state) };
7435
+ const start = performance.now();
7436
+ const result = runOnce(entry, input, passOptions, phase, state);
7437
+ const { phase: _phase, ...counts } = state;
7438
+ return { result, profile: { ms: performance.now() - start, ...counts } };
7439
+ }
7440
+ function run(entry, input, options = {}) {
7441
+ if (!options.profile) return runOnce(entry, input, options);
7442
+ if (typeof entry !== "function") {
7443
+ throw new TypeError("run({ profile: true }) requires a compiled parser entry");
7444
+ }
7445
+ const recognizer = profilePass(entry, input, options, "recognizer");
7446
+ const capture = profilePass(entry, input, options, "capture");
7447
+ const host = profilePass(entry, input, options, "host");
7448
+ if (recognizer.result.ok !== host.result.ok || capture.result.ok !== host.result.ok || recognizer.result.unconsumedFrom !== host.result.unconsumedFrom || capture.result.unconsumedFrom !== host.result.unconsumedFrom) {
7449
+ throw new Error("run({ profile: true }) changed recognition; the grammar is not profile-safe");
7450
+ }
7451
+ return {
7452
+ ...host.result,
7453
+ profile: {
7454
+ recognizer: recognizer.profile,
7455
+ structuralCapture: capture.profile,
7456
+ hostConstruction: host.profile
7457
+ }
7458
+ };
7459
+ }
7343
7460
 
7344
7461
  // src/cst/trivia-index.ts
7345
7462
  function merge(map, key, run2) {