зеркало из https://github.com/microsoft/clang-1.git
Change the implementation of symbol_iterator to not use a union and rely on any details of SymbolRef's implementation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60579 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
562731eabb
Коммит
96f560b96b
|
@ -101,37 +101,37 @@ public:
|
|||
void printStdErr() const;
|
||||
|
||||
class symbol_iterator {
|
||||
const enum { One, Many } HowMany;
|
||||
union { uintptr_t sym; const SymbolRef* sptr; };
|
||||
SymbolRef SingleRef;
|
||||
const SymbolRef* sptr;
|
||||
public:
|
||||
|
||||
bool operator==(const symbol_iterator& X) {
|
||||
return X.sym == sym;
|
||||
return SingleRef == X.SingleRef && sptr == X.sptr;
|
||||
}
|
||||
|
||||
bool operator!=(const symbol_iterator& X) {
|
||||
return X.sym != sym;
|
||||
return SingleRef != X.SingleRef || sptr != X.sptr;
|
||||
}
|
||||
|
||||
symbol_iterator& operator++() {
|
||||
if (HowMany == Many)
|
||||
if (sptr)
|
||||
++sptr;
|
||||
else
|
||||
sym = ~0x0;
|
||||
SingleRef = SymbolRef();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
SymbolRef operator*() const {
|
||||
if (HowMany)
|
||||
if (sptr)
|
||||
return *sptr;
|
||||
|
||||
return SymbolRef(sym);
|
||||
return SingleRef;
|
||||
}
|
||||
|
||||
symbol_iterator(SymbolRef x) : HowMany(One), sym(x.getNumber()) {}
|
||||
symbol_iterator() : HowMany(One), sym(~0x0) {}
|
||||
symbol_iterator(const SymbolRef* x) : HowMany(Many), sptr(x) {}
|
||||
symbol_iterator(SymbolRef x) : SingleRef(x), sptr(0) {}
|
||||
symbol_iterator() : sptr(0) {}
|
||||
symbol_iterator(const SymbolRef* x) : sptr(x) {}
|
||||
};
|
||||
|
||||
symbol_iterator symbol_begin() const;
|
||||
|
|
|
@ -40,6 +40,9 @@ public:
|
|||
bool isInitialized() const { return Data != (unsigned) (~0U - 2); }
|
||||
operator unsigned() const { return getNumber(); }
|
||||
unsigned getNumber() const { assert (isInitialized()); return Data; }
|
||||
|
||||
bool operator==(const SymbolRef& X) const { return Data == X.Data; }
|
||||
bool operator!=(const SymbolRef& X) const { return Data != X.Data; }
|
||||
|
||||
void print(llvm::raw_ostream& os) const;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче