Skip to content

Commit 208bbdb

Browse files
committed
Fix - correctly read pair<> without dictionary
Also use checksum WITH classname check
1 parent 9671818 commit 208bbdb

File tree

1 file changed

+56
-45
lines changed

1 file changed

+56
-45
lines changed

modules/io.mjs

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,35 @@ function getTypeId(typname, norecursion) {
656656
return -1;
657657
}
658658

659+
/** @summary Create streamer info for pair object
660+
* @private */
661+
function createPairStreamer(typename, file) {
662+
let si = file.findStreamerInfo(typename);
663+
if (si)
664+
return si;
665+
let p1 = typename.indexOf('<');
666+
const p2 = typename.lastIndexOf('>');
667+
function getNextName() {
668+
let res = '', p = p1 + 1, cnt = 0;
669+
while ((p < p2) && (cnt >= 0)) {
670+
switch (typename[p]) {
671+
case '<': cnt++; break;
672+
case ',': if (cnt === 0) cnt--; break;
673+
case '>': cnt--; break;
674+
}
675+
if (cnt >= 0) res += typename[p];
676+
p++;
677+
}
678+
p1 = p - 1;
679+
return res.trim();
680+
}
681+
si = { _typename: 'TStreamerInfo', fClassVersion: 0, fName: typename, fElements: create(clTList) };
682+
si.fElements.Add(createStreamerElement('first', getNextName(), file));
683+
si.fElements.Add(createStreamerElement('second', getNextName(), file));
684+
file.fStreamerInfos.arr.push(si);
685+
return si;
686+
}
687+
659688
/** @summary create element of the streamer
660689
* @private */
661690
function createStreamerElement(name, typename, file) {
@@ -674,7 +703,8 @@ function createStreamerElement(name, typename, file) {
674703
typename = elem.fTypeName = BasicTypeNames[elem.fType] || 'int';
675704
}
676705

677-
if (elem.fType > 0) return elem; // basic type
706+
if (elem.fType > 0)
707+
return elem; // basic type
678708

679709
// check if there are STL containers
680710
const pos = typename.indexOf('<');
@@ -695,6 +725,9 @@ function createStreamerElement(name, typename, file) {
695725
return elem;
696726
}
697727

728+
if ((pos > 0) && (typename.slice(0, pos) === 'pair') && file)
729+
createPairStreamer(typename, file);
730+
698731
const isptr = (typename.lastIndexOf('*') === typename.length - 1);
699732

700733
if (isptr)
@@ -714,33 +747,8 @@ function createStreamerElement(name, typename, file) {
714747
/** @summary Function creates streamer for std::pair object
715748
* @private */
716749
function getPairStreamer(si, typname, file) {
717-
if (!si) {
718-
if (typname.indexOf('pair') !== 0) return null;
719-
720-
si = file.findStreamerInfo(typname);
721-
722-
if (!si) {
723-
let p1 = typname.indexOf('<');
724-
const p2 = typname.lastIndexOf('>');
725-
function GetNextName() {
726-
let res = '', p = p1 + 1, cnt = 0;
727-
while ((p < p2) && (cnt >= 0)) {
728-
switch (typname[p]) {
729-
case '<': cnt++; break;
730-
case ',': if (cnt === 0) cnt--; break;
731-
case '>': cnt--; break;
732-
}
733-
if (cnt >= 0) res += typname[p];
734-
p++;
735-
}
736-
p1 = p - 1;
737-
return res.trim();
738-
}
739-
si = { _typename: 'TStreamerInfo', fVersion: 1, fName: typname, fElements: create(clTList) };
740-
si.fElements.Add(createStreamerElement('first', GetNextName(), file));
741-
si.fElements.Add(createStreamerElement('second', GetNextName(), file));
742-
}
743-
}
750+
if (!si)
751+
si = createPairStreamer(typname, file);
744752

745753
const streamer = file.getStreamer(typname, null, si);
746754
if (!streamer) return null;
@@ -1144,7 +1152,7 @@ function createMemberStreamer(element, file) {
11441152
member.readelem = readVectorElement;
11451153

11461154
if (!member.isptr && (member.arrkind < 0)) {
1147-
const subelem = createStreamerElement('temp', member.conttype);
1155+
const subelem = createStreamerElement('temp', member.conttype, file);
11481156
if (subelem.fType === kStreamer) {
11491157
subelem.$fictional = true;
11501158
member.submember = createMemberStreamer(subelem, file);
@@ -3296,28 +3304,34 @@ class TFile {
32963304
* @param {number} [checksum] - streamer info checksum, have to match when specified
32973305
* @private */
32983306
findStreamerInfo(clname, clversion, checksum) {
3299-
if (!this.fStreamerInfos) return null;
3307+
if (!this.fStreamerInfos)
3308+
return null;
33003309

33013310
const arr = this.fStreamerInfos.arr, len = arr.length;
33023311

33033312
if (checksum !== undefined) {
33043313
let cache = this.fStreamerInfos.cache;
33053314
if (!cache) cache = this.fStreamerInfos.cache = {};
33063315
let si = cache[checksum];
3307-
if (si !== undefined) return si;
3316+
if (si && (!clname || (si.fName === clname)))
3317+
return si;
33083318

33093319
for (let i = 0; i < len; ++i) {
33103320
si = arr[i];
33113321
if (si.fCheckSum === checksum) {
33123322
cache[checksum] = si;
3313-
return si;
3323+
if (!clname || (si.fName === clname))
3324+
return si;
33143325
}
33153326
}
33163327
cache[checksum] = null; // checksum did not found, do not try again
3317-
} else {
3328+
}
3329+
3330+
if (clname) {
33183331
for (let i = 0; i < len; ++i) {
33193332
const si = arr[i];
3320-
if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined))) return si;
3333+
if ((si.fName === clname) && ((si.fClassVersion === clversion) || (clversion === undefined)))
3334+
return si;
33213335
}
33223336
}
33233337

@@ -3359,7 +3373,8 @@ class TFile {
33593373
}
33603374

33613375
// check element in streamer infos, one can have special cases
3362-
if (!s_i) s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
3376+
if (!s_i)
3377+
s_i = this.findStreamerInfo(clname, ver.val, ver.checksum);
33633378

33643379
if (!s_i) {
33653380
delete this.fStreamers[fullname];
@@ -3554,17 +3569,13 @@ function readMapElement(buf) {
35543569

35553570
if (this.member_wise) {
35563571
// when member-wise streaming is used, version is written
3557-
const ver = this.stl_version;
3572+
const si = buf.fFile.findStreamerInfo(this.pairtype, this.stl_version.val /* , this.stl_version.checksum */);
35583573

3559-
if (this.si) {
3560-
const si = buf.fFile.findStreamerInfo(this.pairtype, ver.val, ver.checksum);
3561-
3562-
if (this.si !== si) {
3563-
streamer = getPairStreamer(si, this.pairtype, buf.fFile);
3564-
if (!streamer || streamer.length !== 2) {
3565-
console.log(`Fail to produce streamer for ${this.pairtype}`);
3566-
return null;
3567-
}
3574+
if (si && (this.si !== si)) {
3575+
streamer = getPairStreamer(si, this.pairtype, buf.fFile);
3576+
if (streamer?.length !== 2) {
3577+
console.log(`Fail to produce streamer for ${this.pairtype}`);
3578+
return null;
35683579
}
35693580
}
35703581
}

0 commit comments

Comments
 (0)