Skip to content

Remove hand-written assumed.TFormula (it shadows the file's own StreamerInfo) and fix TStreamerLoop of TString* #72

Open

Description

@nsmith-

🤖 AI generated content

Line item of #9: TFormula.update_members is not implemented (uproot-issue-181.root). Also found independently by the bootstrap review (#66).

Problem 1 — self-inflicted shadowing. src/rootfilespec/bootstrap/assumed.py:102-142 defines a hand-written TFormula that is exported in bootstrap.__all__, so src/rootfilespec/dynamic.py:27-30 skips the file's own info ("already declared") and reading hits the deliberate NotImplementedError. Spec, TFormula and TF1: "Every version of both classes that a released ROOT ever wrote is streamer-info driven … no hand-written layout is needed." uproot-issue-181.root carries complete TFormula v8 and TF1 v7 infos; uproot-issue-607.root (TFormula v10) and the spec fixture data/classes/formula.root are unreadable for the same reason.

Problem 2 — exposed once (1) is removed. With TFormula dropped from BOOTSTRAP_TYPES at runtime, the generated class fails in fOper. The cause is the preceding member fExpr, a TStreamerLoop (501) of TString*: TStreamerLoop.member_definition (src/rootfilespec/bootstrap/TStreamerInfo.py:448-478) generates list[Ref[TString]], i.e. object slots. Element types §8: the form is chosen by a strstr for ** in fTypeName — one * is c plain objects, ** is c object slots, and "a TString* loop is c bare counted strings". Bytes in the file agree: 40 00 00 07 00 09 | 04 70 6f 6c 35 = frame, then the bare counted string "pol5", then 01 (the is-present flag of fOper).

Suggested fix: delete TFormula from assumed.py and bootstrap/__init__.py; in TStreamerLoop.member_definition use the pointee type directly unless fTypeName contains **.

Note for #67 / #22: TFormula ≤ 8 and ≥ 9 are two unrelated C++ classes under one name (Formula.md intro and §1.1: "TFormula at version ≤ 8 is the old class, ≥ 9 is the new one"), likewise TF1 ≤ 7 / ≥ 8.

Severity / size: medium (any file with a TF1/TFormula fails), S–M. Clears 1 xfail.

Assisted-by: claude-code:claude-fable-5-1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions