Make the ActionResult optimization work for non-void*'s and switch DeclPtrTy to use it.

llvm-svn: 67983
This commit is contained in:
Chris Lattner 2009-03-29 05:08:48 +00:00
parent cd8bb18624
commit 57ce399326
2 changed files with 11 additions and 4 deletions

View File

@ -47,7 +47,7 @@ namespace clang {
template<> struct IsResultPtrLowBitFree<1> { static const bool value = true;};
template<> struct IsResultPtrLowBitFree<3> { static const bool value = true;};
template<> struct IsResultPtrLowBitFree<4> { static const bool value = true;};
//template<> struct IsResultPtrLowBitFree<5> { static const bool value = true;};
template<> struct IsResultPtrLowBitFree<5> { static const bool value = true;};
/// Action - As the parser reads the input file and recognizes the productions
/// of the grammar, it invokes methods on this class to turn the parsed input

View File

@ -230,7 +230,13 @@ namespace clang
PtrWithInvalid = reinterpret_cast<uintptr_t>(VP);
assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer");
}
ActionResult(PtrTy V) {
void *VP = PtrTraits::getAsVoidPointer(V);
PtrWithInvalid = reinterpret_cast<uintptr_t>(VP);
assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer");
}
ActionResult(const DiagnosticBuilder &) : PtrWithInvalid(0x01) { }
PtrTy get() const {
@ -246,8 +252,9 @@ namespace clang
bool isInvalid() const { return PtrWithInvalid & 0x01; }
const ActionResult &operator=(void *RHS) {
PtrWithInvalid = reinterpret_cast<uintptr_t>(RHS);
const ActionResult &operator=(PtrTy RHS) {
void *VP = PtrTraits::getAsVoidPointer(RHS);
PtrWithInvalid = reinterpret_cast<uintptr_t>(VP);
assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer");
return *this;
}