From 05ef6c2859922ab646b2e2dc13c8044ae8df500f Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Sun, 11 Oct 2026 22:11:24 -0400 Subject: [PATCH 1/2] Read an entry's Name and UUID in linear time, as the regexes read them findEntryObjectSpan reads each entry fragment's Name, and the UUID that breaks a tie between two entries of one name, with /

]*>([^<]*)<\/P>/ and its UUID twin. The match retried at every `

`, so a fragment holding many of them that no `>` follows soon cost their count times that walk. Nothing in this package calls it. data-explorer-vscode does, on a binary dictionary's data/chunk0.xml as the file holds it: on every cell edit and rename, every delete of an entry or a child, every add-child and every cut-and-paste or move (BinarySlddEditorProvider, and xmlStructuralEdit's spliceEntry, deleteEntryXml and deleteEntriesByNameXml). A plain paste only finds the insertion point. Measured on this machine: a 4,246 B binary dictionary whose first entry holds a comment of 30,000 Name opens opens in 5 ms with no warning, and then each lookup of the entry after it took 5.9 s; at 100,000 opens (6,143 B) it took 65.8 s. The UUID read took the same, 0.66 and 6.0 s at 10,000 and 30,000, and the bare pattern on 30,000 opens 5.9 s. pNodeText returns the match's group, or null, with forward indexOf's. At one start the pattern can match only one way: `[^>]*` cannot pass a `>` and `[^<]*` cannot pass a `<`, so it holds or fails on the first `>` after the open and the first `<` after that. The open starts with its only `<` and holds no `>`, so every later start before that `>` meets the same two and fails the same way, and the next start worth trying is the next open from that `<`. The same lookups take 0.1 to 0.9 ms, and a million opens (a 30,672 B file) 7.6 ms. The old and new read agree on all 78,536,544,841 strings of up to twelve tokens over `<`, `>`, `/`, `P`, the space, `Name="Name"`, `x` and the newline; for the UUID read, on all 9,817,068,105 of up to eleven with `Name="UUID"` in its place; and on all 11,111,111,111 of up to ten tokens over those and `

`, which reach several opens and closes in one string. Three wrong rewrites each disagree on 1,454 to 6,060 of the 11,111,111 of those of up to seven (trying only the first open, trying the next from one past the `<`, and ``). A fourth, trying the next from just past the `>`, agrees on all of them, as the argument says it must: no `<`, so no open, lies between that `>` and that `<`. Over the 223 .sldd of test/fixtures, test/parity/artifacts and the local corpus, 57 of them binary, the two agree on both reads of all 436,185 distinct fragments: the 242,089 the lookup slices out of the files and the 242,086 the package writes back for the entries it models. 5,516 lookups through the old and the new module, by selector and by bare name, on the 50 of those files with at most 4,000 entries, find the same spans. test/xmlEntrySplice.test.ts keeps both patterns as the specification and holds pNodeText to them on 20,000 seeded random strings. It holds a lookup past an entry with 25,000 Name opens, and the UUID read past 25,000 UUID opens, to 1 s. With the old patterns put back, together or each alone, its own case fails at 4.1 s (Name) and 4.1 to 5.5 s (UUID), and passes with the new. The two take 0.4 and 1.1 ms here at most over two full runs, so 1 s is past five times CI's time, at 3.3 times this machine's (fe238c7). --- dist/datamodel/parser/xmlEntrySplice.d.ts | 20 ++++++ dist/datamodel/parser/xmlEntrySplice.d.ts.map | 2 +- dist/datamodel/parser/xmlEntrySplice.js | 40 +++++++++-- dist/datamodel/parser/xmlEntrySplice.js.map | 2 +- src/datamodel/parser/xmlEntrySplice.ts | 38 +++++++++-- test/xmlEntrySplice.test.ts | 66 +++++++++++++++++++ 6 files changed, 158 insertions(+), 10 deletions(-) diff --git a/dist/datamodel/parser/xmlEntrySplice.d.ts b/dist/datamodel/parser/xmlEntrySplice.d.ts index 284638c6..28be434a 100644 --- a/dist/datamodel/parser/xmlEntrySplice.d.ts +++ b/dist/datamodel/parser/xmlEntrySplice.d.ts @@ -3,6 +3,26 @@ export interface XmlSpan { offset: number; length: number; } +/** + * The text of the first P-node that `open` begins, exactly as + * `fragment.match(/

]*>([^<]*)<\/P>/)?.[1] ?? null` read it for + * `open` = `

` and the `<` after it, so a fragment holding many `open`s that no `>` + * follows soon cost their count times that walk: the square of a run that the + * file's bytes decide. + * + * At one start the regex can match only one way. `[^>]*` cannot pass a `>`, so its + * `>` is the first one after `open`; `[^<]*` cannot pass a `<`, so the text ends at + * the first `<` after that, where `

` either is or is not. `open` starts with its + * only `<` and holds no `>`, so a later start either lies before that `>` (and meets + * the same `>`, the same `<` and the same answer) or lies at or after that `<`. So + * the next start worth trying is the next `open` from there, and no character is + * read more than a bounded number of times. + */ +export declare function pNodeText(fragment: string, open: string): string | null; /** * Byte span of the … the selector identifies * (a bare string means "whichever entry has this name"). diff --git a/dist/datamodel/parser/xmlEntrySplice.d.ts.map b/dist/datamodel/parser/xmlEntrySplice.d.ts.map index 7d5caa1c..1070d043 100644 --- a/dist/datamodel/parser/xmlEntrySplice.d.ts.map +++ b/dist/datamodel/parser/xmlEntrySplice.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"xmlEntrySplice.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/xmlEntrySplice.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOzE,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAyBD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,IAAI,CAoB/F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,IAAI,CAWhG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAelE"} \ No newline at end of file +{"version":3,"file":"xmlEntrySplice.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/xmlEntrySplice.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOzE,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAuBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,IAAI,CAoB/F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,IAAI,CAWhG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAelE"} \ No newline at end of file diff --git a/dist/datamodel/parser/xmlEntrySplice.js b/dist/datamodel/parser/xmlEntrySplice.js index 0c4a5c12..34d599eb 100644 --- a/dist/datamodel/parser/xmlEntrySplice.js +++ b/dist/datamodel/parser/xmlEntrySplice.js @@ -22,15 +22,47 @@ const DICTREF_OPEN = ''; // null, so such a fragment is SKIPPED rather than matched — otherwise a search // for a real entry name could land on it and splice over the wrong . function entryNameOf(fragment) { - const m = fragment.match(/

]*>([^<]*)<\/P>/); - return m ? m[1] : null; + return pNodeText(fragment, '

]*>([^<]*)<\/P>/); - return m ? m[1] : null; + return pNodeText(fragment, '

]*>([^<]*)<\/P>/)?.[1] ?? null` read it for + * `open` = `

` and the `<` after it, so a fragment holding many `open`s that no `>` + * follows soon cost their count times that walk: the square of a run that the + * file's bytes decide. + * + * At one start the regex can match only one way. `[^>]*` cannot pass a `>`, so its + * `>` is the first one after `open`; `[^<]*` cannot pass a `<`, so the text ends at + * the first `<` after that, where `

` either is or is not. `open` starts with its + * only `<` and holds no `>`, so a later start either lies before that `>` (and meets + * the same `>`, the same `<` and the same answer) or lies at or after that `<`. So + * the next start worth trying is the next `open` from there, and no character is + * read more than a bounded number of times. + */ +export function pNodeText(fragment, open) { + let at = fragment.indexOf(open); + while (at >= 0) { + const gt = fragment.indexOf('>', at + open.length); + if (gt < 0) + return null; + const lt = fragment.indexOf('<', gt + 1); + if (lt < 0) + return null; + if (fragment.startsWith('

', lt)) + return fragment.slice(gt + 1, lt); + at = fragment.indexOf(open, lt); + } + return null; } /** * Byte span of the … the selector identifies diff --git a/dist/datamodel/parser/xmlEntrySplice.js.map b/dist/datamodel/parser/xmlEntrySplice.js.map index 3ca75115..770a83df 100644 --- a/dist/datamodel/parser/xmlEntrySplice.js.map +++ b/dist/datamodel/parser/xmlEntrySplice.js.map @@ -1 +1 @@ -{"version":3,"file":"xmlEntrySplice.js","sourceRoot":"","sources":["../../../src/datamodel/parser/xmlEntrySplice.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"xmlEntrySplice.js","sourceRoot":"","sources":["../../../src/datamodel/parser/xmlEntrySplice.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/datamodel/parser/xmlEntrySplice.ts b/src/datamodel/parser/xmlEntrySplice.ts index 25af85a4..66a7aa9e 100644 --- a/src/datamodel/parser/xmlEntrySplice.ts +++ b/src/datamodel/parser/xmlEntrySplice.ts @@ -30,16 +30,46 @@ export interface XmlSpan { // null, so such a fragment is SKIPPED rather than matched — otherwise a search // for a real entry name could land on it and splice over the wrong . function entryNameOf(fragment: string): string | null { - const m = fragment.match(/

]*>([^<]*)<\/P>/); - return m ? m[1] : null; + return pNodeText(fragment, '

]*>([^<]*)<\/P>/); - return m ? m[1] : null; + return pNodeText(fragment, '

]*>([^<]*)<\/P>/)?.[1] ?? null` read it for + * `open` = `

` and the `<` after it, so a fragment holding many `open`s that no `>` + * follows soon cost their count times that walk: the square of a run that the + * file's bytes decide. + * + * At one start the regex can match only one way. `[^>]*` cannot pass a `>`, so its + * `>` is the first one after `open`; `[^<]*` cannot pass a `<`, so the text ends at + * the first `<` after that, where `

` either is or is not. `open` starts with its + * only `<` and holds no `>`, so a later start either lies before that `>` (and meets + * the same `>`, the same `<` and the same answer) or lies at or after that `<`. So + * the next start worth trying is the next `open` from there, and no character is + * read more than a bounded number of times. + */ +export function pNodeText(fragment: string, open: string): string | null { + let at = fragment.indexOf(open); + while (at >= 0) { + const gt = fragment.indexOf('>', at + open.length); + if (gt < 0) return null; + const lt = fragment.indexOf('<', gt + 1); + if (lt < 0) return null; + if (fragment.startsWith('

', lt)) return fragment.slice(gt + 1, lt); + at = fragment.indexOf(open, lt); + } + return null; } /** diff --git a/test/xmlEntrySplice.test.ts b/test/xmlEntrySplice.test.ts index 0f13ba6a..ad699739 100644 --- a/test/xmlEntrySplice.test.ts +++ b/test/xmlEntrySplice.test.ts @@ -7,6 +7,7 @@ import { findEntryObjectSpan, findEntryElementSpan, findEntryInsertionPoint, + pNodeText, } from '../src/datamodel/parser/xmlEntrySplice.js'; function chunkXml(fixture: string): string { @@ -179,3 +180,68 @@ describe('findEntryElementSpan', () => { expect(findEntryElementSpan(nested, 'NoSuchEntry')).toBeNull(); }); }); + +describe('the Name and UUID reads, on fragments that are not well-formed entries', () => { + // The two patterns `pNodeText` replaced, kept here as the specification it is held to. + // Each is quadratic on a fragment holding many opens that no `>` follows soon, which is + // why it is not the implementation; every input below is small enough for it to finish. + const SPEC: Record = { + '

]*>([^<]*)<\/P>/, + '

]*>([^<]*)<\/P>/, + }; + const viaRegex = (s: string, open: string): string | null => { + const m = s.match(SPEC[open]); + return m ? m[1] : null; + }; + + // Random strings over the pieces the patterns give meaning to, seeded so a failure + // reproduces: opens with and without their `>`, closes, and the `<` that ends a text. + it('reads what the regexes read, on random input', () => { + let seed = 1; + const rand = (n: number): number => { + seed ^= seed << 13; + seed ^= seed >>> 17; + seed ^= seed << 5; + return (seed >>> 0) % n; + }; + const pieces = [ + '

', '<', '>', '/', 'P', ' ', 'Name="Name"', + 'x', '\n', '

', '"', '', + ]; + for (let k = 0; k < 20000; k++) { + let s = ''; + for (let i = 1 + rand(30); i > 0; i--) { + s += pieces[rand(pieces.length)]; + } + for (const open of Object.keys(SPEC)) { + expect(pNodeText(s, open), JSON.stringify([open, s])).toBe(viaRegex(s, open)); + } + } + }); + + // An entry ahead of the one looked up, holding a comment of 25,000 Name opens. The + // regex retried at each and walked from each to the comment's `>`: the lookup took + // 4.1 s. Here it takes 0.4 ms over two full runs, so 1 s is past five times CI's time, + // at 3.3 times this machine's (fe238c7). + it('looks past an entry holding many Name opens at once', () => { + const run = ``; + const xml = nested.replace('

StructWithParam

'); + }); + + // The same run of UUID opens, ahead of the UUID that breaks a tie between two entries + // of one name, which is read only once the name has matched. With the regex the lookup + // took 4.1 to 5.5 s; here it takes 1.1 ms over two full runs, under the same bound. + it('reads the UUID that breaks a name tie past an entry holding many UUID opens, at once', () => { + const run = ``; + const xml = nested.replace('

([^<]*)<\/P>/.exec(nested)![1]; + const t0 = performance.now(); + const span = findEntryObjectSpan(xml, { name: 'CellWithParam', uuid }); + expect(performance.now() - t0).toBeLessThan(1000); + expect(xml.slice(span!.offset, span!.offset + span!.length)).toContain(run); + }); +}); From a60a0a87c7e355b123e23c699c6251a3bc31dc34 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Sun, 11 Oct 2026 22:17:23 -0400 Subject: [PATCH 2/2] Cut a classic mask style's options in linear time, once a slot, as the regex cut them classicMask decides whether a classic .mdl mask parameter is an expression from its style, the MaskStyleString piece its slot names, cut with `.replace(/\(.*$/, '')`. Without the `m` flag `$` is the end of the text and `.` passes no line terminator, so the cut fails at every `(` that one follows, and each failure walks to it: the square of a piece of many `(` ahead of a line break. The `(` raise the depth splitMaskStyles splits at, so no comma splits them off, and `)` after the break can bring it back down for the styles after them. The scanner unescapes `\n` and `\r` in a quoted value and keeps a raw line break between its quotes, so the file puts the break where it likes. In the file's own spelling, a backslash and an `n`, the pattern is flat, which is why it looked linear on the text as written. Opening the file runs it, once for each declaration in MaskVariables that names the slot. Measured on this machine, mdlmask_R2011b.mdl with its first style made 10,000, 30,000 and 100,000 `(`, a `\n` and as many `)` took 65 ms, 550 ms and 6.1 s to parse; a CPU profile of the second puts 552 of its 559 ms in the regex under classicMask. Fifty declarations naming the style of 10,000 took 3.1 s (a 47,549 B file), and a thousand naming one of 3,000 took 5.5 s (39,249 B). styleWithoutOptions finds the last line terminator (`\n`, `\r`, U+2028, U+2029) and cuts at the first `(` after it, which is the first `(` that no line terminator follows: where the regex cut. The same files take 3.8, 5.2 and 11 ms, and 3.9 ms for both of the others. Each slot's answer is also kept for the declarations after the first that name it. Reading a style is linear in its length, so with the cut alone those cost their product: 4.4 s for 20,000 declarations naming the style of 100,000 `(` (347,249 B), and 53 s for 100,000 naming one of 250,000 (1,127,249 B). Those take 16 and 73 ms now. The old and new cut agree on all 78,536,544,841 strings of up to twelve characters over `(`, `)`, `x`, `\n`, `\r`, U+2028, U+2029 and the space. Four wrong rewrites each disagree on 1,151,041 to 10,235,620 of the 19,173,961 of up to eight (U+2029 forgotten, `\n` alone, the first `(` from the start, and the search begun one character late); a fifth, searching from the break itself rather than one past it, agrees on all of them, as it must, since a break is not a `(`. Old and new parseMdl give the same result for a million random masks (declarations naming slots any number of times, styles holding options, breaks and stray parentheses) that hold 277,609 rows, and keeping every answer under slot 0 instead differs on 13,158 of 200,000. Over the 8 .mdl of test/parity/artifacts (test/fixtures and the local corpus hold none), 5 of them classic, and 28 more on this machine, 16 of them classic, the whole result agrees, and so does the cut on every string it is applied to (15 times, 3 distinct), on every MaskStyleString piece (4 distinct) and on every quoted value the scanner reads (896 distinct). As a wider population, it agrees on all 367,186 distinct text nodes, attribute values and lines of the 151 .slx and 8 .mdl of test/fixtures, test/parity/artifacts and the local corpus. test/mdlParser.test.ts keeps the regex as the specification and holds styleWithoutOptions to it on 20,000 seeded random strings. It holds a style of 80,000 `(` ahead of a `\n`, and 30,000 declarations naming a style of 200,000 characters, each to 1 s. The first fails at 3.9 s with the regex put back alone, the second at 5.8 s with the per-slot answer removed alone, both at 3.9 and 3.7 s with the old classicMask put back whole, and both pass with the new. They take 5 and 21 ms here at most over two full runs, so 1 s is past five times CI's time, at 3.3 times this machine's (fe238c7). --- dist/datamodel/parser/MdlParser.d.ts | 13 ++++ dist/datamodel/parser/MdlParser.d.ts.map | 2 +- dist/datamodel/parser/MdlParser.js | 30 ++++++++- dist/datamodel/parser/MdlParser.js.map | 2 +- src/datamodel/parser/MdlParser.ts | 37 +++++++++++- test/mdlParser.test.ts | 77 +++++++++++++++++++++++- 6 files changed, 154 insertions(+), 7 deletions(-) diff --git a/dist/datamodel/parser/MdlParser.d.ts b/dist/datamodel/parser/MdlParser.d.ts index b7ee8925..25286c2c 100644 --- a/dist/datamodel/parser/MdlParser.d.ts +++ b/dist/datamodel/parser/MdlParser.d.ts @@ -5,4 +5,17 @@ import type { ParsedSlx } from './SlxParser.js'; */ export type ParsedMdl = ParsedSlx; export declare function parseMdl(buffer: ArrayBuffer, filename: string): ParsedMdl; +/** + * A mask style with its options cut off, `popup(a|b)` to `popup`, exactly as + * `style.replace(/\(.*$/, '')` cut them, on every input. + * + * With no `m` flag `$` is the end of the text, and `.` passes no line terminator (`\n`, + * `\r`, U+2028, U+2029), so the regex cut at the first `(` that no line terminator + * follows. It found that `(` by trying each in turn, and each try walked to the next + * line terminator before it failed, so a style of many `(` ahead of one cost their count + * times that walk. The scanner keeps a line break inside a quoted value and unescapes + * `\n` and `\r`, so a file puts one wherever it likes. The `(` the regex cut at is the + * first after the last line terminator, which five scans of the text find. + */ +export declare function styleWithoutOptions(style: string): string; //# sourceMappingURL=MdlParser.d.ts.map \ No newline at end of file diff --git a/dist/datamodel/parser/MdlParser.d.ts.map b/dist/datamodel/parser/MdlParser.d.ts.map index 2e08a0b3..5c38c398 100644 --- a/dist/datamodel/parser/MdlParser.d.ts.map +++ b/dist/datamodel/parser/MdlParser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"MdlParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MdlParser.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAoC,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC;AAIlC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAkDzE"} \ No newline at end of file +{"version":3,"file":"MdlParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MdlParser.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAoC,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC;AAIlC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAkDzE;AAwxBD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUzD"} \ No newline at end of file diff --git a/dist/datamodel/parser/MdlParser.js b/dist/datamodel/parser/MdlParser.js index 4de529d2..99e157bc 100644 --- a/dist/datamodel/parser/MdlParser.js +++ b/dist/datamodel/parser/MdlParser.js @@ -775,6 +775,10 @@ function classicMask(block) { const values = (prop(block, 'MaskValueString') || '').split('|'); const names = []; const params = []; + // Whether a slot's style is an expression type, worked out once for each slot. Reading a + // style is linear in its length, and every declaration may name the same slot, so + // reading it once per declaration cost the product of the two. + const expression = new Map(); for (const decl of vars.split(';')) { const parsed = /^\s*([A-Za-z_]\w*)\s*=\s*([@&])(\d+)\s*$/.exec(decl); if (!parsed) { @@ -788,14 +792,36 @@ function classicMask(block) { if (evaluated !== '@' || slot < 0 || slot >= values.length) { continue; } - const type = (styles[slot] ?? 'edit').replace(/\(.*$/, '').trim().toLowerCase(); - if (!isExpressionMaskType(type)) { + let isExpression = expression.get(slot); + if (isExpression === undefined) { + const type = styleWithoutOptions(styles[slot] ?? 'edit').trim().toLowerCase(); + isExpression = isExpressionMaskType(type); + expression.set(slot, isExpression); + } + if (!isExpression) { continue; } params.push({ name, value: values[slot] }); } return { names, params }; } +/** + * A mask style with its options cut off, `popup(a|b)` to `popup`, exactly as + * `style.replace(/\(.*$/, '')` cut them, on every input. + * + * With no `m` flag `$` is the end of the text, and `.` passes no line terminator (`\n`, + * `\r`, U+2028, U+2029), so the regex cut at the first `(` that no line terminator + * follows. It found that `(` by trying each in turn, and each try walked to the next + * line terminator before it failed, so a style of many `(` ahead of one cost their count + * times that walk. The scanner keeps a line break inside a quoted value and unescapes + * `\n` and `\r`, so a file puts one wherever it likes. The `(` the regex cut at is the + * first after the last line terminator, which five scans of the text find. + */ +export function styleWithoutOptions(style) { + const from = Math.max(style.lastIndexOf('\n'), style.lastIndexOf('\r'), style.lastIndexOf('\u2028'), style.lastIndexOf('\u2029')) + 1; + const open = style.indexOf('(', from); + return open < 0 ? style : style.slice(0, open); +} /** * MaskStyleString split into one style per parameter — at the commas OUTSIDE the * parentheses, because a popup carries its options inside them (`popup(a|b)`) and an diff --git a/dist/datamodel/parser/MdlParser.js.map b/dist/datamodel/parser/MdlParser.js.map index d495dc0d..f8e573f8 100644 --- a/dist/datamodel/parser/MdlParser.js.map +++ b/dist/datamodel/parser/MdlParser.js.map @@ -1 +1 @@ -{"version":3,"file":"MdlParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MdlParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MdlParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MdlParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/datamodel/parser/MdlParser.ts b/src/datamodel/parser/MdlParser.ts index 5d0e1a2c..2c050002 100644 --- a/src/datamodel/parser/MdlParser.ts +++ b/src/datamodel/parser/MdlParser.ts @@ -862,6 +862,10 @@ function classicMask(block: MdlNode): { names: string[]; params: { name: string; const values = (prop(block, 'MaskValueString') || '').split('|'); const names: string[] = []; const params: { name: string; value: string }[] = []; + // Whether a slot's style is an expression type, worked out once for each slot. Reading a + // style is linear in its length, and every declaration may name the same slot, so + // reading it once per declaration cost the product of the two. + const expression = new Map(); for (const decl of vars.split(';')) { const parsed = /^\s*([A-Za-z_]\w*)\s*=\s*([@&])(\d+)\s*$/.exec(decl); if (!parsed) { @@ -875,8 +879,13 @@ function classicMask(block: MdlNode): { names: string[]; params: { name: string; if (evaluated !== '@' || slot < 0 || slot >= values.length) { continue; } - const type = (styles[slot] ?? 'edit').replace(/\(.*$/, '').trim().toLowerCase(); - if (!isExpressionMaskType(type)) { + let isExpression = expression.get(slot); + if (isExpression === undefined) { + const type = styleWithoutOptions(styles[slot] ?? 'edit').trim().toLowerCase(); + isExpression = isExpressionMaskType(type); + expression.set(slot, isExpression); + } + if (!isExpression) { continue; } params.push({ name, value: values[slot] }); @@ -884,6 +893,30 @@ function classicMask(block: MdlNode): { names: string[]; params: { name: string; return { names, params }; } +/** + * A mask style with its options cut off, `popup(a|b)` to `popup`, exactly as + * `style.replace(/\(.*$/, '')` cut them, on every input. + * + * With no `m` flag `$` is the end of the text, and `.` passes no line terminator (`\n`, + * `\r`, U+2028, U+2029), so the regex cut at the first `(` that no line terminator + * follows. It found that `(` by trying each in turn, and each try walked to the next + * line terminator before it failed, so a style of many `(` ahead of one cost their count + * times that walk. The scanner keeps a line break inside a quoted value and unescapes + * `\n` and `\r`, so a file puts one wherever it likes. The `(` the regex cut at is the + * first after the last line terminator, which five scans of the text find. + */ +export function styleWithoutOptions(style: string): string { + const from = + Math.max( + style.lastIndexOf('\n'), + style.lastIndexOf('\r'), + style.lastIndexOf('\u2028'), + style.lastIndexOf('\u2029'), + ) + 1; + const open = style.indexOf('(', from); + return open < 0 ? style : style.slice(0, open); +} + /** * MaskStyleString split into one style per parameter — at the commas OUTSIDE the * parentheses, because a popup carries its options inside them (`popup(a|b)`) and an diff --git a/test/mdlParser.test.ts b/test/mdlParser.test.ts index 6fd358ea..1b8076dc 100644 --- a/test/mdlParser.test.ts +++ b/test/mdlParser.test.ts @@ -17,7 +17,7 @@ // of the same diagram — are test/parity/mdl.parity.test.ts. import { describe, it, expect } from 'vitest'; import { strToU8, zipSync } from 'fflate'; -import { parseMdl } from '../src/datamodel/parser/MdlParser.js'; +import { parseMdl, styleWithoutOptions } from '../src/datamodel/parser/MdlParser.js'; import { parseModel } from '../src/datamodel/parser/ModelParser.js'; import { parseSlx } from '../src/datamodel/parser/SlxParser.js'; @@ -453,6 +453,81 @@ describe('parseMdl — classic .mdl block parameters', () => { }); }); +describe('parseMdl — classic .mdl mask styles', () => { + // The cut `styleWithoutOptions` replaced, kept here as the specification it is held to. + // It is quadratic on a style of many `(` ahead of a line terminator, which is why it is + // not the implementation; every input below is small enough for it to finish. + const viaRegex = (s: string): string => s.replace(/\(.*$/, ''); + + // Random strings over the characters the cut gives meaning to, all four line + // terminators among them, seeded so a failure reproduces. + it('cuts a style where the regex cut it, on random input', () => { + let seed = 1; + const rand = (n: number): number => { + seed ^= seed << 13; + seed ^= seed >>> 17; + seed ^= seed << 5; + return (seed >>> 0) % n; + }; + const pieces = ['(', ')', 'x', ' ', '\n', '\r', '\u2028', '\u2029', 'popup(', 'edit', '|', ',']; + for (let k = 0; k < 20000; k++) { + let s = ''; + for (let i = 1 + rand(30); i > 0; i--) { + s += pieces[rand(pieces.length)]; + } + expect(styleWithoutOptions(s), JSON.stringify(s)).toBe(viaRegex(s)); + } + }); + + // One masked block, its three mask properties spelled as given: escapes and all, since + // the scanner unescapes them. + const masked = (styles: string, vars: string, values: string): ArrayBuffer => + bytes(`Model { + Name "m" + System { + Name "m" + Block { + BlockType SubSystem + Name "Masked" + SID "1" + MaskStyleString "${styles}" + MaskVariables "${vars}" + MaskValueString "${values}" + } + } +} +`); + + // `\(.*$` failed at every `(` that a line terminator follows, and each failure walked to + // it. The scanner unescapes `\n`, so the first style below holds 80,000 `(` ahead of + // one: with the regex it took 3.9 s to read. Here it takes 5 ms over two full runs, so + // 1 s is past five times CI's time, at 3.3 times this machine's (fe238c7). + it('reads a style of many `(` ahead of a line break at once, and the style after it', () => { + const n = 80_000; + const t0 = performance.now(); + const parsed = parseMdl(masked('('.repeat(n) + '\\n' + ')'.repeat(n) + ',edit', 'k=@1;g=@2;', 'Kp|Kg'), 'm.mdl'); + expect(performance.now() - t0).toBeLessThan(1000); + // `k`'s style is no expression type, so only `g` is a row; both are in scope. + expect(parsed.blockParamUsages).toEqual([ + { blockName: 'Masked', blockType: 'SubSystem', paramProperty: 'g', paramValue: 'Kg', sid: '1', systemPath: '' }, + ]); + expect(parsed.masks.map((m) => m.names)).toEqual([['k', 'g']]); + }); + + // A style was read again for every declaration naming its slot, and reading one is + // linear in its length, so the two multiplied: 30,000 declarations naming a style of + // 200,000 characters took 3.7 s with the regex. Each slot's style is read once now, and + // this takes 21 ms over two full runs, so 1 s is past five times CI's time, at 3.3 + // times this machine's (fe238c7). + it('reads one long style named by many declarations at once', () => { + const t0 = performance.now(); + const parsed = parseMdl(masked(`edit(${'x'.repeat(200_000)})`, 'k=@1;'.repeat(30_000), 'Kp'), 'm.mdl'); + expect(performance.now() - t0).toBeLessThan(1000); + expect(parsed.blockParamUsages).toHaveLength(30_000); + expect(new Set(parsed.blockParamUsages.map((u) => `${u.paramProperty}=${u.paramValue}`))).toEqual(new Set(['k=Kp'])); + }); +}); + describe('parseMdl — classic .mdl grammar edge cases', () => { it('reads a Library the same way as a Model', () => { const parsed = parseMdl(bytes('Library {\n Name "lib"\n Creator "someone"\n}\n'), 'lib.mdl');