• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // UnfoldShortCircuitAST is an AST traverser to replace short-circuiting
7 // operations with ternary operations.
8 //
9 
10 #ifndef COMPILER_UNFOLD_SHORT_CIRCUIT_AST_H_
11 #define COMPILER_UNFOLD_SHORT_CIRCUIT_AST_H_
12 
13 #include "common/angleutils.h"
14 #include "compiler/intermediate.h"
15 
16 // This traverser identifies all the short circuit binary  nodes that need to
17 // be replaced, and creates the corresponding replacement nodes. However,
18 // the actual replacements happen after the traverse through updateTree().
19 
20 class UnfoldShortCircuitAST : public TIntermTraverser
21 {
22   public:
UnfoldShortCircuitAST()23     UnfoldShortCircuitAST() { }
24 
25     virtual bool visitBinary(Visit visit, TIntermBinary *);
26 
27     void updateTree();
28 
29   private:
30     struct NodeUpdateEntry
31     {
NodeUpdateEntryNodeUpdateEntry32         NodeUpdateEntry(TIntermNode *_parent,
33                         TIntermNode *_original,
34                         TIntermNode *_replacement)
35             : parent(_parent),
36               original(_original),
37               replacement(_replacement) {}
38 
39         TIntermNode *parent;
40         TIntermNode *original;
41         TIntermNode *replacement;
42     };
43 
44     // During traversing, save all the replacements that need to happen;
45     // then replace them by calling updateNodes().
46     std::vector<NodeUpdateEntry> replacements;
47 
48     DISALLOW_COPY_AND_ASSIGN(UnfoldShortCircuitAST);
49 };
50 
51 #endif  // COMPILER_UNFOLD_SHORT_CIRCUIT_AST_H_
52