diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-05 00:22:28 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-10-05 00:22:28 +0000 |
commit | f03b888a12ccff7d54ddd8a79a0141cf23adbf67 (patch) | |
tree | 7c5774130f8530872ed12d573f8ce466725327dc /lib/Lex/PreprocessingRecord.cpp | |
parent | 6a01012e6bffa246810dc5c655a9a30082331fb2 (diff) |
[preprocessing record] Have PPEntityID be independent of the size of the
loaded entities vector, otherwise its meaning will change when a module
is imported and the vector size changes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165278 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/PreprocessingRecord.cpp')
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 05fbde4944..01f3665e76 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -60,8 +60,7 @@ PreprocessingRecord::getPreprocessedEntitiesInRange(SourceRange Range) { iterator(this, CachedRangeQuery.Result.second)); } - std::pair<PPEntityID, PPEntityID> - Res = getPreprocessedEntitiesInRangeSlow(Range); + std::pair<int, int> Res = getPreprocessedEntitiesInRangeSlow(Range); CachedRangeQuery.Range = Range; CachedRangeQuery.Result = Res; @@ -96,12 +95,12 @@ bool PreprocessingRecord::isEntityInFileID(iterator PPEI, FileID FID) { if (FID.isInvalid()) return false; - PPEntityID PPID = PPEI.Position; - if (PPID < 0) { - assert(unsigned(-PPID-1) < LoadedPreprocessedEntities.size() && + int Pos = PPEI.Position; + if (Pos < 0) { + assert(unsigned(-Pos-1) < LoadedPreprocessedEntities.size() && "Out-of bounds loaded preprocessed entity"); assert(ExternalSource && "No external source to load from"); - unsigned LoadedIndex = LoadedPreprocessedEntities.size()+PPID; + unsigned LoadedIndex = LoadedPreprocessedEntities.size()+Pos; if (PreprocessedEntity *PPE = LoadedPreprocessedEntities[LoadedIndex]) return isPreprocessedEntityIfInFileID(PPE, FID, SourceMgr); @@ -119,15 +118,15 @@ bool PreprocessingRecord::isEntityInFileID(iterator PPEI, FileID FID) { FID, SourceMgr); } - assert(unsigned(PPID) < PreprocessedEntities.size() && + assert(unsigned(Pos) < PreprocessedEntities.size() && "Out-of bounds local preprocessed entity"); - return isPreprocessedEntityIfInFileID(PreprocessedEntities[PPID], + return isPreprocessedEntityIfInFileID(PreprocessedEntities[Pos], FID, SourceMgr); } /// \brief Returns a pair of [Begin, End) iterators of preprocessed entities /// that source range \arg R encompasses. -std::pair<PreprocessingRecord::PPEntityID, PreprocessingRecord::PPEntityID> +std::pair<int, int> PreprocessingRecord::getPreprocessedEntitiesInRangeSlow(SourceRange Range) { assert(Range.isValid()); assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); @@ -320,14 +319,19 @@ void PreprocessingRecord::RegisterMacroDefinition(MacroInfo *Macro, /// \brief Retrieve the preprocessed entity at the given ID. PreprocessedEntity *PreprocessingRecord::getPreprocessedEntity(PPEntityID PPID){ - if (PPID < 0) { - assert(unsigned(-PPID-1) < LoadedPreprocessedEntities.size() && + if (PPID.ID < 0) { + unsigned Index = -PPID.ID - 1; + assert(Index < LoadedPreprocessedEntities.size() && "Out-of bounds loaded preprocessed entity"); - return getLoadedPreprocessedEntity(LoadedPreprocessedEntities.size()+PPID); + return getLoadedPreprocessedEntity(Index); } - assert(unsigned(PPID) < PreprocessedEntities.size() && + + if (PPID.ID == 0) + return 0; + unsigned Index = PPID.ID - 1; + assert(Index < PreprocessedEntities.size() && "Out-of bounds local preprocessed entity"); - return PreprocessedEntities[PPID]; + return PreprocessedEntities[Index]; } /// \brief Retrieve the loaded preprocessed entity at the given index. |