🤖 AI generated content
src/rootfilespec/bootstrap/TList.py reads the TObject base, fName and the count unconditionally (TCollection at :15-19, TList.update_members at :36-56, TObjArray.update_members at :68-77). StreamHeader.fVersion is read and then discarded by _read_all_members (src/rootfilespec/bootstrap/streamedobject.py:232), so no hand-written reader can gate on its class version at all.
Spec: Streamer information §4 "TList" and §5 "TObjArray"; the reviewer checked root/core/cont/src/TList.cxx:1335-1365 and TObjArray.cxx:452-456 in the pinned tree:
|
TObject base |
fName |
option string |
255 escape |
TList |
version > 2 |
version > 1 |
version > 3 |
version > 4 |
TObjArray |
version > 2 |
version > 1 |
never |
— |
Containers §1 "TMap" has the same shape (v > 2 / v > 1).
Evidence: by reading the code against the spec and ROOT source; no legacy file exercising these gates was identified in skhep_testdata, so this is unreproduced on real data.
Suggested fix: pass the frame's version word to update_members (e.g. via members or a parameter) so hardcoded classes can gate on it; then add the gates above. The plumbing is the real work and is shared with every other hand-written class that has a version history.
Severity / size: medium (legacy files only) / S once the version is available, M including the plumbing.
Related: #108, #101 (TMap, TClonesArray need the version too), #67 (version plumbing), #105.
Assisted-by: claude-code:claude-fable-5-1
src/rootfilespec/bootstrap/TList.pyreads theTObjectbase,fNameand the count unconditionally (TCollectionat:15-19,TList.update_membersat:36-56,TObjArray.update_membersat:68-77).StreamHeader.fVersionis read and then discarded by_read_all_members(src/rootfilespec/bootstrap/streamedobject.py:232), so no hand-written reader can gate on its class version at all.Spec: Streamer information §4 "
TList" and §5 "TObjArray"; the reviewer checkedroot/core/cont/src/TList.cxx:1335-1365andTObjArray.cxx:452-456in the pinned tree:TObjectbasefNameTListTObjArrayContainers §1 "
TMap" has the same shape (v > 2/v > 1).Evidence: by reading the code against the spec and ROOT source; no legacy file exercising these gates was identified in
skhep_testdata, so this is unreproduced on real data.Suggested fix: pass the frame's version word to
update_members(e.g. viamembersor a parameter) so hardcoded classes can gate on it; then add the gates above. The plumbing is the real work and is shared with every other hand-written class that has a version history.Severity / size: medium (legacy files only) / S once the version is available, M including the plumbing.
Related: #108, #101 (
TMap,TClonesArrayneed the version too), #67 (version plumbing), #105.Assisted-by: claude-code:claude-fable-5-1