Home | History | Annotate | Download | only in compiler
      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:
     23     UnfoldShortCircuitAST() { }
     24 
     25     virtual bool visitBinary(Visit visit, TIntermBinary *);
     26 
     27     void updateTree();
     28 
     29   private:
     30     struct NodeUpdateEntry
     31     {
     32         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