Skip to content

Commit 24802e7

Browse files
committed
Finally implement correct positioning in the buffer to read next entry.
Solves problem with unclear way when to read or not to read version for empty STL container.
1 parent dc17238 commit 24802e7

File tree

3 files changed

+4
-59
lines changed

3 files changed

+4
-59
lines changed

changes.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
2. Support TBranchObject - appears in old files
66
3. Fix - problem with zooming in THStack
77
4. Fix - empty baskets at the end of branch store
8-
5. Fix - more checks when reading version for empty STL container
8+
5. Fix - solve problem with empty STL containers
9+
6. Fix - correcty set buffer position for the entry
910

1011

1112
## Changes in 5.0.0

scripts/JSRootIOEvolution.js

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1980,7 +1980,6 @@
19801980
if ((element._typename === 'TStreamerSTLstring') ||
19811981
(member.typename == "string") || (member.typename == "string*")) {
19821982
member.readelem = function(buf) { return buf.ReadTString(); };
1983-
// member.read_empty_stl_version = false;
19841983
} else
19851984
if ((stl === JSROOT.IO.kSTLvector) || (stl === JSROOT.IO.kSTLlist) ||
19861985
(stl === JSROOT.IO.kSTLdeque) || (stl === JSROOT.IO.kSTLset) ||
@@ -2030,11 +2029,6 @@
20302029
subelem.$fictional = true;
20312030
member.submember = JSROOT.IO.CreateMember(subelem, file);
20322031
}
2033-
//else
2034-
//if ((member.conttype.indexOf('pair<')===0) &&
2035-
// JSROOT.IO.GetPairStreamer(null, member.conttype, file)) {
2036-
// // member.read_empty_stl_version = true; // seems to be, pair<> needs empty version
2037-
// }
20382032
}
20392033
}
20402034
} else
@@ -2051,8 +2045,6 @@
20512045

20522046
member.streamer = JSROOT.IO.GetPairStreamer(member.si, member.pairtype, file);
20532047

2054-
// member.read_empty_stl_version = true; // in branch reading read version even for empty container, vector does not have it
2055-
20562048
if (!member.streamer || (member.streamer.length!==2)) {
20572049
JSROOT.console('Fail to build streamer for pair ' + member.pairtype);
20582050
delete member.streamer;
@@ -2077,40 +2069,10 @@
20772069
if (!element.$fictional) {
20782070

20792071
member.read_version = function(buf, cnt) {
2080-
// read version, check member-wise flag; if any, read version for contained object
2081-
2082-
// console.log('start reading version', buf.o, buf.remain(), 'cnt', cnt, 'read_empty', this.read_empty_stl_version);
2083-
2084-
// workaround - in some cases version is not written for empty container
2085-
if ((cnt===0) && ((buf.remain()<6) || this.read_empty_stl_version === false)) {
2086-
if (this.read_empty_stl_version) throw new Error("SKIP0 VERSION WHEN SHOULD READ " + this.typename + " - " + this.name);
2087-
return null;
2088-
}
20892072

2073+
if (cnt===0) return null;
20902074
var o = buf.o, ver = buf.ReadVersion();
2091-
2092-
console.log('cnt',cnt, 'ver', ver, 'read_empty', this.read_empty_stl_version);
2093-
20942075
this.member_wise = ((ver.val & JSROOT.IO.kStreamedMemberWise) !== 0);
2095-
2096-
if ((cnt===0) && (ver.bytecnt===0) && !this.member_wise) {
2097-
2098-
if (this.read_empty_stl_version!==true) throw new Error("READ ZERO WHEN SHOULD NOT " + this.typename + " - " + this.name + ' ver ' + ver.val);
2099-
2100-
return ver;
2101-
}
2102-
2103-
// workaround - in some cases version is not written for empty container
2104-
if (cnt===0)
2105-
if (((ver.bytecnt!==6) && (ver.bytecnt!=2) && !this.read_empty_stl_version) ||
2106-
(ver.bytecnt && (ver.bytecnt > (this.member_wise ? 12 : 6)))) {
2107-
if (this.read_empty_stl_version) throw new Error("SKIP1 VERSION WHEN SHOULD READ " + this.typename + " - " + this.name + ' bytecnt ' + ver.bytecnt);
2108-
buf.o = o;
2109-
return null;
2110-
}
2111-
2112-
if ((cnt===0) && this.read_empty_stl_version===false) throw new Error("READ VERSION WHEN SHOULD SKIP " + this.typename + " - " + this.name);
2113-
21142076
this.stl_version = undefined;
21152077
if (this.member_wise) {
21162078
this.stl_version = { val: buf.ntoi2() };

scripts/JSRootTree.js

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,6 @@
14091409
staged_prev: 0, // entry limit of previous I/O request
14101410
staged_now: 0, // entry limit of current I/O request
14111411
progress_showtm: 0, // last time when progress was showed
1412-
have_to_read_empty_stl_branch: false, // by default splitted container branch read version if empty container
14131412
GetBasketEntry : function(k) {
14141413
if (!this.branch || (k > this.branch.fMaxBaskets)) return 0;
14151414
var res = (k < this.branch.fMaxBaskets) ? this.branch.fBasketEntry[k] : 0;
@@ -1654,13 +1653,8 @@
16541653
} else
16551654
if (is_brelem && (nb_leaves <= 1)) {
16561655

1657-
item.have_to_read_empty_stl_branch = (branch.fType === JSROOT.BranchType.kClonesMemberNode);
1658-
16591656
elem = JSROOT.IO.FindBrachStreamerElement(branch, handle.file);
16601657

1661-
if (elem)
1662-
console.log('ELEMENT', elem.fName, elem.fType, elem.fTypeName, 'READ_EMPTY', item.have_to_read_empty_stl_branch);
1663-
16641658
// this is basic type - can try to solve problem differently
16651659
if (!elem && branch.fStreamerType && (branch.fStreamerType < 20)) {
16661660
elem = JSROOT.IO.CreateStreamerElement(target_name, branch.fStreamerType);
@@ -1775,9 +1769,6 @@
17751769
if (member.objs_branch_func) {
17761770
// STL branch provides special function for the reading
17771771
member.func = member.objs_branch_func;
1778-
1779-
member.read_empty_stl_version = item.have_to_read_empty_stl_branch;
1780-
17811772
} else {
17821773
member.func0 = member.func;
17831774

@@ -1853,16 +1844,13 @@
18531844
// function provided by normal I/O
18541845
member.func = member.branch_func;
18551846
member.stl_size = item_cnt.name;
1856-
member.read_empty_stl_version = item.have_to_read_empty_stl_branch;
1857-
18581847
} else
18591848
if ((elem.fType === JSROOT.IO.kStreamLoop) || (elem.fType === JSROOT.IO.kOffsetL+JSROOT.IO.kStreamLoop)) {
18601849
if (item_cnt2) {
18611850
// special solution for kStreamLoop
18621851
member.stl_size = item_cnt.name;
18631852
member.cntname = item_cnt2.name;
18641853
member.func = member.branch_func; // this is special function, provided by base I/O
1865-
member.read_empty_stl_version = item.have_to_read_empty_stl_branch;
18661854
} else {
18671855
member.cntname = item_cnt.name;
18681856
}
@@ -2071,7 +2059,7 @@
20712059
basket.fDisplacement = undefined;
20722060

20732061
// rollback buffer - not needed in the future
2074-
buf.locate(buf.raw_shift);
2062+
// buf.locate(buf.raw_shift);
20752063
}
20762064

20772065
function ProcessBlobs(blobs) {
@@ -2097,8 +2085,6 @@
20972085

20982086
bitems[k].bskt_obj = basket; // only number of entries in the basket are relevant for the moment
20992087

2100-
console.log('CHECK', basket.fKeylen, basket.fObjlen, basket.fNbytes);
2101-
21022088
if (basket.fKeylen + basket.fObjlen === basket.fNbytes) {
21032089
// use data from original blob
21042090
buf.raw_shift = 0;
@@ -2117,11 +2103,7 @@
21172103

21182104
bitems[k].raw = buf; // here already unpacket buffer
21192105

2120-
console.log('BUFFER', buf.remain());
2121-
21222106
ReadBasketEntryOffset(bitems[k].branch, basket, buf);
2123-
2124-
console.log('Extract RAW ', buf.remain(), 'last', basket.fLast - basket.fKeylen, 'objlen', basket.fObjlen);
21252107
}
21262108

21272109
if (ExtractPlaces())

0 commit comments

Comments
 (0)