Skip to content

Commit 7cd8248

Browse files
committed
Fix - correctly read pair<> without dictionary
Also use checksum WITH classname check
1 parent 59306b5 commit 7cd8248

File tree

1 file changed

+57
-46
lines changed

1 file changed

+57
-46
lines changed

modules/io.mjs

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,35 @@ function getTypeId(typname, norecursion) {
668668
return -1;
669669
}
670670

671+
/** @summary Create streamer info for pair object
672+
* @private */
673+
function createPairStreamer(typename, file) {
674+
let si = file.findStreamerInfo(typename);
675+
if (si)
676+
return si;
677+
let p1 = typename.indexOf('<');
678+
const p2 = typename.lastIndexOf('>');
679+
function getNextName() {
680+
let res = '', p = p1 + 1, cnt = 0;
681+
while ((p < p2) && (cnt >= 0)) {
682+
switch (typename[p]) {
683+
case '<': cnt++; break;
684+
case ',': if (cnt === 0) cnt--; break;
685+
case '>': cnt--; break;
686+
}
687+
if (cnt >= 0) res += typename[p];
688+
p++;
689+
}
690+
p1 = p - 1;
691+
return res.trim();
692+
}
693+
si = { _typename: 'TStreamerInfo', fClassVersion: 0, fName: typename, fElements: create(clTList) };
694+
si.fElements.Add(createStreamerElement('first', getNextName(), file));
695+
si.fElements.Add(createStreamerElement('second', getNextName(), file));
696+
file.fStreamerInfos.arr.push(si);
697+
return si;
698+
}
699+
671700
/** @summary create element of the streamer
672701
* @private */
673702
function createStreamerElement(name, typename, file) {
@@ -686,7 +715,8 @@ function createStreamerElement(name, typename, file) {
686715
typename = elem.fTypeName = BasicTypeNames[elem.fType] || 'int';
687716
}
688717

689-
if (elem.fType > 0) return elem; // basic type
718+
if (elem.fType > 0)
719+
return elem; // basic type
690720

691721
// check if there are STL containers
692722
const pos = typename.indexOf('<');
@@ -707,6 +737,9 @@ function createStreamerElement(name, typename, file) {
707737
return elem;
708738
}
709739

740+
if ((pos > 0) && (typename.slice(0, pos) === 'pair') && file)
741+
createPairStreamer(typename, file);
742+
710743
const isptr = (typename.lastIndexOf('*') === typename.length - 1);
711744

712745
if (isptr)
@@ -726,33 +759,8 @@ function createStreamerElement(name, typename, file) {
726759
/** @summary Function creates streamer for std::pair object
727760
* @private */
728761
function getPairStreamer(si, typname, file) {
729-
if (!si) {
730-
if (typname.indexOf('pair') !== 0) return null;
731-
732-
si = file.findStreamerInfo(typname);
733-
734-
if (!si) {
735-
let p1 = typname.indexOf('<');
736-
const p2 = typname.lastIndexOf('>');
737-
function GetNextName() {
738-
let res = '', p = p1 + 1, cnt = 0;
739-
while ((p < p2) && (cnt >= 0)) {
740-
switch (typname[p]) {
741-
case '<': cnt++; break;
742-
case ',': if (cnt === 0) cnt--; break;
743-
case '>': cnt--; break;
744-
}
745-
if (cnt >= 0) res += typname[p];
746-
p++;
747-
}
748-
p1 = p - 1;
749-
return res.trim();
750-
}
751-
si = { _typename: 'TStreamerInfo', fVersion: 1, fName: typname, fElements: create(clTList) };
752-
si.fElements.Add(createStreamerElement('first', GetNextName(), file));
753-
si.fElements.Add(createStreamerElement('second', GetNextName(), file));
754-
}
755-
}
762+
if (!si)
763+
si = createPairStreamer(typname, file);
756764

757765
const streamer = file.getStreamer(typname, null, si);
758766
if (!streamer) return null;
@@ -1157,7 +1165,7 @@ function createMemberStreamer(element, file) {
11571165
member.readelem = readVectorElement;
11581166

11591167
if (!member.isptr && (member.arrkind < 0)) {
1160-
const subelem = createStreamerElement('temp', member.conttype);
1168+
const subelem = createStreamerElement('temp', member.conttype, file);
11611169
if (subelem.fType === kStreamer) {
11621170
subelem.$fictional = true;
11631171
member.submember = createMemberStreamer(subelem, file);
@@ -3310,28 +3318,34 @@ class TFile {
33103318
* @param {number} [checksum] - streamer info checksum, have to match when specified
33113319
* @private */
33123320
findStreamerInfo(clname, clversion, checksum) {
3313-
if (!this.fStreamerInfos) return null;
3321+
if (!this.fStreamerInfos)
3322+
return null;
33143323

33153324
const arr = this.fStreamerInfos.arr, len = arr.length;
33163325

33173326
if (checksum !== undefined) {
33183327
let cache = this.fStreamerInfos.cache;
33193328
if (!cache) cache = this.fStreamerInfos.cache = {};
33203329
let si = cache[checksum];
3321-
if (si !== undefined) return si;
3330+
if (si && (!clname || (si.fName === clname)))
3331+
return si;
33223332

33233333
for (let i = 0; i < len; ++i) {
33243334
si = arr[i];
33253335
if (si.fCheckSum === checksum) {
33263336
cache[checksum] = si;
3327-
return si;
3337+
if (!clname || (si.fName === clname))
3338+
return si;
33283339
}
33293340
}
3330-
cache[checksum] = null; // checksum didnot found, do not try again
3331-
} else {
3341+
cache[checksum] = null; // checksum did not found, do not try again
3342+
}
3343+
3344+
if (clname) {
33323345
for (let i = 0; i < len; ++i) {
33333346
const si = arr[i];
3334-
if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined))) return si;
3347+
if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined)))
3348+
return si;
33353349
}
33363350
}
33373351

@@ -3373,7 +3387,8 @@ class TFile {
33733387
}
33743388

33753389
// check element in streamer infos, one can have special cases
3376-
if (!s_i) s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
3390+
if (!s_i)
3391+
s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
33773392

33783393
if (!s_i) {
33793394
delete this.fStreamers[fullname];
@@ -3568,17 +3583,13 @@ function readMapElement(buf) {
35683583

35693584
if (this.member_wise) {
35703585
// when member-wise streaming is used, version is written
3571-
const ver = this.stl_version;
3586+
const si = buf.fFile.findStreamerInfo(this.pairtype, this.stl_version.val /* , this.stl_version.checksum */);
35723587

3573-
if (this.si) {
3574-
const si = buf.fFile.findStreamerInfo(this.pairtype, ver.val, ver.checksum);
3575-
3576-
if (this.si !== si) {
3577-
streamer = getPairStreamer(si, this.pairtype, buf.fFile);
3578-
if (!streamer || streamer.length !== 2) {
3579-
console.log(`Fail to produce streamer for ${this.pairtype}`);
3580-
return null;
3581-
}
3588+
if (si && (this.si !== si)) {
3589+
streamer = getPairStreamer(si, this.pairtype, buf.fFile);
3590+
if (streamer?.length !== 2) {
3591+
console.log(`Fail to produce streamer for ${this.pairtype}`);
3592+
return null;
35823593
}
35833594
}
35843595
}

0 commit comments

Comments
 (0)