@@ -12,7 +12,7 @@ const version_id = '7.8.x',
1212
1313/** @summary version date
1414 * @desc Release date in format day/month/year like '14/04/2022' */
15- version_date = '10 /03/2025',
15+ version_date = '12 /03/2025',
1616
1717/** @summary version id and date
1818 * @desc Produced by concatenation of {@link version_id} and {@link version_date}
@@ -10324,7 +10324,8 @@ function parseLatex(node, arg, label, curr) {
1032410324 }
1032510325
1032610326 if (pos_up) {
10327- if (!pos_low) yup = Math.min(yup, curr.rect.last_y1);
10327+ if (!pos_low && curr.rect)
10328+ yup = Math.min(yup, curr.rect.last_y1);
1032810329 positionGNode(pos_up, x+dx, yup - pos_up.rect.y1 - curr.fsize*0.1);
1032910330 w1 = pos_up.rect.width;
1033010331 }
@@ -98255,6 +98256,35 @@ function getTypeId(typname, norecursion) {
9825598256 return -1;
9825698257}
9825798258
98259+ /** @summary Create streamer info for pair object
98260+ * @private */
98261+ function createPairStreamer(typename, file) {
98262+ let si = file.findStreamerInfo(typename);
98263+ if (si)
98264+ return si;
98265+ let p1 = typename.indexOf('<');
98266+ const p2 = typename.lastIndexOf('>');
98267+ function getNextName() {
98268+ let res = '', p = p1 + 1, cnt = 0;
98269+ while ((p < p2) && (cnt >= 0)) {
98270+ switch (typename[p]) {
98271+ case '<': cnt++; break;
98272+ case ',': if (cnt === 0) cnt--; break;
98273+ case '>': cnt--; break;
98274+ }
98275+ if (cnt >= 0) res += typename[p];
98276+ p++;
98277+ }
98278+ p1 = p - 1;
98279+ return res.trim();
98280+ }
98281+ si = { _typename: 'TStreamerInfo', fClassVersion: 0, fName: typename, fElements: create$1(clTList) };
98282+ si.fElements.Add(createStreamerElement('first', getNextName(), file));
98283+ si.fElements.Add(createStreamerElement('second', getNextName(), file));
98284+ file.fStreamerInfos.arr.push(si);
98285+ return si;
98286+ }
98287+
9825898288/** @summary create element of the streamer
9825998289 * @private */
9826098290function createStreamerElement(name, typename, file) {
@@ -98273,7 +98303,8 @@ function createStreamerElement(name, typename, file) {
9827398303 typename = elem.fTypeName = BasicTypeNames[elem.fType] || 'int';
9827498304 }
9827598305
98276- if (elem.fType > 0) return elem; // basic type
98306+ if (elem.fType > 0)
98307+ return elem; // basic type
9827798308
9827898309 // check if there are STL containers
9827998310 const pos = typename.indexOf('<');
@@ -98294,6 +98325,9 @@ function createStreamerElement(name, typename, file) {
9829498325 return elem;
9829598326 }
9829698327
98328+ if ((pos > 0) && (typename.slice(0, pos) === 'pair') && file)
98329+ createPairStreamer(typename, file);
98330+
9829798331 const isptr = (typename.lastIndexOf('*') === typename.length - 1);
9829898332
9829998333 if (isptr)
@@ -98313,33 +98347,8 @@ function createStreamerElement(name, typename, file) {
9831398347/** @summary Function creates streamer for std::pair object
9831498348 * @private */
9831598349function getPairStreamer(si, typname, file) {
98316- if (!si) {
98317- if (typname.indexOf('pair') !== 0) return null;
98318-
98319- si = file.findStreamerInfo(typname);
98320-
98321- if (!si) {
98322- let p1 = typname.indexOf('<');
98323- const p2 = typname.lastIndexOf('>');
98324- function GetNextName() {
98325- let res = '', p = p1 + 1, cnt = 0;
98326- while ((p < p2) && (cnt >= 0)) {
98327- switch (typname[p]) {
98328- case '<': cnt++; break;
98329- case ',': if (cnt === 0) cnt--; break;
98330- case '>': cnt--; break;
98331- }
98332- if (cnt >= 0) res += typname[p];
98333- p++;
98334- }
98335- p1 = p - 1;
98336- return res.trim();
98337- }
98338- si = { _typename: 'TStreamerInfo', fVersion: 1, fName: typname, fElements: create$1(clTList) };
98339- si.fElements.Add(createStreamerElement('first', GetNextName(), file));
98340- si.fElements.Add(createStreamerElement('second', GetNextName(), file));
98341- }
98342- }
98350+ if (!si)
98351+ si = createPairStreamer(typname, file);
9834398352
9834498353 const streamer = file.getStreamer(typname, null, si);
9834598354 if (!streamer) return null;
@@ -98743,7 +98752,7 @@ function createMemberStreamer(element, file) {
9874398752 member.readelem = readVectorElement;
9874498753
9874598754 if (!member.isptr && (member.arrkind < 0)) {
98746- const subelem = createStreamerElement('temp', member.conttype);
98755+ const subelem = createStreamerElement('temp', member.conttype, file );
9874798756 if (subelem.fType === kStreamer) {
9874898757 subelem.$fictional = true;
9874998758 member.submember = createMemberStreamer(subelem, file);
@@ -100895,28 +100904,34 @@ class TFile {
100895100904 * @param {number} [checksum] - streamer info checksum, have to match when specified
100896100905 * @private */
100897100906 findStreamerInfo(clname, clversion, checksum) {
100898- if (!this.fStreamerInfos) return null;
100907+ if (!this.fStreamerInfos)
100908+ return null;
100899100909
100900100910 const arr = this.fStreamerInfos.arr, len = arr.length;
100901100911
100902100912 if (checksum !== undefined) {
100903100913 let cache = this.fStreamerInfos.cache;
100904100914 if (!cache) cache = this.fStreamerInfos.cache = {};
100905100915 let si = cache[checksum];
100906- if (si !== undefined) return si;
100916+ if (si && (!clname || (si.fName === clname)))
100917+ return si;
100907100918
100908100919 for (let i = 0; i < len; ++i) {
100909100920 si = arr[i];
100910100921 if (si.fCheckSum === checksum) {
100911100922 cache[checksum] = si;
100912- return si;
100923+ if (!clname || (si.fName === clname))
100924+ return si;
100913100925 }
100914100926 }
100915100927 cache[checksum] = null; // checksum did not found, do not try again
100916- } else {
100928+ }
100929+
100930+ if (clname) {
100917100931 for (let i = 0; i < len; ++i) {
100918100932 const si = arr[i];
100919- if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined))) return si;
100933+ if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined)))
100934+ return si;
100920100935 }
100921100936 }
100922100937
@@ -100958,7 +100973,8 @@ class TFile {
100958100973 }
100959100974
100960100975 // check element in streamer infos, one can have special cases
100961- if (!s_i) s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
100976+ if (!s_i)
100977+ s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
100962100978
100963100979 if (!s_i) {
100964100980 delete this.fStreamers[fullname];
@@ -101112,17 +101128,13 @@ function readMapElement(buf) {
101112101128
101113101129 if (this.member_wise) {
101114101130 // when member-wise streaming is used, version is written
101115- const ver = this.stl_version;
101131+ const si = buf.fFile.findStreamerInfo( this.pairtype, this. stl_version.val /* , this.stl_version.checksum */) ;
101116101132
101117- if (this.si) {
101118- const si = buf.fFile.findStreamerInfo(this.pairtype, ver.val, ver.checksum);
101119-
101120- if (this.si !== si) {
101121- streamer = getPairStreamer(si, this.pairtype, buf.fFile);
101122- if (!streamer || streamer.length !== 2) {
101123- console.log(`Fail to produce streamer for ${this.pairtype}`);
101124- return null;
101125- }
101133+ if (si && (this.si !== si)) {
101134+ streamer = getPairStreamer(si, this.pairtype, buf.fFile);
101135+ if (streamer?.length !== 2) {
101136+ console.log(`Fail to produce streamer for ${this.pairtype}`);
101137+ return null;
101126101138 }
101127101139 }
101128101140 }
0 commit comments