Edit

kc3-lang/angle/src/compiler/translator/util.h

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2015-10-13 12:21:01
    Hash : f541f529
    Message : Fix parsing integers larger than 0x7FFFFFFF Parsing should accept all values between 0 and 0xFFFFFFFF as specified in ESSL 3.00 section 4.1.3. When a signed literal is parsed, it's interpreted as if it specifies the bit pattern of a two's complement integer. For example, parsing "0xFFFFFFFF" results in -1. Decimal literals behave the same way, so for example parsing "3000000000" results in -1294967296. This change affects parsing of literals in ESSL 1.00 as well. In ESSL 3.00, an out-of-range integer literal now generates a compiler error. Unit tests are added based on examples in the ESSL 3.00 spec and one example in GLSL 4.5 spec that ESSL should match. BUG=541550 TEST=angle_unittests Change-Id: I82f8ef5cfa2881019a3f80d77ff99707d61c000d Reviewed-on: https://chromium-review.googlesource.com/305420 Reviewed-by: Zhenyao Mo <zmo@chromium.org> Tested-by: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Corentin Wallez <cwallez@google.com>

  • src/compiler/translator/util.h
  • //
    // Copyright (c) 2002-2010 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_TRANSLATOR_UTIL_H_
    #define COMPILER_TRANSLATOR_UTIL_H_
    
    #include <stack>
    
    #include "angle_gl.h"
    #include <GLSLANG/ShaderLang.h>
    
    #include "compiler/translator/Types.h"
    
    // strtof_clamp is like strtof but
    //   1. it forces C locale, i.e. forcing '.' as decimal point.
    //   2. it clamps the value to -FLT_MAX or FLT_MAX if overflow happens.
    // Return false if overflow happens.
    bool strtof_clamp(const std::string &str, float *value);
    
    // If overflow happens, clamp the value to UINT_MIN or UINT_MAX.
    // Return false if overflow happens.
    bool atoi_clamp(const char *str, unsigned int *value);
    
    class TSymbolTable;
    
    namespace sh
    {
    
    GLenum GLVariableType(const TType &type);
    GLenum GLVariablePrecision(const TType &type);
    bool IsVaryingIn(TQualifier qualifier);
    bool IsVaryingOut(TQualifier qualifier);
    bool IsVarying(TQualifier qualifier);
    InterpolationType GetInterpolationType(TQualifier qualifier);
    TString ArrayString(const TType &type);
    
    class GetVariableTraverser : angle::NonCopyable
    {
      public:
        GetVariableTraverser(const TSymbolTable &symbolTable);
        virtual ~GetVariableTraverser() {}
    
        template <typename VarT>
        void traverse(const TType &type, const TString &name, std::vector<VarT> *output);
    
      protected:
        // May be overloaded
        virtual void visitVariable(ShaderVariable *newVar) {}
    
      private:
        // Helper function called by traverse() to fill specific fields
        // for attributes/varyings/uniforms.
        template <typename VarT>
        void setTypeSpecificInfo(
            const TType &type, const TString &name, VarT *variable) {}
    
        const TSymbolTable &mSymbolTable;
    };
    
    }
    
    #endif // COMPILER_TRANSLATOR_UTIL_H_