From a27a26776fa38ecb5ab976ddd661e10c88e10e51 Mon Sep 17 00:00:00 2001
From: Axel Naumann <Axel.Naumann@cern.ch>
Date: Mon, 21 Nov 2016 09:31:12 +0100
Subject: [PATCH] Use the tree number, not the pointer; return early if
 end-of-chain; simplify condition for setting proxies.

---
 tree/treeplayer/src/TTreeReader.cxx | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/tree/treeplayer/src/TTreeReader.cxx b/tree/treeplayer/src/TTreeReader.cxx
index 56abee7ecc4..3bbb743083f 100644
--- a/tree/treeplayer/src/TTreeReader.cxx
+++ b/tree/treeplayer/src/TTreeReader.cxx
@@ -313,9 +313,16 @@ TTreeReader::EEntryStatus TTreeReader::SetEntryBase(Long64_t entry, Bool_t local
       return fEntryStatus;
    }
 
-   Int_t treeNumberBeforeLoadTree = fTree->GetTreeNumber();
+   if (fProxiesSet && fDirector && fDirector->GetReadEntry() == -1) {
+      // Passed the end of the chain, Restart() was not called:
+      // don't try to load entries anymore. Can happen in these cases:
+      // while (tr.Next()) {something()};
+      // while (tr.Next()) {somethingelse()}; // should not be calling somethingelse().
+      fEntryStatus = kEntryNotFound;
+      return fEntryStatus;
+   }
 
-   TTree* prevTree = fDirector->GetTree();
+   Int_t treeNumberBeforeLoadTree = fTree->GetTreeNumber();
 
    TTree* treeToCallLoadOn = local ? fTree->GetTree() : fTree;
    Long64_t loadResult = treeToCallLoadOn->LoadTree(entry);
@@ -343,12 +350,12 @@ TTreeReader::EEntryStatus TTreeReader::SetEntryBase(Long64_t entry, Bool_t local
       }
    }
 
-   if (fMostRecentTreeNumber != fTree->GetTreeNumber()) {
+   if (fDirector->GetTree() != fTree->GetTree())
       fDirector->SetTree(fTree->GetTree());
-      fMostRecentTreeNumber = fTree->GetTreeNumber();
-   }
 
-   if (!prevTree || fDirector->GetReadEntry() == -1 || !fProxiesSet) {
+   fMostRecentTreeNumber = fTree->GetTreeNumber();
+
+   if (!fProxiesSet) {
       // Tell readers we now have a tree
       for (std::deque<ROOT::Internal::TTreeReaderValueBase*>::const_iterator
               i = fValues.begin(); i != fValues.end(); ++i) { // Iterator end changes when parameterized arrays are read
-- 
GitLab