From c66ddc143048b16e13c8b05d3b0bfccde09bbea8 Mon Sep 17 00:00:00 2001 From: CristinaCristescu Date: Thu, 10 Oct 2013 10:16:48 +0200 Subject: [PATCH 1/3] Fix NULL returns. --- core/meta/src/TClingBaseClassInfo.cxx | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/core/meta/src/TClingBaseClassInfo.cxx b/core/meta/src/TClingBaseClassInfo.cxx index c3283273eb315..d496d95314d88 100644 --- a/core/meta/src/TClingBaseClassInfo.cxx +++ b/core/meta/src/TClingBaseClassInfo.cxx @@ -220,15 +220,16 @@ OffsetPtrFunc_t TClingBaseClassInfo::GenerateBaseOffsetFunction(const TClingClas for (cling::Transaction::const_iterator I = Tp->decls_begin(), E = Tp->decls_end(); !WFD && I != E; ++I) { if (I->m_Call == cling::Transaction::kCCIHandleTopLevelDecl) { - const FunctionDecl* createWFD = dyn_cast(*I->m_DGR.begin()); - if (createWFD && isa(createWFD->getDeclContext())) { - DeclarationName FName = createWFD->getDeclName(); - if (const IdentifierInfo* FII = FName.getAsIdentifierInfo()) { - if (FII->getName() == wrapper_name) { - WFD = createWFD; + if (const FunctionDecl* createWFD = dyn_cast(*I->m_DGR.begin())) { + if (createWFD && isa(createWFD->getDeclContext())) { + DeclarationName FName = createWFD->getDeclName(); + if (const IdentifierInfo* FII = FName.getAsIdentifierInfo()) { + if (FII->getName() == wrapper_name) { + WFD = createWFD; + } } } - } + } } } if (!WFD) { @@ -496,10 +497,20 @@ long TClingBaseClassInfo::Property() const return 0L; } long property = 0L; + + if (fDecl == fClassInfo->GetDecl()) { + property |= kIsDirectInherit; + } + const clang::CXXRecordDecl* CRD = llvm::dyn_cast(fDecl); const clang::CXXRecordDecl* BaseCRD = llvm::dyn_cast(fBaseInfo->GetDecl()); + if (!CRD || !BaseCRD) { + Error("TClingBaseClassInfo::Property" + , "The derived class and the base class do not have a CXXRecordDecl."); + return property; + } clang::CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/true, /*DetectVirtual=*/true); @@ -511,9 +522,7 @@ long TClingBaseClassInfo::Property() const if (Paths.getDetectedVirtual()) { property |= kIsVirtualBase; } - if (fDecl == fClassInfo->GetDecl()) { - property |= kIsDirectInherit; - } + clang::AccessSpecifier AS = clang::AS_public; // Derived: public Mid; Mid : protected Base: Derived inherits protected Base? for (clang::CXXBasePaths::const_paths_iterator IB = Paths.begin(), EB = Paths.end(); From 24ab5230aea1a8aa84d19437a5322804b9a2c0ff Mon Sep 17 00:00:00 2001 From: CristinaCristescu Date: Thu, 10 Oct 2013 11:45:47 +0200 Subject: [PATCH 2/3] Fix consrt/destr leaks. --- core/meta/src/TCling.cxx | 4 ++-- core/meta/src/TClingBaseClassInfo.cxx | 18 +++++++++++------- core/meta/src/TClingBaseClassInfo.h | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/meta/src/TCling.cxx b/core/meta/src/TCling.cxx index 7f496786b2348..71a79759de04b 100644 --- a/core/meta/src/TCling.cxx +++ b/core/meta/src/TCling.cxx @@ -4784,8 +4784,8 @@ Long_t TCling::ClassInfo_GetBaseOffset(ClassInfo_t* derived, ClassInfo_t* target if (TClinginfo->GetDecl() == TClinginfoTarget->GetDecl()) { return 0; } - TClingBaseClassInfo* binfo = new TClingBaseClassInfo(fInterpreter, TClinginfo, TClinginfoTarget); - return binfo->Offset(address); + TClingBaseClassInfo binfo(fInterpreter, TClinginfo, TClinginfoTarget); + return binfo.Offset(address); } //______________________________________________________________________________ diff --git a/core/meta/src/TClingBaseClassInfo.cxx b/core/meta/src/TClingBaseClassInfo.cxx index d496d95314d88..f0634e94e2749 100644 --- a/core/meta/src/TClingBaseClassInfo.cxx +++ b/core/meta/src/TClingBaseClassInfo.cxx @@ -62,10 +62,11 @@ static const string indent_string(" "); TClingBaseClassInfo::TClingBaseClassInfo(cling::Interpreter* interp, const TClingClassInfo* ci) : fInterp(interp), fClassInfo(0), fFirstTime(true), fDescend(false), - fDecl(0), fIter(0), fBaseInfo(0), fOffset(0L) + fDecl(0), fIter(0), fBaseInfo(0), fOffset(0L), fClassInfoOwnership(false) { if (!ci) { fClassInfo = new TClingClassInfo(interp); + fClassInfoOwnership = true; return; } fClassInfo = ci; @@ -87,7 +88,7 @@ TClingBaseClassInfo::TClingBaseClassInfo(cling::Interpreter* interp, const TClingClassInfo* derived, TClingClassInfo* base) : fInterp(interp), fClassInfo(0), fFirstTime(true), fDescend(false), - fDecl(0), fIter(0), fBaseInfo(0), fOffset(0L) + fDecl(0), fIter(0), fBaseInfo(0), fOffset(0L), fClassInfoOwnership(false) { if (!derived->GetDecl()) { return; @@ -119,9 +120,9 @@ TClingBaseClassInfo::TClingBaseClassInfo(cling::Interpreter* interp, TClingBaseClassInfo::TClingBaseClassInfo(const TClingBaseClassInfo& rhs) : fInterp(rhs.fInterp), fClassInfo(0), fFirstTime(rhs.fFirstTime), fDescend(rhs.fDescend), fDecl(rhs.fDecl), fIter(rhs.fIter), fBaseInfo(0), - fIterStack(rhs.fIterStack), fOffset(rhs.fOffset) + fIterStack(rhs.fIterStack), fOffset(rhs.fOffset), fClassInfoOwnership(false) { - fClassInfo = new TClingClassInfo(*rhs.fClassInfo); + fClassInfo = rhs.fClassInfo; fBaseInfo = new TClingClassInfo(*rhs.fBaseInfo); } @@ -140,6 +141,7 @@ TClingBaseClassInfo& TClingBaseClassInfo::operator=( fBaseInfo = new TClingClassInfo(*rhs.fBaseInfo); fIterStack = rhs.fIterStack; fOffset = rhs.fOffset; + fClassInfoOwnership = true; } return *this; } @@ -442,11 +444,12 @@ long TClingBaseClassInfo::Offset(void * address) const if (!(Property() & kIsVirtualBase)) { clang::ASTContext& Context = Base->getASTContext(); const clang::CXXRecordDecl* RD = llvm::dyn_cast(fDecl); - /*const clang::ASTRecordLayout& Layout = Context.getASTRecordLayout(RD); - int64_t offset = Layout.getBaseClassOffset(Base).getQuantity(); */ + if (!RD) { + // No RecordDecl for the class. + return -1; + } long clang_val = computeOffsetHint(Context, Base, RD).getQuantity(); if (clang_val == -2 || clang_val == -3) { - clang_val = -1; TString baseName; TString derivedName; { @@ -475,6 +478,7 @@ long TClingBaseClassInfo::Offset(void * address) const "There are multiple paths from derived class %s to base class %s.", derivedName.Data(), baseName.Data()); } + clang_val = -1; } return clang_val; } diff --git a/core/meta/src/TClingBaseClassInfo.h b/core/meta/src/TClingBaseClassInfo.h index 0d15f03832047..a5da0ec7f334e 100644 --- a/core/meta/src/TClingBaseClassInfo.h +++ b/core/meta/src/TClingBaseClassInfo.h @@ -52,6 +52,7 @@ class TClingBaseClassInfo { TClingClassInfo *fBaseInfo; // Base class our iterator is currently pointing at, we own. std::vector, long> > fIterStack; // Iterator stack. long fOffset; // Offset of the current base, fDecl, in the most-derived class. + bool fClassInfoOwnership; // We created the fClassInfo and we need to delete it in the constructor. public: From 5f9239f34cfc696b49bc2342745a91cca01eac76 Mon Sep 17 00:00:00 2001 From: CristinaCristescu Date: Thu, 10 Oct 2013 11:50:02 +0200 Subject: [PATCH 3/3] Fix trailing space. --- core/meta/src/TClingBaseClassInfo.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/meta/src/TClingBaseClassInfo.cxx b/core/meta/src/TClingBaseClassInfo.cxx index f0634e94e2749..6a36dd35aa740 100644 --- a/core/meta/src/TClingBaseClassInfo.cxx +++ b/core/meta/src/TClingBaseClassInfo.cxx @@ -231,7 +231,7 @@ OffsetPtrFunc_t TClingBaseClassInfo::GenerateBaseOffsetFunction(const TClingClas } } } - } + } } } if (!WFD) {