diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-10-04 19:17:46 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-10-04 19:17:46 +0000 |
commit | 4095080aff204008eefb26b100906c6ca2bc4bb6 (patch) | |
tree | ee611a1df4d36fb3c15a43093b03788dd9e14ff6 /lib/Lex/Pragma.cpp | |
parent | 5e52b1763f2c13b197d5c1ee178077f58b206f37 (diff) |
Add Preprocessor::RemovePragmaHandler.
- No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57065 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/Pragma.cpp')
-rw-r--r-- | lib/Lex/Pragma.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index b6f5ac4936..6d8e047056 100644 --- a/lib/Lex/Pragma.cpp +++ b/lib/Lex/Pragma.cpp @@ -51,6 +51,17 @@ PragmaHandler *PragmaNamespace::FindHandler(const IdentifierInfo *Name, return IgnoreNull ? 0 : NullHandler; } +void PragmaNamespace::RemovePragmaHandler(PragmaHandler *Handler) { + for (unsigned i = 0, e = Handlers.size(); i != e; ++i) { + if (Handlers[i] == Handler) { + Handlers[i] = Handlers.back(); + Handlers.pop_back(); + return; + } + } + assert(0 && "Handler not registered in this namespace"); +} + void PragmaNamespace::HandlePragma(Preprocessor &PP, Token &Tok) { // Read the 'namespace' that the directive is in, e.g. STDC. Do not macro // expand it, the user can have a STDC #define, that should not affect this. @@ -325,6 +336,32 @@ void Preprocessor::AddPragmaHandler(const char *Namespace, InsertNS->AddPragma(Handler); } +/// RemovePragmaHandler - Remove the specific pragma handler from the +/// preprocessor. If \arg Namespace is non-null, then it should be the +/// namespace that \arg Handler was added to. It is an error to remove +/// a handler that has not been registered. +void Preprocessor::RemovePragmaHandler(const char *Namespace, + PragmaHandler *Handler) { + PragmaNamespace *NS = PragmaHandlers; + + // If this is specified to be in a namespace, step down into it. + if (Namespace) { + IdentifierInfo *NSID = getIdentifierInfo(Namespace); + PragmaHandler *Existing = PragmaHandlers->FindHandler(NSID); + assert(Existing && "Namespace containing handler does not exist!"); + + NS = Existing->getIfNamespace(); + assert(NS && "Invalid namespace, registered as a regular pragma handler!"); + } + + NS->RemovePragmaHandler(Handler); + + // If this is a non-default namespace and it is now empty, remove + // it. + if (NS != PragmaHandlers && NS->IsEmpty()) + PragmaHandlers->RemovePragmaHandler(NS); +} + namespace { /// PragmaOnceHandler - "#pragma once" marks the file as atomically included. struct PragmaOnceHandler : public PragmaHandler { |