From 90fabe5e9f61a55483e506b02dbbe0bf6f714be9 Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Fri, 11 Oct 2002 06:54:35 +0000 Subject: [PATCH] Fix a problem in TBranchElement::SetAddress in case of an object with a level of inheritance greater than 3 and when data members are simple types following classes at the same level (thanks Susan Kasahara for reporting an example). The new function has been simplified, taking advantage of the work already done by TClass::BuildRealData. git-svn-id: http://root.cern.ch/svn/root/trunk@5417 27541ba8-7e3a-0410-8455-c3a389f83636 --- tree/src/TBranchElement.cxx | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/tree/src/TBranchElement.cxx b/tree/src/TBranchElement.cxx index 7728f0fdaef..ca7d4ebf5c2 100644 --- a/tree/src/TBranchElement.cxx +++ b/tree/src/TBranchElement.cxx @@ -1,4 +1,4 @@ -// @(#)root/tree:$Name: $:$Id: TBranchElement.cxx,v 1.90 2002/07/19 22:52:49 rdm Exp $ +// @(#)root/tree:$Name: $:$Id: TBranchElement.cxx,v 1.91 2002/10/02 22:13:03 brun Exp $ // Author: Rene Brun 14/01/2001 /************************************************************************* @@ -1417,16 +1417,14 @@ void TBranchElement::SetAddress(void *add) TBranchElement *branch = (TBranchElement*)abranch; Int_t nb2 = branch->GetListOfBranches()->GetEntries(); Int_t id = branch->GetID(); + Int_t btype = branch->GetType(); Int_t mOffset = 0; - Int_t baseOffset = 0; Int_t memberOffset = 0; TClass *clparent = gROOT->GetClass(branch->GetParentName()); if (!clparent) clparent = cl; TClass *clm = gROOT->GetClass(branch->GetClassName()); - TStreamerInfo *binfo = clparent->GetStreamerInfo(); - //if sub-branch is a class deriving from the class of this branch - //or a member of the class, one must add the base class offset -//printf("i=%d, clm=%s,clparent=%s, branch=%s, fType=%d, nb2=%d, binfo=%s, uuoff=%d\n",i,clm->GetName(),clparent->GetName(),branch->GetName(),fType,nb2,binfo->GetName(),binfo->GetOffsets()[id]); + TStreamerInfo *info = branch->GetInfo(); +//printf("i=%d, clm=%s,clparent=%s, branch=%s, btype=%d, nb2=%d, info=%s, uuoff=%d\n",i,clm->GetName(),clparent->GetName(),branch->GetName(),btype,nb2,info->GetName(),cinfo->GetOffsets()[id]); if (clparent != clm) { char pname[kMaxLen]; @@ -1435,25 +1433,15 @@ void TBranchElement::SetAddress(void *add) if (clast) { TRealData *rd = (TRealData*)clparent->GetListOfRealData()->FindObject(clast+1); if (rd) mOffset = rd->GetThisOffset(); - if (fType == 2 && !clparent->GetBaseClass(clm)) memberOffset = mOffset - binfo->GetOffsets()[id]; - if (fType == 1) { - binfo->GetStreamerElement(pname,memberOffset); - } - if (!branch->GetType() && !mOffset) { - if (clparent->GetBaseClass(clm)) { - baseOffset = clparent->GetBaseClassOffset(clm); - if (baseOffset < 0) baseOffset = 0; - } - } + if (btype == 0 && !clparent->GetBaseClass(clm)) memberOffset = mOffset - info->GetOffsets()[id];; } } if (nb2 > 0) { - TStreamerInfo *info = branch->GetInfo(); if (info) { Int_t *leafOffsets = info->GetOffsets(); if (leafOffsets) { - branch->SetAddress(fObject + leafOffsets[id] + baseOffset); + branch->SetAddress(fObject + leafOffsets[id]); } else { Error("SetAddress","info=%s, leafOffsets=0",info->GetName()); } @@ -1461,7 +1449,7 @@ void TBranchElement::SetAddress(void *add) Error("SetAddress","branch=%s, info=0",branch->GetName()); } } else { - branch->SetAddress(fObject + baseOffset +memberOffset); + branch->SetAddress(fObject + memberOffset); } } } -- GitLab