Edit

kc3-lang/angle/src/compiler/preprocessor/Preprocessor.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2014-02-20 13:31:36
    Hash : 5508f39d
    Message : Fix breaking the build with missing GetGlobalMaxTokenSize. Because the preprocessor is used independently from the compiler, we need a way to track max token size when we don't have access to the parse context with the current spec. BUG=angle:550 Change-Id: Idf5035ec2c001ee75f264151ab3c4e92f3cd44d7 Reviewed-on: https://chromium-review.googlesource.com/187140 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shannon Woods <shannonwoods@chromium.org> Reviewed-by: Nicolas Capens <nicolascapens@chromium.org> Tested-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/preprocessor/Preprocessor.cpp
  • //
    // Copyright (c) 2011 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.
    //
    
    #include "Preprocessor.h"
    
    #include <cassert>
    #include <sstream>
    
    #include "DiagnosticsBase.h"
    #include "DirectiveParser.h"
    #include "Macro.h"
    #include "MacroExpander.h"
    #include "Token.h"
    #include "Tokenizer.h"
    
    namespace pp
    {
    
    struct PreprocessorImpl
    {
        Diagnostics* diagnostics;
        MacroSet macroSet;
        Tokenizer tokenizer;
        DirectiveParser directiveParser;
        MacroExpander macroExpander;
    
        PreprocessorImpl(Diagnostics* diag,
                         DirectiveHandler* directiveHandler) :
            diagnostics(diag),
            tokenizer(diag),
            directiveParser(&tokenizer, &macroSet, diag, directiveHandler),
            macroExpander(&directiveParser, &macroSet, diag)
        {
        }
    };
    
    Preprocessor::Preprocessor(Diagnostics* diagnostics,
                               DirectiveHandler* directiveHandler)
    {
        mImpl = new PreprocessorImpl(diagnostics, directiveHandler);
    }
    
    Preprocessor::~Preprocessor()
    {
        delete mImpl;
    }
    
    bool Preprocessor::init(size_t count,
                            const char* const string[],
                            const int length[])
    {
        static const int kGLSLVersion = 100;
    
        // Add standard pre-defined macros.
        predefineMacro("__LINE__", 0);
        predefineMacro("__FILE__", 0);
        predefineMacro("__VERSION__", kGLSLVersion);
        predefineMacro("GL_ES", 1);
    
        return mImpl->tokenizer.init(count, string, length);
    }
    
    void Preprocessor::predefineMacro(const char* name, int value)
    {
        std::ostringstream stream;
        stream << value;
    
        Token token;
        token.type = Token::CONST_INT;
        token.text = stream.str();
    
        Macro macro;
        macro.predefined = true;
        macro.type = Macro::kTypeObj;
        macro.name = name;
        macro.replacements.push_back(token);
    
        mImpl->macroSet[name] = macro;
    }
    
    void Preprocessor::lex(Token* token)
    {
        bool validToken = false;
        while (!validToken)
        {
            mImpl->macroExpander.lex(token);
            switch (token->type)
            {
              // We should not be returning internal preprocessing tokens.
              // Convert preprocessing tokens to compiler tokens or report
              // diagnostics.
              case Token::PP_HASH:
                assert(false);
                break;
              case Token::PP_NUMBER:
                mImpl->diagnostics->report(Diagnostics::PP_INVALID_NUMBER,
                                           token->location, token->text);
                break;
              case Token::PP_OTHER:
                mImpl->diagnostics->report(Diagnostics::PP_INVALID_CHARACTER,
                                           token->location, token->text);
                break;
              default:
                validToken = true;
                break;
            }
        }
    }
    
    void Preprocessor::setMaxTokenSize(size_t maxTokenSize)
    {
        mImpl->tokenizer.setMaxTokenSize(maxTokenSize);
    }
    
    }  // namespace pp