Hash :
ea39a223
Author :
Date :
2017-07-06T12:47:59
Simplify queueReplacement AST transform helper queueReplacement is always called to replace the node that's currently being visited in the traverser. The currently visited node can be fetched automatically from the traversal path so it can be removed from parameters of queueReplacement. BUG=angleproject:2100 TEST=angle_unittests Change-Id: I62ab6d1cd9c0d2b4c260af9f7c85bc156fb3f349 Reviewed-on: https://chromium-review.googlesource.com/562336 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@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
//
// 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 sh
{
namespace
{
// "x || y" is equivalent to "x ? true : y".
TIntermTernary *UnfoldOR(TIntermTyped *x, TIntermTyped *y)
{
TConstantUnion *u = new TConstantUnion;
u->setBConst(true);
TIntermConstantUnion *trueNode =
new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1));
return new TIntermTernary(x, trueNode, y);
}
// "x && y" is equivalent to "x ? y : false".
TIntermTernary *UnfoldAND(TIntermTyped *x, TIntermTyped *y)
{
TConstantUnion *u = new TConstantUnion;
u->setBConst(false);
TIntermConstantUnion *falseNode =
new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1));
return new TIntermTernary(x, y, falseNode);
}
} // namespace anonymous
bool UnfoldShortCircuitAST::visitBinary(Visit visit, TIntermBinary *node)
{
TIntermTernary *replacement = nullptr;
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)
{
queueReplacement(replacement, OriginalNode::IS_DROPPED);
}
return true;
}
} // namespace sh