Hash :
47c27e82
Author :
Date :
2017-01-17T15:29:35
Manage preprocessor Macro objects with shared pointers This ensures that pointers to Macros that are removed from the macro set stay valid. Pointers to undef'd macros may need to be referred to if reenabling the macros has been deferred. BUG=chromium:681324 TEST=angle_unittests Change-Id: Ibbbabbcbd6b0a84254cda717ae63712e6d404ebd Reviewed-on: https://chromium-review.googlesource.com/427948 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
//
// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#ifndef COMPILER_PREPROCESSOR_MACROEXPANDER_H_
#define COMPILER_PREPROCESSOR_MACROEXPANDER_H_
#include <memory>
#include <vector>
#include "compiler/preprocessor/Lexer.h"
#include "compiler/preprocessor/Macro.h"
namespace pp
{
class Diagnostics;
struct SourceLocation;
class MacroExpander : public Lexer
{
public:
MacroExpander(Lexer *lexer,
MacroSet *macroSet,
Diagnostics *diagnostics,
int allowedMacroExpansionDepth);
~MacroExpander() override;
void lex(Token *token) override;
private:
void getToken(Token *token);
void ungetToken(const Token &token);
bool isNextTokenLeftParen();
bool pushMacro(std::shared_ptr<Macro> macro, const Token &identifier);
void popMacro();
bool expandMacro(const Macro ¯o, const Token &identifier, std::vector<Token> *replacements);
typedef std::vector<Token> MacroArg;
bool collectMacroArgs(const Macro ¯o,
const Token &identifier,
std::vector<MacroArg> *args,
SourceLocation *closingParenthesisLocation);
void replaceMacroParams(const Macro ¯o,
const std::vector<MacroArg> &args,
std::vector<Token> *replacements);
struct MacroContext
{
MacroContext();
bool empty() const;
const Token &get();
void unget();
std::shared_ptr<Macro> macro;
std::size_t index;
std::vector<Token> replacements;
};
Lexer *mLexer;
MacroSet *mMacroSet;
Diagnostics *mDiagnostics;
std::unique_ptr<Token> mReserveToken;
std::vector<MacroContext *> mContextStack;
size_t mTotalTokensInContexts;
int mAllowedMacroExpansionDepth;
bool mDeferReenablingMacros;
std::vector<std::shared_ptr<Macro>> mMacrosToReenable;
class ScopedMacroReenabler;
};
} // namespace pp
#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_