Edit

kc3-lang/angle/src/compiler/translator/UnfoldShortCircuitAST.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2015-05-04 14:21:21
    Hash : 6ba6eadc
    Message : Rename ConstantUnion to TConstantUnion. This clarified that we're using the Pool allocator/deallocator for this type. BUG=angleproject:993 Change-Id: If8c95f6054d07291e7014be0d4e35766ba2e943b Reviewed-on: https://chromium-review.googlesource.com/269131 Tested-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Reviewed-by: Zhenyao Mo <zmo@chromium.org>

  • src/compiler/translator/UnfoldShortCircuitAST.cpp
  • //
    // Copyright (c) 2002-2013 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 "compiler/translator/UnfoldShortCircuitAST.h"
    
    namespace
    {
    
    // "x || y" is equivalent to "x ? true : y".
    TIntermSelection *UnfoldOR(TIntermTyped *x, TIntermTyped *y)
    {
        const TType boolType(EbtBool, EbpUndefined);
        TConstantUnion *u = new TConstantUnion;
        u->setBConst(true);
        TIntermConstantUnion *trueNode = new TIntermConstantUnion(
            u, TType(EbtBool, EbpUndefined, EvqConst, 1));
        return new TIntermSelection(x, trueNode, y, boolType);
    }
    
    // "x && y" is equivalent to "x ? y : false".
    TIntermSelection *UnfoldAND(TIntermTyped *x, TIntermTyped *y)
    {
        const TType boolType(EbtBool, EbpUndefined);
        TConstantUnion *u = new TConstantUnion;
        u->setBConst(false);
        TIntermConstantUnion *falseNode = new TIntermConstantUnion(
            u, TType(EbtBool, EbpUndefined, EvqConst, 1));
        return new TIntermSelection(x, y, falseNode, boolType);
    }
    
    }  // namespace anonymous
    
    bool UnfoldShortCircuitAST::visitBinary(Visit visit, TIntermBinary *node)
    {
        TIntermSelection *replacement = NULL;
    
        switch (node->getOp())
        {
          case EOpLogicalOr:
            replacement = UnfoldOR(node->getLeft(), node->getRight());
            break;
          case EOpLogicalAnd:
            replacement = UnfoldAND(node->getLeft(), node->getRight());
            break;
          default:
            break;
        }
        if (replacement)
        {
            mReplacements.push_back(
                NodeUpdateEntry(getParentNode(), node, replacement, false));
        }
        return true;
    }