parent
60ad173dfe
commit
f9638bac59
|
@ -21,21 +21,32 @@ namespace clang {
|
||||||
|
|
||||||
class Stmt;
|
class Stmt;
|
||||||
class ScopedDecl;
|
class ScopedDecl;
|
||||||
|
class Decl;
|
||||||
class VariableArrayType;
|
class VariableArrayType;
|
||||||
|
|
||||||
class StmtIteratorBase {
|
class StmtIteratorBase {
|
||||||
protected:
|
protected:
|
||||||
enum { DeclMode = 0x1, SizeOfTypeVAMode = 0x2, Flags = 0x3 };
|
enum { DeclMode = 0x1, SizeOfTypeVAMode = 0x2, DeclGroupMode = 0x3,
|
||||||
|
Flags = 0x3 };
|
||||||
|
|
||||||
union { Stmt** stmt; ScopedDecl* decl; };
|
union { Stmt** stmt; ScopedDecl* decl; Decl** DGI; };
|
||||||
uintptr_t RawVAPtr;
|
uintptr_t RawVAPtr;
|
||||||
|
Decl** DGE;
|
||||||
|
|
||||||
bool inDecl() const {
|
bool inDecl() const {
|
||||||
return RawVAPtr & DeclMode ? true : false;
|
return (RawVAPtr & Flags) == DeclMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool inDeclGroup() const {
|
||||||
|
return (RawVAPtr & Flags) == DeclGroupMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool inSizeOfTypeVA() const {
|
bool inSizeOfTypeVA() const {
|
||||||
return RawVAPtr & SizeOfTypeVAMode ? true : false;
|
return (RawVAPtr & Flags) == SizeOfTypeVAMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool inStmt() const {
|
||||||
|
return (RawVAPtr & Flags) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VariableArrayType* getVAPtr() const {
|
VariableArrayType* getVAPtr() const {
|
||||||
|
@ -43,11 +54,12 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
void setVAPtr(VariableArrayType* P) {
|
void setVAPtr(VariableArrayType* P) {
|
||||||
assert (inDecl() || inSizeOfTypeVA());
|
assert (inDecl() || inDeclGroup() || inSizeOfTypeVA());
|
||||||
RawVAPtr = reinterpret_cast<uintptr_t>(P) | (RawVAPtr & Flags);
|
RawVAPtr = reinterpret_cast<uintptr_t>(P) | (RawVAPtr & Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NextDecl(bool ImmediateAdvance = true);
|
void NextDecl(bool ImmediateAdvance = true);
|
||||||
|
bool HandleDecl(Decl* D);
|
||||||
void NextVA();
|
void NextVA();
|
||||||
|
|
||||||
Stmt*& GetDeclExpr() const;
|
Stmt*& GetDeclExpr() const;
|
||||||
|
@ -55,6 +67,7 @@ protected:
|
||||||
StmtIteratorBase(Stmt** s) : stmt(s), RawVAPtr(0) {}
|
StmtIteratorBase(Stmt** s) : stmt(s), RawVAPtr(0) {}
|
||||||
StmtIteratorBase(ScopedDecl* d);
|
StmtIteratorBase(ScopedDecl* d);
|
||||||
StmtIteratorBase(VariableArrayType* t);
|
StmtIteratorBase(VariableArrayType* t);
|
||||||
|
StmtIteratorBase(Decl** dgi, Decl** dge);
|
||||||
StmtIteratorBase() : stmt(NULL), RawVAPtr(0) {}
|
StmtIteratorBase() : stmt(NULL), RawVAPtr(0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,11 +82,12 @@ protected:
|
||||||
public:
|
public:
|
||||||
StmtIteratorImpl() {}
|
StmtIteratorImpl() {}
|
||||||
StmtIteratorImpl(Stmt** s) : StmtIteratorBase(s) {}
|
StmtIteratorImpl(Stmt** s) : StmtIteratorBase(s) {}
|
||||||
|
StmtIteratorImpl(Decl** dgi, Decl** dge) : StmtIteratorBase(dgi, dge) {}
|
||||||
StmtIteratorImpl(ScopedDecl* d) : StmtIteratorBase(d) {}
|
StmtIteratorImpl(ScopedDecl* d) : StmtIteratorBase(d) {}
|
||||||
StmtIteratorImpl(VariableArrayType* t) : StmtIteratorBase(t) {}
|
StmtIteratorImpl(VariableArrayType* t) : StmtIteratorBase(t) {}
|
||||||
|
|
||||||
DERIVED& operator++() {
|
DERIVED& operator++() {
|
||||||
if (inDecl()) {
|
if (inDecl() || inDeclGroup()) {
|
||||||
if (getVAPtr()) NextVA();
|
if (getVAPtr()) NextVA();
|
||||||
else NextDecl();
|
else NextDecl();
|
||||||
}
|
}
|
||||||
|
@ -100,7 +114,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
REFERENCE operator*() const {
|
REFERENCE operator*() const {
|
||||||
return (REFERENCE) (inDecl() || inSizeOfTypeVA() ? GetDeclExpr() : *stmt);
|
return (REFERENCE) (inStmt() ? *stmt : GetDeclExpr());
|
||||||
}
|
}
|
||||||
|
|
||||||
REFERENCE operator->() const { return operator*(); }
|
REFERENCE operator->() const { return operator*(); }
|
||||||
|
@ -110,6 +124,8 @@ struct StmtIterator : public StmtIteratorImpl<StmtIterator,Stmt*&> {
|
||||||
explicit StmtIterator() : StmtIteratorImpl<StmtIterator,Stmt*&>() {}
|
explicit StmtIterator() : StmtIteratorImpl<StmtIterator,Stmt*&>() {}
|
||||||
|
|
||||||
StmtIterator(Stmt** S) : StmtIteratorImpl<StmtIterator,Stmt*&>(S) {}
|
StmtIterator(Stmt** S) : StmtIteratorImpl<StmtIterator,Stmt*&>(S) {}
|
||||||
|
StmtIterator(Decl** dgi, Decl** dge)
|
||||||
|
: StmtIteratorImpl<StmtIterator,Stmt*&>(dgi, dge) {}
|
||||||
|
|
||||||
StmtIterator(VariableArrayType* t):StmtIteratorImpl<StmtIterator,Stmt*&>(t) {}
|
StmtIterator(VariableArrayType* t):StmtIteratorImpl<StmtIterator,Stmt*&>(t) {}
|
||||||
StmtIterator(ScopedDecl* D) : StmtIteratorImpl<StmtIterator,Stmt*&>(D) {}
|
StmtIterator(ScopedDecl* D) : StmtIteratorImpl<StmtIterator,Stmt*&>(D) {}
|
||||||
|
|
|
@ -35,12 +35,21 @@ void StmtIteratorBase::NextVA() {
|
||||||
p = FindVA(p->getElementType().getTypePtr());
|
p = FindVA(p->getElementType().getTypePtr());
|
||||||
setVAPtr(p);
|
setVAPtr(p);
|
||||||
|
|
||||||
if (!p && inDecl()) {
|
if (!p) {
|
||||||
|
if (inDecl()) {
|
||||||
if (VarDecl* VD = dyn_cast<VarDecl>(decl))
|
if (VarDecl* VD = dyn_cast<VarDecl>(decl))
|
||||||
if (VD->Init)
|
if (VD->Init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
NextDecl();
|
NextDecl();
|
||||||
|
}
|
||||||
|
else if (inDeclGroup()) {
|
||||||
|
if (VarDecl* VD = dyn_cast<VarDecl>(*DGI))
|
||||||
|
if (VD->Init)
|
||||||
|
return;
|
||||||
|
|
||||||
|
NextDecl();
|
||||||
|
}
|
||||||
} else if (inSizeOfTypeVA()) {
|
} else if (inSizeOfTypeVA()) {
|
||||||
assert(!decl);
|
assert(!decl);
|
||||||
RawVAPtr = 0;
|
RawVAPtr = 0;
|
||||||
|
@ -48,45 +57,56 @@ void StmtIteratorBase::NextVA() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
|
void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
|
||||||
assert (inDecl());
|
|
||||||
assert (getVAPtr() == NULL);
|
assert (getVAPtr() == NULL);
|
||||||
|
|
||||||
|
if (inDecl()) {
|
||||||
assert (decl);
|
assert (decl);
|
||||||
|
|
||||||
if (ImmediateAdvance) {
|
if (ImmediateAdvance)
|
||||||
decl = decl->getNextDeclarator();
|
decl = decl->getNextDeclarator();
|
||||||
|
|
||||||
if (!decl) {
|
for ( ; decl ; decl = decl->getNextDeclarator())
|
||||||
RawVAPtr = 0;
|
if (HandleDecl(decl))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
assert (inDeclGroup());
|
||||||
|
|
||||||
|
if (ImmediateAdvance)
|
||||||
|
++DGI;
|
||||||
|
|
||||||
|
for ( ; DGI != DGE; ++DGI)
|
||||||
|
if (HandleDecl(*DGI))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ; decl ; decl = decl->getNextDeclarator()) {
|
RawVAPtr = 0;
|
||||||
if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
|
}
|
||||||
|
|
||||||
|
bool StmtIteratorBase::HandleDecl(Decl* D) {
|
||||||
|
|
||||||
|
if (VarDecl* VD = dyn_cast<VarDecl>(D)) {
|
||||||
if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
|
if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
|
||||||
setVAPtr(VAPtr);
|
setVAPtr(VAPtr);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VD->getInit())
|
if (VD->getInit())
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(decl)) {
|
else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(D)) {
|
||||||
if (VariableArrayType* VAPtr =
|
if (VariableArrayType* VAPtr =
|
||||||
FindVA(TD->getUnderlyingType().getTypePtr())) {
|
FindVA(TD->getUnderlyingType().getTypePtr())) {
|
||||||
setVAPtr(VAPtr);
|
setVAPtr(VAPtr);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(decl))
|
else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(D)) {
|
||||||
if (ECD->getInitExpr())
|
if (ECD->getInitExpr())
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!decl) {
|
return false;
|
||||||
RawVAPtr = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
|
StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
|
||||||
|
@ -95,17 +115,32 @@ StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
|
||||||
NextDecl(false);
|
NextDecl(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StmtIteratorBase::StmtIteratorBase(Decl** dgi, Decl** dge)
|
||||||
|
: DGI(dgi), RawVAPtr(DeclGroupMode), DGE(dge) {
|
||||||
|
NextDecl(false);
|
||||||
|
}
|
||||||
|
|
||||||
StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
|
StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
|
||||||
: decl(NULL), RawVAPtr(SizeOfTypeVAMode) {
|
: decl(0), RawVAPtr(SizeOfTypeVAMode) {
|
||||||
RawVAPtr |= reinterpret_cast<uintptr_t>(t);
|
RawVAPtr |= reinterpret_cast<uintptr_t>(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stmt*& StmtIteratorBase::GetDeclExpr() const {
|
Stmt*& StmtIteratorBase::GetDeclExpr() const {
|
||||||
|
|
||||||
|
if (inDeclGroup()) {
|
||||||
|
VarDecl* VD = cast<VarDecl>(*DGI);
|
||||||
|
return VD->Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert (inDecl() || inSizeOfTypeVA());
|
||||||
|
|
||||||
if (VariableArrayType* VAPtr = getVAPtr()) {
|
if (VariableArrayType* VAPtr = getVAPtr()) {
|
||||||
assert (VAPtr->SizeExpr);
|
assert (VAPtr->SizeExpr);
|
||||||
return VAPtr->SizeExpr;
|
return VAPtr->SizeExpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert (inDecl());
|
||||||
|
|
||||||
if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
|
if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
|
||||||
assert (VD->Init);
|
assert (VD->Init);
|
||||||
return VD->Init;
|
return VD->Init;
|
||||||
|
|
Loading…
Reference in New Issue