From c2bdf463668ebf11696d4cf13fa693a3171eacfe Mon Sep 17 00:00:00 2001 From: Sergey Linev Date: Tue, 5 Aug 2025 13:02:51 +0200 Subject: [PATCH 1/4] Code formating in io.mjs --- modules/io.mjs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/io.mjs b/modules/io.mjs index 8d129885b..8eb8d1ed9 100644 --- a/modules/io.mjs +++ b/modules/io.mjs @@ -2622,7 +2622,8 @@ class TBuffer { /** @summary Invoke streamer for specified class */ classStreamer(obj, classname) { - if (obj._typename === undefined) obj._typename = classname; + if (obj._typename === undefined) + obj._typename = classname; const direct = DirectStreamers[classname]; if (direct) { @@ -3568,7 +3569,8 @@ class TFile { * @private */ getStreamer(clname, ver, s_i) { // these are special cases, which are handled separately - if (clname === clTQObject || clname === clTBasket) return null; + if (clname === clTQObject || clname === clTBasket) + return null; let streamer, fullname = clname; @@ -3594,7 +3596,8 @@ class TFile { streamer = []; if (isObject(custom)) { - if (!custom.name && !custom.func) return custom; + if (!custom.name && !custom.func) + return custom; streamer.push(custom); // special read entry, add in the beginning of streamer } From 502115c8ee4e3e1a566ce149aed251246802597c Mon Sep 17 00:00:00 2001 From: Sergey Linev Date: Tue, 5 Aug 2025 13:04:26 +0200 Subject: [PATCH 2/4] Add version in error printout --- modules/io.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/io.mjs b/modules/io.mjs index 8eb8d1ed9..5be9853bf 100644 --- a/modules/io.mjs +++ b/modules/io.mjs @@ -2261,7 +2261,7 @@ class TBuffer { checkByteCount(ver, where) { if ((ver.bytecnt !== undefined) && (ver.off + ver.bytecnt !== this.o)) { if (where) - console.log(`Missmatch in ${where} bytecount expected = ${ver.bytecnt} got = ${this.o - ver.off}`); + console.log(`Missmatch in ${where}:${ver.val} bytecount expected = ${ver.bytecnt} got = ${this.o - ver.off}`); this.o = ver.off + ver.bytecnt; return false; } From d3f02efc5abdb818a7d501b06af326c5d6e73d93 Mon Sep 17 00:00:00 2001 From: Sergey Linev Date: Tue, 5 Aug 2025 13:17:32 +0200 Subject: [PATCH 3/4] Use custom streamer for TBranch Older TBranch versions below 10 requires custom streamers --- modules/io.mjs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/io.mjs b/modules/io.mjs index 5be9853bf..184acfc28 100644 --- a/modules/io.mjs +++ b/modules/io.mjs @@ -375,6 +375,12 @@ CustomStreamers = { func(buf, obj) { obj.$kind = 'TTree'; obj.$file = buf.fFile; } }, + TBranch(buf, obj) { + if (buf.last_read_version > 9) + buf.streamClassMembers(obj, 'TBranch', buf.last_read_version, buf.last_read_checksum); + + }, + 'ROOT::RNTuple': { name: '$file', func(buf, obj) { obj.$kind = 'ROOT::RNTuple'; obj.$file = buf.fFile; } @@ -2649,6 +2655,17 @@ class TBuffer { return obj; } + /** @summary Stream class members using normal streamer */ + streamClassMembers(obj, classname, version) { + const streamer = this.fFile.getStreamer(classname, { val: version }, undefined, true); + if (streamer !== null) { + const len = streamer.length; + for (let n = 0; n < len; ++n) + streamer[n].func(this, obj); + } + return obj; + } + } // class TBuffer // ============================================================================== @@ -3567,7 +3584,7 @@ class TFile { /** @summary Returns streamer for the class 'clname', * @desc From the list of streamers or generate it from the streamer infos and add it to the list * @private */ - getStreamer(clname, ver, s_i) { + getStreamer(clname, ver, s_i, only_plain) { // these are special cases, which are handled separately if (clname === clTQObject || clname === clTBasket) return null; @@ -3581,7 +3598,7 @@ class TFile { return streamer; } - const custom = CustomStreamers[clname]; + const custom = only_plain ? null : CustomStreamers[clname]; // one can define in the user streamers just aliases if (isStr(custom)) From ae0185fbfbbaf0b5488b36da5385c58af54d5472 Mon Sep 17 00:00:00 2001 From: Sergey Linev Date: Tue, 5 Aug 2025 13:49:35 +0200 Subject: [PATCH 4/4] Provide custom streamer for old TBranch versions For version 9 and below custom streamer was used for TBranch --- modules/io.mjs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/modules/io.mjs b/modules/io.mjs index 184acfc28..b637c9ba7 100644 --- a/modules/io.mjs +++ b/modules/io.mjs @@ -376,9 +376,36 @@ CustomStreamers = { }, TBranch(buf, obj) { - if (buf.last_read_version > 9) - buf.streamClassMembers(obj, 'TBranch', buf.last_read_version, buf.last_read_checksum); - + const v = buf.last_read_version; + if (v > 9) + buf.streamClassMembers(obj, 'TBranch', v); + else { + buf.classStreamer(obj, clTNamed); + if (v > 7) + buf.classStreamer(obj, clTAttFill); + obj.fCompress = buf.ntoi4(); + obj.fBasketSize = buf.ntoi4(); + obj.fEntryOffsetLen = buf.ntoi4(); + obj.fWriteBasket = buf.ntoi4(); + obj.fEntryNumber = buf.ntoi4(); + obj.fOffset = buf.ntoi4(); + obj.fMaxBaskets = buf.ntoi4(); + if (v > 6) + obj.fSplitLevel = buf.ntoi4(); + obj.fEntries = buf.ntod(); + obj.fTotBytes = buf.ntod(); + obj.fZipBytes = buf.ntod(); + obj.fBranches = buf.classStreamer({}, clTObjArray); + obj.fLeaves = buf.classStreamer({}, clTObjArray); + obj.fBaskets = buf.classStreamer({}, clTObjArray); + buf.ntoi1(); // isArray + obj.fBasketBytes = buf.readFastArray(obj.fMaxBaskets, kInt); + buf.ntoi1(); // isArray + obj.fBasketEntry = buf.readFastArray(obj.fMaxBaskets, kInt); + const isArray = buf.ntoi1(); + obj.fBasketSeek = buf.readFastArray(obj.fMaxBaskets, isArray === 2 ? kLong64 : kInt); + obj.fFileName = buf.readTString(); + } }, 'ROOT::RNTuple': {