Simplify CXXScopeSpec a lot. No more weird SmallVector-like hacks here
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67800 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/DeclSpec.cpp b/lib/Parse/DeclSpec.cpp
index 72ac311..94799c3 100644
--- a/lib/Parse/DeclSpec.cpp
+++ b/lib/Parse/DeclSpec.cpp
@@ -24,67 +24,6 @@
return D.Report(FullSourceLoc(Loc, SrcMgr), DiagID);
}
-/// \brief Double the capacity of this scope specifier.
-void CXXScopeSpec::reallocate() {
- Action::CXXScopeTy **Data = new Action::CXXScopeTy *[Capacity * 2];
-
- Action::CXXScopeTy **From
- = Capacity == 4? &InlineScopeReps[0] : ManyScopeReps;
- std::memcpy(Data, From, Capacity * sizeof(Action::CXXScopeTy *));
-
- if (Capacity > 4)
- delete [] ManyScopeReps;
- ManyScopeReps = Data;
- Capacity *= 2;
-}
-
-CXXScopeSpec::CXXScopeSpec(const CXXScopeSpec &SS)
- : Range(SS.Range), NumScopeReps(SS.NumScopeReps), Capacity(SS.Capacity) {
-
- if (Capacity > 4) {
- ManyScopeReps = new Action::CXXScopeTy *[Capacity];
- memcpy(ManyScopeReps, SS.ManyScopeReps,
- Capacity * sizeof(Action::CXXScopeTy *));
- } else {
- memcpy(InlineScopeReps, SS.InlineScopeReps,
- Capacity * sizeof(Action::CXXScopeTy *));
- }
-}
-
-CXXScopeSpec &CXXScopeSpec::operator=(const CXXScopeSpec &SS) {
- // FIXME: Does not provide the strong exception safety guarantee.
- this->~CXXScopeSpec();
- new (this) CXXScopeSpec(SS);
- return *this;
-}
-
-void *CXXScopeSpec::buildAnnotationData() const {
- uintptr_t *Data = (uintptr_t *)malloc(sizeof(uintptr_t) * (size() + 1));
- Data[0] = size();
- for (unsigned I = 0; I < size(); ++I)
- Data[I + 1] = reinterpret_cast<uintptr_t>(getScopeRep(I));
- return Data;
-}
-
-void CXXScopeSpec::setFromAnnotationData(void *DataIn) {
- uintptr_t *Data = static_cast<uintptr_t *>(DataIn);
- NumScopeReps = *Data;
-
- // Allocate enough space for the annotation data.
- if (NumScopeReps > Capacity) {
- if (Capacity > 4)
- delete [] ManyScopeReps;
-
- Capacity = NumScopeReps;
- ManyScopeReps = new Action::CXXScopeTy *[Capacity];
- }
-
- if (Capacity > 4)
- std::memcpy(ManyScopeReps, Data + 1, sizeof(uintptr_t) * NumScopeReps);
- else
- std::memcpy(InlineScopeReps, Data + 1, sizeof(uintptr_t) * NumScopeReps);
-}
-
/// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
/// "TheDeclarator" is the declarator that this will be added to.
DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 7a92171..a9fbbbe 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -515,7 +515,7 @@
goto DoneWithDeclSpec;
CXXScopeSpec SS;
- SS.setFromAnnotationData(Tok.getAnnotationValue());
+ SS.setScopeRep(Tok.getAnnotationValue());
SS.setRange(Tok.getAnnotationRange());
// If the next token is the name of the class type that the C++ scope
@@ -532,7 +532,6 @@
if (TypeRep == 0)
goto DoneWithDeclSpec;
- CXXScopeSpec::freeAnnotationData(Tok.getAnnotationValue());
ConsumeToken(); // The C++ scope.
isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typename, Loc, PrevSpec,
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp
index 731f4c7..b3ec24f 100644
--- a/lib/Parse/ParseExprCXX.cpp
+++ b/lib/Parse/ParseExprCXX.cpp
@@ -36,8 +36,7 @@
"Call sites of this function should be guarded by checking for C++");
if (Tok.is(tok::annot_cxxscope)) {
- SS.setFromAnnotationData(Tok.getAnnotationValue());
- CXXScopeSpec::freeAnnotationData(Tok.getAnnotationValue());
+ SS.setScopeRep(Tok.getAnnotationValue());
SS.setRange(Tok.getAnnotationRange());
ConsumeToken();
return true;
@@ -54,7 +53,7 @@
// '::' - Global scope qualifier.
SourceLocation CCLoc = ConsumeToken();
SS.setBeginLoc(CCLoc);
- SS.addScopeRep(Actions.ActOnCXXGlobalScopeSpecifier(CurScope, CCLoc));
+ SS.setScopeRep(Actions.ActOnCXXGlobalScopeSpecifier(CurScope, CCLoc));
SS.setEndLoc(CCLoc);
HasScopeSpecifier = true;
}
@@ -80,7 +79,7 @@
if (SS.isInvalid())
continue;
- SS.addScopeRep(
+ SS.setScopeRep(
Actions.ActOnCXXNestedNameSpecifier(CurScope, SS, IdLoc, CCLoc, *II));
SS.setEndLoc(CCLoc);
continue;
@@ -165,7 +164,7 @@
HasScopeSpecifier = true;
}
- SS.addScopeRep(
+ SS.setScopeRep(
Actions.ActOnCXXNestedNameSpecifier(CurScope, SS,
TypeToken.getAnnotationValue(),
TypeToken.getAnnotationRange(),
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 7a221d0..5ce8b3d 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -866,7 +866,7 @@
else
PP.EnterToken(Tok);
Tok.setKind(tok::annot_cxxscope);
- Tok.setAnnotationValue(SS.buildAnnotationData());
+ Tok.setAnnotationValue(SS.getScopeRep());
Tok.setAnnotationRange(SS.getRange());
// In case the tokens were cached, have Preprocessor replace them with the
@@ -898,7 +898,7 @@
else
PP.EnterToken(Tok);
Tok.setKind(tok::annot_cxxscope);
- Tok.setAnnotationValue(SS.buildAnnotationData());
+ Tok.setAnnotationValue(SS.getScopeRep());
Tok.setAnnotationRange(SS.getRange());
// In case the tokens were cached, have Preprocessor replace them with the