From c2fb49ca1783b9ea2dd8b7cb90a2284750076c65 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Tue, 31 Jan 2017 05:53:50 -0800 Subject: [PATCH] Port TagIterator to correctly support ReMap (doh). --- apt-pkg/cacheiterators.h | 47 ++++++++++++++-------------------------- apt-pkg/pkgcachegen.cc | 18 ++++++++++----- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 3308f43dd..5fb416d79 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -250,45 +250,30 @@ class pkgCache::VerIterator : public Iterator { }; /*}}}*/ // Tag Iterator /*{{{*/ -class pkgCache::TagIterator -{ - Tag *Tg; - pkgCache *Owner; - - void _dummy(); - - public: +class pkgCache::TagIterator : public Iterator { + public: + inline Tag* OwnerPointer() const { + return (Owner != 0) ? Owner->TagP : 0; + } // Iteration - void operator ++(int) {if (Tg != Owner->TagP) Tg = Owner->TagP + Tg->NextTag;}; + void operator ++(int) {if (S != Owner->TagP) S = Owner->TagP + S->NextTag;}; inline void operator ++() {operator ++(0);}; - inline bool end() const {return Tg == Owner->TagP?true:false;}; - inline void operator =(const TagIterator &B) {Tg = B.Tg; Owner = B.Owner;}; // Comparison - inline bool operator ==(const TagIterator &B) const {return Tg == B.Tg;}; - inline bool operator !=(const TagIterator &B) const {return Tg != B.Tg;}; + inline bool operator ==(const TagIterator &B) const {return S == B.S;}; + inline bool operator !=(const TagIterator &B) const {return S != B.S;}; int CompareTag(const TagIterator &B) const; // Accessors - inline Tag *operator ->() {return Tg;}; - inline Tag const *operator ->() const {return Tg;}; - inline Tag &operator *() {return *Tg;}; - inline Tag const &operator *() const {return *Tg;}; - inline operator Tag *() {return Tg == Owner->TagP?0:Tg;}; - inline operator Tag const *() const {return Tg == Owner->TagP?0:Tg;}; - inline pkgCache *Cache() {return Owner;}; - - inline const char *Name() const {return Owner->StrP + Tg->Name;}; - inline unsigned long Index() const {return Tg - Owner->TagP;}; - - inline TagIterator() : Tg(0), Owner(0) {}; - inline TagIterator(pkgCache &Owner,Tag *Trg = 0) : Tg(Trg), - Owner(&Owner) - { - if (Tg == 0) - Tg = Owner.TagP; - }; + inline const char *Name() const {return Owner->StrP + S->Name;}; + inline unsigned long Index() const {return S - Owner->TagP;}; + + inline TagIterator(pkgCache &Owner,Tag *Trg = 0) : Iterator(Owner, Trg) { + if (S == 0) + S = OwnerPointer(); + } + inline TagIterator() : Iterator() {} }; /*}}}*/ // Description Iterator /*{{{*/ diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 8ee682db8..7152f04e2 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -175,6 +175,10 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM i != Dynamic::toReMap.end(); ++i) if (std::get<1>(seen.insert(*i)) == true) (*i)->ReMap(oldMap, newMap); + for (std::vector::const_iterator i = Dynamic::toReMap.begin(); + i != Dynamic::toReMap.end(); ++i) + if (std::get<1>(seen.insert(*i)) == true) + (*i)->ReMap(oldMap, newMap); for (std::vector::const_iterator i = Dynamic::toReMap.begin(); i != Dynamic::toReMap.end(); ++i) if (std::get<1>(seen.insert(*i)) == true) @@ -1290,18 +1294,20 @@ bool pkgCacheGenerator::NewTag(pkgCache::VerIterator &Ver, unsigned int NameSize) { // Get a structure - unsigned long Tagg = AllocateInMap(sizeof(pkgCache::Tag)); - if (Tagg == 0) + map_pointer_t const idxTag = AllocateInMap(sizeof(pkgCache::Tag)); + if (unlikely(idxTag == 0)) return false; - Cache.HeaderP->TagCount++; // Fill it in - pkgCache::TagIterator Tg(Cache,Cache.TagP + Tagg); - Tg->Name = WriteStringInMap(NameStart,NameSize); - if (Tg->Name == 0) + pkgCache::TagIterator Tg(Cache,Cache.TagP + idxTag); + map_pointer_t const idxName = WriteStringInMap(NameStart,NameSize); + if (idxName == 0) return false; + Tg->Name = idxName; + Tg->NextTag = Ver->TagList; Ver->TagList = Tg.Index(); + Cache.HeaderP->TagCount++; return true; } -- 2.45.2