From f62acb27214737f217b35f09711b8b32d31e606b Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Fri, 18 Sep 2026 15:09:21 -0400 Subject: [PATCH] Read an array inside a cell in a binary .sldd: its shape, its parts and its count Three defects with one cause, found by generalizing defect 52 rather than by a report. parseCellElement is a hand-rolled copy of the class dispatch the entry site and the property/field site share, so every idea added to the shared dispatch has to be added to the copy by hand -- and the copy lags. 52 was the missing `string` idea; these are the missing "a dimensioned element set" idea, which the shared dispatch has in one place (parseArrayOfElements) and the copy had in three half-right ways. All three are binary-only, the text channel being right for all of them. All three are wrong on screen AND lossy in the file, with no edit required -- merely saving a dictionary that contained one changed the data. And all three were hidden by their own 1x1 control, which is why they are stated together. 53. A complex ARRAY in a cell lost its imaginary parts. The copy asked the shape before the complexity, so a dimensioned element went to the shaped arm, whose numericBody runs each token through parseFloat, which stops at the `+`: {[1+2i 3-4i]} displayed {[1 3]} and went back out as Class="double" Dimension="1*2">1.0 3.0, IsComplex gone too. A complex SCALAR was right the whole time because MATLAB writes one with no Dimension at all, so it fell past the shaped arm and reached the IsComplex check by accident of ordering. 54. A struct ARRAY in a cell was published as <1x1 struct>: a hardcoded [1, 1] where the shared dispatch reads the element's own Dimension. The wrong summary was the harmless half -- the envelope's dims are what the writer spells, so a save emitted the structs a level too deep and the next open found neither of them. 55. An object ARRAY in a cell showed only its first object, because the tail took childElements[0]. {[Simulink.Parameter(1) Simulink.Parameter(2)]} read as though the cell held a scalar, and every object after the first was gone from the file on any save. Fixed as one idea: complexity before shape, the struct arm reads the element's Dimension, and the object tail delegates a dimensioned multi-child element to parseArrayOfElements -- the same helper the property path uses -- rather than becoming a fourth copy of the decision. The writer needed no change; once the model carried the right dims, class and count, it already spelled all three of MATLAB's forms. probe_cell_arrays.m records the three spellings MATLAB uses (they differ from each other, so a branch keyed on the wrong one would be no fix) and wrote cellarr_{text,binary}.sldd -- one dictionary in both flavours, which is what lets the channels be asserted against EACH OTHER instead of each against its own literal. Five tests in binaryWriteBackGate.test.ts, each failing with any one of the three edits reverted: MATLAB's values read back, the two channels equal, the three write spellings, every entry byte-for-byte against MATLAB's own chunk, and a reopen of the rebuilt chunk. --- .../parser/BinarySlddParser.d.ts.map | 2 +- dist/datamodel/parser/BinarySlddParser.js | 50 +- dist/datamodel/parser/BinarySlddParser.js.map | 2 +- src/datamodel/parser/BinarySlddParser.ts | 50 +- test/binaryWriteBackGate.test.ts | 220 ++++++- test/fixtures/cellarr_binary.sldd | Bin 0 -> 4124 bytes test/fixtures/cellarr_text.sldd | 571 ++++++++++++++++++ test/parity/matlab/DESIGN.md | 75 +++ test/parity/matlab/README.md | 1 + test/parity/matlab/probe_cell_arrays.m | 216 +++++++ 10 files changed, 1155 insertions(+), 32 deletions(-) create mode 100644 test/fixtures/cellarr_binary.sldd create mode 100644 test/fixtures/cellarr_text.sldd create mode 100644 test/parity/matlab/probe_cell_arrays.m diff --git a/dist/datamodel/parser/BinarySlddParser.d.ts.map b/dist/datamodel/parser/BinarySlddParser.d.ts.map index 80fd5cb..631b39f 100644 --- a/dist/datamodel/parser/BinarySlddParser.d.ts.map +++ b/dist/datamodel/parser/BinarySlddParser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BinarySlddParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuChE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,YAAY,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAQD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,QAAQ,CAAC,EAAE,YAAY,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwIzB;AA0UD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAExE"} \ No newline at end of file +{"version":3,"file":"BinarySlddParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuChE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,YAAY,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAQD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,QAAQ,CAAC,EAAE,YAAY,EAAE,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwIzB;AAkXD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAExE"} \ No newline at end of file diff --git a/dist/datamodel/parser/BinarySlddParser.js b/dist/datamodel/parser/BinarySlddParser.js index fb09278..18da1b6 100644 --- a/dist/datamodel/parser/BinarySlddParser.js +++ b/dist/datamodel/parser/BinarySlddParser.js @@ -463,6 +463,24 @@ function parseCellElement(el) { const dimension = el['@_Dimension'] || null; const text = getTextContent(el); if (isNumericClass(elClass)) { + // Complexity is asked BEFORE the shape, the way parsePropContent asks it one level + // up. A complex value states its elements as text whatever its shape + // (`IsComplex="1" Dimension="1*2">1.0+2.0i 3.0-4.0i`), and the shaped arm below + // reads a body with numericBody, whose parseFloat stops at the `+`: every complex + // ARRAY in a cell came back with its imaginary parts gone — `{[1+2i 3-4i]}` read + // `{[1 3]}` and re-serialized `Class="double" Dimension="1*2">1.0 3.0`, IsComplex + // and the imaginary parts both gone from the file. A complex SCALAR was right the + // whole time, because MATLAB writes one with no Dimension at all and it reached + // this check by falling past the shaped arm; that is the only reason the defect + // hid. `_dimensions` rides in the envelope because the cdata form is the only + // place a complex value's shape can be stated. + if (el['@_IsComplex'] === '1') { + const cdata = { _type: 'cdata', _value: text }; + if (dimension) { + cdata._dimensions = parseDims(dimension); + } + return cdata; + } if (dimension) { const dimParts = parseDims(dimension); const total = dimParts.reduce((a, b) => a * b, 1); @@ -478,9 +496,6 @@ function parseCellElement(el) { } return formatMatrix(rowMajor, dimParts, elClass); } - if (el['@_IsComplex'] === '1') { - return { _type: 'cdata', _value: text }; - } return formatTypedScalar(text, elClass); } if (elClass === 'logical') { @@ -498,7 +513,14 @@ function parseCellElement(el) { return charValue(text, dimension); } if (elClass === 'struct') { - return structValue(el.Element || [], [1, 1]); + // A struct ARRAY in a cell states its shape on the element itself + // (`` over one per element), + // exactly as a struct-array PROPERTY states it on the

— which is why the + // field and property sites were right and this one was not. The hardcoded 1x1 + // published a 1x2 as `<1x1 struct>`, and because the envelope's dims are what + // the writer spells, the save wrote one struct with the elements a level too + // deep: both of them unreadable on the next open. + return structValue(el.Element || [], dimension ? parseDims(dimension) : [1, 1]); } if (elClass === 'cell') { const childElements = el.Element || []; @@ -517,7 +539,25 @@ function parseCellElement(el) { if (childElements[0]['@_Class'] === 'string') { return parseStringValue(childElements[0], dimension); } - return parseElement(childElements[0]); + // An object ARRAY, spelled the way MATLAB spells one in a cell: a classless + // `` over one classed per object. That is the + // same shape parsePropContent hands to parseArrayOfElements a level up, so it goes + // to the same helper rather than to a fourth copy of the decision. Taking [0] + // alone was silent deletion, not a display bug: + // `{[Simulink.Parameter(1) Simulink.Parameter(2)]}` showed the FIRST parameter's + // value as though the cell held a scalar, and the second object was gone from the + // file after any save. + if (dimension && childElements.length > 1) { + return parseArrayOfElements(childElements, dimension, elClass || null); + } + if (childElements.length === 1) { + return parseElement(childElements[0]); + } + // Several objects with no declared shape. MATLAB does not write this, but a reader + // still has to pick a shape the writer can spell, and Nx1 is the one both the entry + // path and the property path pick for the same undimensioned case — parseElement on + // [0] would have dropped the rest. + return objectArrayValue(childElements, [childElements.length, 1]); } return text || ''; } diff --git a/dist/datamodel/parser/BinarySlddParser.js.map b/dist/datamodel/parser/BinarySlddParser.js.map index 72c4cb4..becbbc3 100644 --- a/dist/datamodel/parser/BinarySlddParser.js.map +++ b/dist/datamodel/parser/BinarySlddParser.js.map @@ -1 +1 @@ -{"version":3,"file":"BinarySlddParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"BinarySlddParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/BinarySlddParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/datamodel/parser/BinarySlddParser.ts b/src/datamodel/parser/BinarySlddParser.ts index 98535d2..ac96ce8 100644 --- a/src/datamodel/parser/BinarySlddParser.ts +++ b/src/datamodel/parser/BinarySlddParser.ts @@ -538,6 +538,24 @@ function parseCellElement(el: XmlNode): unknown { const text = getTextContent(el); if (isNumericClass(elClass)) { + // Complexity is asked BEFORE the shape, the way parsePropContent asks it one level + // up. A complex value states its elements as text whatever its shape + // (`IsComplex="1" Dimension="1*2">1.0+2.0i 3.0-4.0i`), and the shaped arm below + // reads a body with numericBody, whose parseFloat stops at the `+`: every complex + // ARRAY in a cell came back with its imaginary parts gone — `{[1+2i 3-4i]}` read + // `{[1 3]}` and re-serialized `Class="double" Dimension="1*2">1.0 3.0`, IsComplex + // and the imaginary parts both gone from the file. A complex SCALAR was right the + // whole time, because MATLAB writes one with no Dimension at all and it reached + // this check by falling past the shaped arm; that is the only reason the defect + // hid. `_dimensions` rides in the envelope because the cdata form is the only + // place a complex value's shape can be stated. + if (el['@_IsComplex'] === '1') { + const cdata: Record = { _type: 'cdata', _value: text }; + if (dimension) { + cdata._dimensions = parseDims(dimension); + } + return cdata; + } if (dimension) { const dimParts = parseDims(dimension); const total = dimParts.reduce((a, b) => a * b, 1); @@ -553,9 +571,6 @@ function parseCellElement(el: XmlNode): unknown { } return formatMatrix(rowMajor, dimParts, elClass); } - if (el['@_IsComplex'] === '1') { - return { _type: 'cdata', _value: text }; - } return formatTypedScalar(text, elClass); } if (elClass === 'logical') { @@ -573,7 +588,14 @@ function parseCellElement(el: XmlNode): unknown { return charValue(text, dimension); } if (elClass === 'struct') { - return structValue(el.Element || [], [1, 1]); + // A struct ARRAY in a cell states its shape on the element itself + // (`` over one per element), + // exactly as a struct-array PROPERTY states it on the

— which is why the + // field and property sites were right and this one was not. The hardcoded 1x1 + // published a 1x2 as `<1x1 struct>`, and because the envelope's dims are what + // the writer spells, the save wrote one struct with the elements a level too + // deep: both of them unreadable on the next open. + return structValue(el.Element || [], dimension ? parseDims(dimension) : [1, 1]); } if (elClass === 'cell') { const childElements = el.Element || []; @@ -592,7 +614,25 @@ function parseCellElement(el: XmlNode): unknown { if (childElements[0]['@_Class'] === 'string') { return parseStringValue(childElements[0], dimension); } - return parseElement(childElements[0]); + // An object ARRAY, spelled the way MATLAB spells one in a cell: a classless + // `` over one classed per object. That is the + // same shape parsePropContent hands to parseArrayOfElements a level up, so it goes + // to the same helper rather than to a fourth copy of the decision. Taking [0] + // alone was silent deletion, not a display bug: + // `{[Simulink.Parameter(1) Simulink.Parameter(2)]}` showed the FIRST parameter's + // value as though the cell held a scalar, and the second object was gone from the + // file after any save. + if (dimension && childElements.length > 1) { + return parseArrayOfElements(childElements, dimension, elClass || null); + } + if (childElements.length === 1) { + return parseElement(childElements[0]); + } + // Several objects with no declared shape. MATLAB does not write this, but a reader + // still has to pick a shape the writer can spell, and Nx1 is the one both the entry + // path and the property path pick for the same undimensioned case — parseElement on + // [0] would have dropped the rest. + return objectArrayValue(childElements, [childElements.length, 1]); } return text || ''; } diff --git a/test/binaryWriteBackGate.test.ts b/test/binaryWriteBackGate.test.ts index 37bed07..8a3ecb5 100644 --- a/test/binaryWriteBackGate.test.ts +++ b/test/binaryWriteBackGate.test.ts @@ -405,6 +405,26 @@ describe('a string Parameter value survives the binary write-back', () => { // OBJECT is a classless `` wrapping the object's own ``. // That shape is why the tail was right for every other class, and why the fix lifts // `string` out of it rather than replacing it. +/** + * The `` block of one entry, from a chunk either MATLAB or we wrote, with its + * LastMod stamp dropped — a rebuild restamps a modified entry, by design, so the stamp is + * the one line that cannot match and the only one whose mismatch means nothing. + */ +function entryObject(xml: string, name: string): string { + const at = xml.indexOf('>' + name + '

'); + expect(at, name).toBeGreaterThan(-1); + const open = xml.lastIndexOf('', at) + ''.length); + return block.replace(/\s*

]*>[^<]*<\/P>/, ''); +} + +/** MATLAB's own chunk for a fixture, to diff a rebuild against. */ +function matlabChunk(fixture: string): string { + const p = fileURLToPath(new URL('./' + fixture, import.meta.url)); + const zip = unzipSync(new Uint8Array(readFileSync(p))); + return new TextDecoder().decode(zip['data/chunk0.xml']); +} + describe('defect 52: a string in a cell keeps its text, in the file as well as on screen', () => { // MATLAB's own value for each, as `getValue()` reports it in probe_cell_string.m's // read-back — `cell[1 1] of {string[1 1]}` and so on. @@ -415,26 +435,6 @@ describe('defect 52: a string in a cell keeps its text, in the file as well as o ['cMixed', '{1, "a", \'b\'}'], // beside a double and a char, neither of which it may become ]; - /** - * The `` block of one entry, from a chunk either MATLAB or we wrote, with its - * LastMod stamp dropped — a rebuild restamps a modified entry, by design, so the stamp is - * the one line that cannot match and the only one whose mismatch means nothing. - */ - function entryObject(xml: string, name: string): string { - const at = xml.indexOf('>' + name + '

'); - expect(at, name).toBeGreaterThan(-1); - const open = xml.lastIndexOf('', at) + ''.length); - return block.replace(/\s*

]*>[^<]*<\/P>/, ''); - } - - /** MATLAB's own chunk for a fixture, to diff a rebuild against. */ - function matlabChunk(fixture: string): string { - const p = fileURLToPath(new URL('./' + fixture, import.meta.url)); - const zip = unzipSync(new Uint8Array(readFileSync(p))); - return new TextDecoder().decode(zip['data/chunk0.xml']); - } - it('reads MATLAB\'s own bytes as strings, not as <1x1 string>', () => { const sldd = loadFile('../fixtures/cellstr_binary.sldd', 'cellstr_binary.sldd'); for (const [name, display] of CELLS) { @@ -534,3 +534,183 @@ describe('defect 52: a string in a cell keeps its text, in the file as well as o } }); }); + +// Defects 53, 54 and 55 — the generalization of 52, found by asking what ELSE the cell +// site is missing rather than what else is wrong with strings. `parseCellElement` is a +// hand-rolled copy of the class dispatch the entry site (`parseEntryValue`) and the +// property/field site (`parsePropContent`) share, so every idea added to the shared +// dispatch has to be added to the copy by hand — and the copy lagged by three: +// +// 53 a complex ARRAY in a cell lost its imaginary parts. The copy asked the SHAPE +// before the complexity, and a complex body (`1.0+2.0i 3.0-4.0i`) read through +// numericBody means parseFloat stopping at the `+`: `{[1+2i 3-4i]}` displayed +// `{[1 3]}` and went back out as `Class="double" Dimension="1*2">1.0 3.0`, with +// IsComplex gone too. A complex SCALAR was right the whole time — MATLAB writes one +// with NO Dimension, so it fell past the shaped arm and reached the IsComplex check. +// That control is the only reason this sat undetected. +// 54 a struct ARRAY in a cell was published as `<1x1 struct>`: the copy passed a +// hardcoded [1, 1] where the shared dispatch reads the element's own Dimension. The +// display was the harmless half — the envelope's dims are what the writer spells, so +// a save wrote ONE struct with the elements a level too deep and the next open found +// neither of them. +// 55 an object ARRAY in a cell showed only its first object, because the copy's tail +// took `childElements[0]`. `{[Simulink.Parameter(1) Simulink.Parameter(2)]}` read as +// though the cell held a scalar, and every object after the first was gone from the +// file on any save. +// +// All three are binary-only; the TEXT channel was right for all of them, which is this +// repo's recurring shape — two channels spelling one value independently. So the invariant +// is pinned BETWEEN the channels here, not per channel. +// +// The fix is one idea, not three: "a dimensioned element set", which the shared dispatch +// already had in `parseArrayOfElements`. `test/parity/matlab/probe_cell_arrays.m` records +// the three spellings MATLAB uses for it and wrote both fixtures. +describe('defects 53-55: an array inside a cell keeps its shape, its parts and its count', () => { + // MATLAB's own value for each, from probe_cell_arrays.m's read-back through + // `getValue()` — `cell[1 1]{double[1 2]=[1+2i 3-4i]}` and so on. + const DEFECTS: Array<[string, string]> = [ + ['cCplxArr', '{[1+2i 3-4i]}'], // 53, read `{[1 3]}` + ['cCplxCol', '{[1+2i; 3-4i]}'], // ... a column, to show the shape is not the trigger + ['cCplxNd', '{<2x2x2 double>}'], // ... and rank 3 + ['cStructArr', '{<1x2 struct>}'], // 54, read `{<1x1 struct>}` + ['cStructArr2D', '{<2x2 struct>}'], // ... 2-D, so the dims are read and not counted + ['cObjArr', '{<1x2 Simulink.Parameter>}'], // 55, read `{1}` — the first object alone + ]; + + // The 1x1 of each row above. Each was right BEFORE the fix, and each is why its defect + // was invisible; all three must still be right after it. + const CONTROLS: Array<[string, string]> = [ + ['cCplx', '{1+2i}'], // 53's control: no Dimension, so it reached the IsComplex check + ['cStruct', '{<1x1 struct>}'], // 54's: the hardcoded 1x1 happened to be the truth + ['cObj', '{5}'], // 55's: one child, so taking the first was taking all of them + ['cNd', '{<2x3x2 double>}'], // a REAL N-D array still takes the shaped arm + ['cStr', '{"a"}'], // and defect 52's case still gets lifted out of the tail + ]; + + it('reads MATLAB\'s own bytes as the values MATLAB wrote', () => { + const sldd = loadFile('../fixtures/cellarr_binary.sldd', 'cellarr_binary.sldd'); + for (const [name, display] of [...DEFECTS, ...CONTROLS]) { + expect(String(findEntry(sldd, name).displayValue), name).toBe(display); + } + + // The element rows, because an entry row is assembled FROM them: the class and the + // count are what the three defects destroyed, and a summary string can be right for + // the wrong reason. + const element = (name: string): any => findEntry(sldd, name).children[0]; + expect(element('cCplxArr').children.map((c: any) => String(c.displayValue))).toEqual([ + '1+2i', + '3-4i', + ]); + expect(element('cStructArr').children).toHaveLength(2); + expect(element('cStructArr2D').children).toHaveLength(4); + // Each object, and each object's own value — `{1}` was the first object's value shown + // as if it were the cell's, so the count is the assertion that fails without the fix. + expect(element('cObjArr').className).toBe('Simulink.Parameter'); + expect(element('cObjArr').children.map((c: any) => String(c.displayValue))).toEqual(['1', '2']); + }); + + it('and reads them the same way the TEXT channel does', () => { + // The invariant stated between the channels. Whole subtrees, not just the entry rows: + // 54 and 55 both left the entry row's SHAPE plausible while the contents underneath + // were wrong or missing. + const bin = loadFile('../fixtures/cellarr_binary.sldd', 'cellarr_binary.sldd'); + const txt = loadFile('../fixtures/cellarr_text.sldd', 'cellarr_text.sldd'); + + // The walk stops at a SCALAR struct, and nowhere else. That is the one place the two + // channels are known to disagree for a reason unrelated to cells: the build of MATLAB + // that wrote these fixtures no longer emits `_fields` in a text dictionary, and + // StructNode.parse builds a scalar struct's field children from `_fields` alone, so the + // text channel shows a scalar struct with no field rows while the binary channel + // derives the list from the element bag. Its own defect, its own blast radius (every + // struct in every current-MATLAB text .sldd), not asserted either way here. + const shown = (root: any, name: string): string[] => { + const out: string[] = []; + const walk = (n: any, path: string): void => { + out.push(path + ' ' + String(n.displayValue) + ' | ' + String(n.dataType ?? '') + ' | ' + String(n.className ?? '')); + if (n.dataType === 'struct' && String(n.displayValue) === '<1x1 struct>') { + return; + } + for (const c of n.children ?? []) { + walk(c, path + '/' + c.name); + } + }; + walk(findEntry(root, name), name); + return out; + }; + + for (const [name] of [...DEFECTS, ...CONTROLS]) { + expect(shown(bin, name), name).toEqual(shown(txt, name)); + } + // And a row count, so a walk that silently visited only the entry rows could not pass: + // the six defect cases have 32 rows between them (an entry and its element each, plus + // 2 + 2 + 8 numeric parts, 2 + 4 struct elements, and 2 objects). + expect(DEFECTS.reduce((n, [name]) => n + shown(bin, name).length, 0)).toBe(32); + }); + + it('writes each array back the way MATLAB spells it', () => { + // The silent half. Nothing is edited — before the fix, merely SAVING any of these + // dictionaries changed the data, so the rebuild probe_writeback_bin hands MATLAB is + // where the loss shows. + const xml = rebuildXml('fixtures/cellarr_binary.sldd'); + + // 53: the complexity and the shape on the same element, the parts as text. + expect(entryObject(xml, 'cCplxArr')).toContain( + '1.0+2.0i 3.0-4.0i', + ); + // The spelling the defect produced, which is the one that must never reach a file: + // a real array where MATLAB wrote a complex one. + expect(entryObject(xml, 'cCplxArr')).not.toContain('>1.0 3.0<'); + expect(entryObject(xml, 'cCplxCol')).toContain('IsComplex="1" Dimension="2*1"'); + expect(entryObject(xml, 'cCplxNd')).toContain('IsComplex="1" Dimension="2*2*2"'); + + // 54: the shape on the element that declares the class, one child per struct — and + // NOT a `Class="struct"` with no Dimension, which is what the hardcoded 1x1 wrote and + // what put the elements a level too deep. + expect(entryObject(xml, 'cStructArr')).toContain(''); + expect(entryObject(xml, 'cStructArr2D')).toContain(''); + expect(entryObject(xml, 'cStructArr')).not.toMatch(//); + + // 55: a CLASSLESS wrapper carrying the shape, over one classed object each. Counted, + // because the defect wrote a well-formed wrapper containing only the first object. + expect(entryObject(xml, 'cObjArr')).toContain(''); + expect(entryObject(xml, 'cObjArr').match(//g)).toHaveLength( + 2, + ); + }); + + it('byte for byte MATLAB\'s own, for every entry in the fixture', () => { + // The strongest form: the rebuilt entry IS MATLAB's bytes. One difference is normalized + // away, and it predates all three defects — on a 1x1 cell we write `Dimension="1*1"` + // where MATLAB writes no attribute at all. That is save churn, not data loss (an absent + // Dimension is read back as 1x1), and since every entry here is a 1x1 cell, leaving it + // unnormalized would mean comparing nothing instead of comparing everything. + const ours = rebuildXml('fixtures/cellarr_binary.sldd'); + const theirs = matlabChunk('fixtures/cellarr_binary.sldd'); + const churn = (block: string): string => + block.replace(/Class="cell" Dimension="1\*1"/g, 'Class="cell"'); + for (const [name] of [...DEFECTS, ...CONTROLS]) { + expect(churn(entryObject(ours, name)), name).toBe(churn(entryObject(theirs, name))); + } + // The sibling sites too, unnormalized: they were already right, and a fix that reached + // the shared helper would break them here rather than quietly. + for (const name of ['sObjArr', 'sStructArr', 'pCplxArr']) { + expect(entryObject(ours, name), name).toBe(entryObject(theirs, name)); + } + }); + + it('and the rebuilt chunk reopens as the values MATLAB wrote', () => { + // End to end: read MATLAB's file, write it back untouched, read that. This is the one + // that fails loudest without the fix — 54 and 55 both wrote chunks that PARSE, and + // reopen missing their data. + const xml = rebuildXml('fixtures/cellarr_binary.sldd'); + const uri = 'mem://cellarr-reopen'; + DataModel.removeDataSource(uri); + const reopened = DataModel.addDataSource(uri, parseBinarySlddParts(xml, {}), { + path: 'cellarr_binary.sldd', + }); + for (const [name, display] of [...DEFECTS, ...CONTROLS]) { + expect(String(findByName(reopened, name).displayValue), name).toBe(display); + } + expect(findByName(reopened, 'cObjArr').children[0].children).toHaveLength(2); + }); +}); diff --git a/test/fixtures/cellarr_binary.sldd b/test/fixtures/cellarr_binary.sldd new file mode 100644 index 0000000000000000000000000000000000000000..7676b02ef3b9771d442be8aba3ea4703fdd743d8 GIT binary patch literal 4124 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/cellarr_text.sldd b/test/fixtures/cellarr_text.sldd new file mode 100644 index 0000000..af77a73 --- /dev/null +++ b/test/fixtures/cellarr_text.sldd @@ -0,0 +1,571 @@ +{ + "__MW_TEXT_COREPROPERTIES__": { + "release": "R2027a" + }, + "__MW_TEXT_PARTS__": { + "__MW_TEXT_PART__/data/chunk0": { + "__MW_TEXT_content": { + "entries": [ + { + "name": "cCplx", + "metadata": { + "uuid": "f4c23b1b-73d2-455b-827c-7beff127f8c2", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048729", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_type": "cdata", + "_value": " %)30 . 2 8 ( !@@ % \" $ ! 0 ) \" / _\"0 @ 0 \u0000\u0000\u0000" + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cCplxArr", + "metadata": { + "uuid": "197c91b2-3873-4f5f-ac37-2467b2186ac8", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.046755", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_type": "cdata", + "_value": " %)30 . 6 8 ( !@@ % \" $ \" 0 ) $ / _ \"$ ) $ ! $, \u0000\u0000" + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cCplxCol", + "metadata": { + "uuid": "b72a8c5a-b89d-47ab-9504-901a8789b182", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.047777", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_type": "cdata", + "_value": " %)30 . 6 8 ( !@@ % \" ( ! 0 ) $ / _ \"$ ) $ ! $, \u0000\u0000" + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cCplxNd", + "metadata": { + "uuid": "a1ea7615-6aa5-4c97-abe5-668183d26259", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.047898", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_type": "cdata", + "_value": " %)30 . P 8 ( !@@ % # ( \" @ ! D ! \\#\\ 0 A $$ 40 !A '$ @0 D ! \\#\\ 0 A $$ 40 !A '$ @0 \u0000\u0000\u0000" + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cNd", + "metadata": { + "uuid": "df796a76-91be-4fe2-b2eb-df2dfe98f294", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.049153", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_type": "cdata", + "_value": " %)30 . F 8 ( !@ % # ( # @ ! D !@ \\#\\ 0 A $$ 40 !A '$ @0 \") )$ F0 \"A \u0000" + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cObj", + "metadata": { + "uuid": "9e7d6ac3-e483-4cd7-8283-996eda82b975", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048939", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_array_class": "Simulink.Parameter", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_id": "1", + "_properties": { + "CoderInfo": { + "_id": "2", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "3", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "real", + "Dimensions": [ + 1, + 1 + ], + "Value": 5 + } + } + ] + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cObjArr", + "metadata": { + "uuid": "13de0d1c-1fac-4c76-ae3e-8aadb0781c61", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048217", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_array_class": "Simulink.Parameter", + "_dimensions": [ + 1, + 2 + ], + "_elements": [ + { + "_id": "1", + "_properties": { + "CoderInfo": { + "_id": "2", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "3", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "real", + "Dimensions": [ + 1, + 1 + ], + "Value": 1 + } + }, + { + "_id": "4", + "_properties": { + "CoderInfo": { + "_id": "5", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "6", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "real", + "Dimensions": [ + 1, + 1 + ], + "Value": 2 + } + } + ] + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cStr", + "metadata": { + "uuid": "b98613ac-55ed-4787-bca7-e597b8217e91", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.049254", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + [ + "a" + ] + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cStruct", + "metadata": { + "uuid": "31042176-1572-44f9-94b1-793e7a8cb68b", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048832", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_array_type": "Struct", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "a": 1 + } + ] + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cStructArr", + "metadata": { + "uuid": "d0497ada-59cd-4f26-bcd7-abb5bcdd059f", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048006", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_array_type": "Struct", + "_dimensions": [ + 1, + 2 + ], + "_elements": [ + { + "a": 1 + }, + { + "a": 2 + } + ] + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "cStructArr2D", + "metadata": { + "uuid": "7bbf0c23-d549-4deb-bf6e-e271265118fc", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.048114", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Cell", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_array_type": "Struct", + "_dimensions": [ + 2, + 2 + ], + "_elements": [ + { + "a": 1 + }, + { + "a": 3 + }, + { + "a": 2 + }, + { + "a": 4 + } + ] + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "pCplxArr", + "metadata": { + "uuid": "58809ad7-f348-47a2-92f0-5fbf6c5a70f6", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.049818", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_class": "Simulink.Parameter", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "_id": "1", + "_properties": { + "CoderInfo": { + "_id": "2", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "3", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "complex", + "Dimensions": [ + 1, + 2 + ], + "Value": { + "_type": "cdata", + "_value": " %)30 . 6 8 ( !@@ % \" $ \" 0 ) $ / _ \"$ ) $ ! $, \u0000\u0000" + } + } + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "sObjArr", + "metadata": { + "uuid": "bef1ec77-804f-4f0f-8d63-1ac88210ba44", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.049417", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Struct", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "f": { + "_array_class": "Simulink.Parameter", + "_dimensions": [ + 1, + 2 + ], + "_elements": [ + { + "_id": "1", + "_properties": { + "CoderInfo": { + "_id": "2", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "3", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "real", + "Dimensions": [ + 1, + 1 + ], + "Value": 1 + } + }, + { + "_id": "4", + "_properties": { + "CoderInfo": { + "_id": "5", + "_object_class": "Simulink.CoderInfo", + "_properties": { + "CSCPackageName": "Simulink", + "CustomAttributes": { + "_id": "6", + "_object_class": "SimulinkCSC.AttribClass_Simulink_Default", + "_properties": {} + }, + "CustomStorageClass": "Default", + "ParameterOrSignal": "Parameter", + "StorageClass": "Auto" + } + }, + "Complexity": "real", + "Dimensions": [ + 1, + 1 + ], + "Value": 2 + } + } + ] + } + } + ], + "_mw_element_type": "MATLABArray" + } + }, + { + "name": "sStructArr", + "metadata": { + "uuid": "aa1f5512-c7ca-45a8-ae02-4b9ff5e6407d", + "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e", + "lastmod": "20260918T190407.049591", + "modifiedby": "weiwang", + "isderived": "0" + }, + "value": { + "_array_type": "Struct", + "_dimensions": [ + 1, + 1 + ], + "_elements": [ + { + "f": { + "_array_type": "Struct", + "_dimensions": [ + 1, + 2 + ], + "_elements": [ + { + "a": 1 + }, + { + "a": 2 + } + ] + } + } + ], + "_mw_element_type": "MATLABArray" + } + } + ], + "Dictionary References": [], + "AllowAccessBWS": false + } + } + } +} \ No newline at end of file diff --git a/test/parity/matlab/DESIGN.md b/test/parity/matlab/DESIGN.md index a432eac..4b269be 100644 --- a/test/parity/matlab/DESIGN.md +++ b/test/parity/matlab/DESIGN.md @@ -1952,6 +1952,81 @@ READER did with what MATLAB wrote. `binaryWriteBackGate.test.ts` excludes that one struct field from its cross-channel comparison and says why; nothing asserts the broken behaviour. +## Three more, from asking what ELSE the cell site was missing + +52 was found from a report. These three were found by taking its cause seriously and +asking the generalizing question: *why* was one site missing a branch its two siblings +had? Because **`parseCellElement` is a hand-rolled copy of the class dispatch the other +sites share, so every idea added to the shared dispatch has to be added to the copy by +hand — and the copy lags.** 52 was the missing `string` idea. These are the missing +"a dimensioned element set" idea, which the shared dispatch has in one place +(`parseArrayOfElements`) and the copy had in three half-right ways. + +All three are binary-only, the text channel being right for all of them; all three are +wrong on screen **and** lossy in the file, with no edit required; and all three were +hidden by their own 1x1 control, which is the reason to state them together. Measured by +`probe_cell_arrays.m`, which records MATLAB's three spellings and wrote +`cellarr_{text,binary}.sldd`. + +53. **A complex ARRAY in a cell lost its imaginary parts.** `{[1+2i 3-4i]}` displayed + `{[1 3]}`, and a rebuild wrote `Class="double" Dimension="1*2">1.0 3.0` — `IsComplex` + and the imaginary parts both gone from the file. + + The copy asked the SHAPE before the complexity, so a dimensioned element went to the + shaped arm, whose `numericBody` runs each token through `parseFloat`, which stops at + the `+`. The shared dispatch asks complexity first (`parseEntryValue`, and the struct + field path) because a complex value states its elements as text whatever its rank — + `IsComplex="1" Dimension="2*2*2">1.0+1.0i …` — so the shape is not the thing to branch + on. A complex SCALAR was right the whole time for the one reason that matters here: + MATLAB writes one with **no** `Dimension` at all, so it fell past the shaped arm and + reached the `IsComplex` check by accident of ordering. + +54. **A struct ARRAY in a cell was published as `<1x1 struct>`.** The copy passed a + hardcoded `[1, 1]` to `structValue` where the shared dispatch reads the element's own + `Dimension`, which MATLAB puts on the element that declares the class + (``, one child `` per struct) exactly + as it puts it on a struct-array `

` — which is why the field and property sites were + right and this one was not. + + The wrong summary was the harmless half. The envelope's dims are what the writer + spells, so a save emitted a `Class="struct"` element with the structs a level too deep + and the **next open found neither of them** — 1x2 and 2x2 alike. + +55. **An object ARRAY in a cell showed only its first object.** The copy's tail took + `childElements[0]`, so `{[Simulink.Parameter(1) Simulink.Parameter(2)]}` displayed + `{1}` — the first Parameter's value, presented as though the cell held a scalar — and + every object after the first was gone from the file on any save. The text channel + showed `{<1x2 Simulink.Parameter>}`. + + MATLAB spells this one a third way again: a **classless** `` + over one classed `` per object. A single object in + a cell is that same classless wrapper with no `Dimension` and one child, which is + precisely why taking the first child looked correct — for the control. + +Fixed as one idea rather than three: complexity is asked before shape, the struct arm +reads the element's `Dimension`, and the object tail delegates a dimensioned multi-child +element to `parseArrayOfElements` — the same helper the property path uses — rather than +becoming a fourth copy of the decision. + +Held by five tests in `binaryWriteBackGate.test.ts`, each of which fails with **any one** +of the three edits reverted (verified by reverting each alone): MATLAB's values read back, +the two channels asserted against EACH OTHER, the three write spellings, a byte-for-byte +comparison of every entry against MATLAB's own chunk, and a reopen of the rebuilt chunk. +The byte comparison normalizes away exactly one difference, the `Dimension="1*1"` +1x1-cell churn 52 already recorded — every entry in this fixture is a 1x1 cell, so leaving +it in would mean comparing nothing instead of everything. + +Two things this measurement settled and left alone: + +- **The writer needed no change.** All three defects were reader-side; once the model + carried the right dims, class and count, `MatlabVariableNode._serializeCellXml` and + `_serializeArrayXml` already spelled each of the three forms MATLAB's way. That is the + byte-identity test's second job. +- **Struct-array element rows are labelled 0-based** (`0`, `1`, …) where every other + container in the tree is 1-based, and for an N-D struct array the two channels disagree + about it (text `1…12`, binary `0…11`). Visible in the fixtures here, unrelated to cells, + not asserted either way. + ## Known limitations, to verify and document - **Derived MCOS classes.** A customer class `MyParam < Simulink.Parameter` diff --git a/test/parity/matlab/README.md b/test/parity/matlab/README.md index 637874f..5d3cef2 100644 --- a/test/parity/matlab/README.md +++ b/test/parity/matlab/README.md @@ -109,6 +109,7 @@ directory, because `Simulink.data.dictionary.open` rejects a relative one with | `probe_mdl_encoding.m` | what does a classic `.mdl` saved under a non-UTF-8 `slCharacterEncoding` look like, and what does MATLAB read back out of it? (TODO item 11) | `$MDL_ENCODING_OUT` or `tempdir/mdlenc` | `mdlenc_shift_jis_R2011b.mdl`, `mdlenc_windows_1252_R2011b.mdl`, `mdlenc_shift_jis.mdl` | | `probe_cell_shapes.m` | how does MATLAB spell a shaped value INSIDE a cell — a column, a matrix, a logical, a char matrix, a string — and in which order does it store the cell's own elements? (defects 49, 50) | `$CELL_SHAPES_OUT` or `tempdir/cellshapes` | — | | `probe_cell_string.m` | and how does it spell a `string` in a cell in the BINARY flavour, where a string is an object rather than a JSON value? (defect 52) | `$CELL_STRING_OUT` or `tempdir/cellstring` | `cellstr_text.sldd`, `cellstr_binary.sldd` | +| `probe_cell_arrays.m` | and how does it spell an ARRAY in a cell — complex, struct, object — where the cell site's hand-rolled dispatch lagged the shared one by three ideas? (defects 53, 54, 55) | `$CELL_ARRAYS_OUT` or `tempdir/cellarrays` | `cellarr_text.sldd`, `cellarr_binary.sldd` | | `probe_mask_types.m` | which mask parameter TYPES hold an expression `findVars` resolves, and which are a selection or a widget state? | — | — | | `probe_evaluate.m` | is `Evaluate` a SECOND gate, independent of the type — and how does each container format spell it? | `tempdir/probe_evaluate` | — | | `probe_non_data_params.m` | which FREE-TEXT block parameters never name data, however much their values look like variables? | `tempdir` (one child model, deleted) | — | diff --git a/test/parity/matlab/probe_cell_arrays.m b/test/parity/matlab/probe_cell_arrays.m new file mode 100644 index 0000000..ad43634 --- /dev/null +++ b/test/parity/matlab/probe_cell_arrays.m @@ -0,0 +1,216 @@ +% How does MATLAB spell an ARRAY inside a cell, in the binary flavour? +% +% probe_cell_string.m settled one cell of this matrix -- `string` at the +% cell-element site -- and in doing so exposed the generalization: `parseCellElement` +% is a hand-rolled COPY of the class dispatch the entry and property sites share, so +% every idea added to the shared dispatch has to be added to the copy by hand, and +% the copy lags. Defect 52 was the missing `string` branch. This probe asks for the +% other idea the copy was missing: "a dimensioned element set", which the shared +% dispatch handles in one place (`parseArrayOfElements`) and the copy handled in +% three half-right ways. +% +% Only MATLAB can answer, because the three array kinds are spelled three different +% ways and a reader branch keyed on the wrong one is no fix: a complex array states +% its elements as TEXT, a struct array states its shape on the element ITSELF, and an +% object array states its shape on a CLASSLESS wrapper one level above the objects. +% Nothing about the data model predicts which; the bytes decide. +% +% The answers, measured against R2027a (27.1.0.3372387): +% +% COMPLEX ARRAY -- the shape and the complexity ride on the same , and +% the body is text whatever the rank: +% +% 1.0+2.0i 3.0-4.0i +% 1.0+2.0i 3.0-4.0i +% 1.0+1.0i ... 8.0+8.0i +% +% A complex SCALAR carries NO Dimension (``), +% which is exactly why defect 53 hid: the reader asked the shape first and only +% reached its IsComplex check when there was no shape to find. So the scalar was +% right and every complex ARRAY in a cell lost its imaginary parts -- on screen AND +% out of the file, because the re-serialized element dropped IsComplex too. +% +% STRUCT ARRAY -- the shape is on the element that declares the class, one child +% per struct, the same way a struct-array PROPERTY states it on its

: +% +% +%

1.0

+%

2.0

+% +% +% A 1x1 struct in a cell is the same shape with no Dimension, so a reader that +% hardcodes 1x1 (defect 54) is right for the control and wrong for every array. +% +% OBJECT ARRAY -- the shape is on a CLASSLESS wrapper, and the objects are its +% children, each carrying its own class: +% +% +% ... +% ... +% +% +% A SINGLE object in a cell is that same classless wrapper with no Dimension and +% one child -- which is why a reader that just took the first child (defect 55) +% looked correct until a cell held more than one object, and then showed the first +% object's value as though the cell held a scalar and wrote the rest out of the +% file. +% +% THE TEXT FLAVOUR IS RIGHT FOR ALL THREE. That is the signature of this repo's +% recurring defect class: the two channels spell the same value independently, so +% an invariant has to be pinned BETWEEN them, not inside either one. +% +% Run: mw -using Bmain matlab -nodesktop -batch "run('test/parity/matlab/probe_cell_arrays.m')" + +outdir = getenv('CELL_ARRAYS_OUT'); +if isempty(outdir), outdir = fullfile(tempdir, 'cellarrays'); end +if ~exist(outdir, 'dir'), mkdir(outdir); end + +pArr = [Simulink.Parameter(1) Simulink.Parameter(2)]; +sArr = [struct('a', 1) struct('a', 2)]; + +C = { ... + % --- the three defects, at the cell-element site -------------------------- + 'cCplxArr', {[1 + 2i, 3 - 4i]}; ... % defect 53: complex ROW in a cell + 'cCplxCol', {[1 + 2i; 3 - 4i]}; ... % ... and a COLUMN, same spelling + 'cCplxNd', {reshape((1:8) + 1i * (1:8), 2, 2, 2)}; ... % ... and rank 3 + 'cStructArr', {sArr}; ... % defect 54: struct ARRAY in a cell + 'cStructArr2D', {[struct('a',1) struct('a',2); struct('a',3) struct('a',4)]}; ... + 'cObjArr', {pArr}; ... % defect 55: object ARRAY in a cell + % --- the controls that hid them: each is the 1x1 of the row above --------- + 'cCplx', {1 + 2i}; ... % no Dimension at all -> was right + 'cStruct', {struct('a', 1)}; ... % the hardcoded 1x1 -> was right + 'cObj', {Simulink.Parameter(5)}; ... % one child -> taking [0] was right + % --- controls the fix must not regress ------------------------------------ + 'cNd', {reshape(1:12, 2, 3, 2)}; ... % REAL N-D: still the shaped arm + 'cStr', {"a"}; ... % defect 52's case, still lifted + % --- the sibling sites, already right: the fix must agree with them ------- + 'sObjArr', struct('f', pArr); ... % object array as a struct FIELD + 'sStructArr', struct('f', {sArr}); ... % struct array as a struct FIELD + 'pCplxArr', Simulink.Parameter([1 + 2i, 3 - 4i])}; % complex array as a PROPERTY + +fprintf('PROBE_BEGIN\nVERSION %s\n', version); + +Simulink.data.dictionary.closeAll('-discard'); +for fmt = {'uncompressed-text', 'compressed-binary'} + tag = fmt{1}; + fn = fullfile(outdir, ['cellarr_' strrep(tag, '-', '_') '.sldd']); + if exist(fn, 'file'), delete(fn); end + dd = Simulink.data.dictionary.create(fn); + dd.FileFormat = tag; + ds = dd.getSection('Design Data'); + for i = 1:size(C, 1) + try + ds.addEntry(C{i,1}, C{i,2}); + catch e + fprintf('REJECTED %-13s %s\n', C{i,1}, e.message); + end + end + clear ds + dd.saveChanges(); + dd.close(); + + % Read back through MATLAB's own API, so the class, the shape and the imaginary + % parts of each nested value are MATLAB's answer and not ours. Those three are + % exactly what the three defects destroyed. + fprintf('\nREAD BACK (%s)\n', tag); + dd = Simulink.data.dictionary.open(fn); + ds = dd.getSection('Design Data'); + for i = 1:size(C, 1) + try + fprintf(' %-13s %s\n', C{i,1}, describe(ds.getEntry(C{i,1}).getValue(), 1)); + catch e + fprintf(' %-13s UNREADABLE %s\n', C{i,1}, e.message); + end + end + clear ds + dd.close(); + fprintf('FILE %s\n', fn); +end + +% ---- the bytes MATLAB actually wrote ----------------------------------------- +% The binary flavour is a ZIP of XML, and the nesting IS the answer here, so print +% the whole chunk rather than an attribute-filtered view of it. +fprintf('\nBINARY XML\n'); +zdir = fullfile(outdir, 'unzipped'); +if exist(zdir, 'dir'), rmdir(zdir, 's'); end +names = unzip(fullfile(outdir, 'cellarr_compressed_binary.sldd'), zdir); +for j = 1:numel(names) + if exist(names{j}, 'file') ~= 2, continue, end + body = fileread(names{j}); + if isempty(strfind(body, 'cCplxArr')) %#ok + continue + end + fprintf(' --- %s\n', names{j}); + disp(body); +end + +fprintf('\nTEXT JSON\n'); +txt = regexprep(fileread(fullfile(outdir, 'cellarr_uncompressed_text.sldd')), '\s+', ' '); +for i = 1:size(C, 1) + k = strfind(txt, ['"' C{i,1} '"']); + if isempty(k) + fprintf(' %-13s NOT FOUND\n', C{i,1}); + continue + end + fprintf(' %s\n', txt(k(1):min(numel(txt), k(1) + 300))); +end + +disp('CELLARRAYS OK'); + +% ---- a recursive class/size/value description: MATLAB's own truth per element -- +% Local functions must be last in a script file. +function s = describe(v, depth) + if depth > 3 + s = '...'; + return + end + tag = sprintf('%s%s', class(v), mat2str(size(v))); + if iscell(v) + parts = cell(1, numel(v)); + for k = 1:numel(v) + parts{k} = describe(v{k}, depth + 1); + end + s = sprintf('%s{%s}', tag, strjoin(parts, ', ')); + elseif isstruct(v) + f = fieldnames(v); + parts = cell(1, numel(f)); + for k = 1:numel(f) + if isempty(v) + parts{k} = f{k}; + else + parts{k} = sprintf('%s=%s', f{k}, describe(v(1).(f{k}), depth + 1)); + end + end + s = sprintf('%s(%s)', tag, strjoin(parts, ', ')); + elseif isobject(v) && ~isempty(v) && isprop(v(1), 'Value') + % `v(1)` not `v`: isprop on a 1x2 object array answers 1x2, and `&&` refuses a + % non-scalar -- an object ARRAY is half of what this probe measures, so that + % throw would have hidden the answer behind UNREADABLE. + % An object array has no scalar Value either, so describe element 1 and say so. + if isscalar(v) + s = sprintf('%s[Value=%s]', tag, describe(v.Value, depth + 1)); + else + s = sprintf('%s[1.Value=%s]', tag, describe(v(1).Value, depth + 1)); + end + elseif ischar(v) || isstring(v) + % Reshape first: indexing a 2-D char/string with (1,:) is not the flat order + % the file stores, and `v(1)` on an EMPTY one throws. + flat = string(v(:)'); + if isempty(flat) + s = tag; + else + s = sprintf('%s"%s"', tag, strjoin(flat, ' ')); + end + elseif isnumeric(v) || islogical(v) + if isempty(v) + s = tag; + else + % `.'` not `'`: the plain transpose CONJUGATES, which would print the + % imaginary parts with the wrong sign -- in a probe about complex values + % that is the one mistake that makes the truth unreadable. + s = sprintf('%s=%s', tag, mat2str(reshape(v, 1, []), 17)); + end + else + s = tag; + end +end