14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 7b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h" 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse the intermediate representation tree, and 114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// call a node type specific function for each node. 124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Done recursively through the member function Traverse(). 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Node types can be skipped if their function to call is 0, 144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// but their subtree will still be traversed. 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Nodes with children can have their whole subtree skipped 164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// if preVisit is turned on and the type specific function 174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// returns false. 184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// preVisit, postVisit, and rightToLeft control what order 204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// nodes are visited in. 214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traversal functions for terminals are straighforward.... 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 26e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermSymbol::traverse(TIntermTraverser *it) 274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 28e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitSymbol(this); 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 31e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermConstantUnion::traverse(TIntermTraverser *it) 324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 33e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitConstantUnion(this); 344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse a binary node. 384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 39e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermBinary::traverse(TIntermTraverser *it) 404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 41e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 42e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 43e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 44e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // visit the node before children if pre-visiting. 45e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 46e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 47e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitBinary(PreVisit, this); 48e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 49e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 50e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // Visit the children, in the right order. 51e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 52e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit) 53e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 547cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 55e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 56e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->rightToLeft) 57e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 58e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mRight) 59e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mRight->traverse(it); 60e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 61e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->inVisit) 62e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitBinary(InVisit, this); 63e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 64e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (visit && mLeft) 65e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mLeft->traverse(it); 66e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 67e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo else 68e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 69e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mLeft) 70e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mLeft->traverse(it); 71e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 72e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->inVisit) 73e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitBinary(InVisit, this); 74e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 75e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (visit && mRight) 76e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mRight->traverse(it); 77e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 78e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 79e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 80e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 81e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 82e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 83e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // Visit the node after the children, if requested and the traversal 84e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // hasn't been cancelled yet. 85e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo // 86e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 87e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitBinary(PostVisit, this); 884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse a unary node. Same comments in binary node apply here. 924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 93e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermUnary::traverse(TIntermTraverser *it) 944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 95e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 96e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 97e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 98e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitUnary(PreVisit, this); 99e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 100e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit) { 1017cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 102e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mOperand->traverse(it); 103e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 104e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 105e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 106e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 107e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitUnary(PostVisit, this); 1084f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse an aggregate node. Same comments in binary node apply here. 1124f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 113e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermAggregate::traverse(TIntermTraverser *it) 1144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 115e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 116e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 117e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 118e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitAggregate(PreVisit, this); 119e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 120e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit) 121e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 1227cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 123e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 124e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->rightToLeft) 125e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 126e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo for (TIntermSequence::reverse_iterator sit = mSequence.rbegin(); 127e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo sit != mSequence.rend(); sit++) 128e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 129e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo (*sit)->traverse(it); 130e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 131e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->inVisit) 132e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 133e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (*sit != mSequence.front()) 134e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitAggregate(InVisit, this); 135e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 136e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 137e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 138e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo else 139e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 140e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo for (TIntermSequence::iterator sit = mSequence.begin(); 141e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo sit != mSequence.end(); sit++) 142e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 143e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo (*sit)->traverse(it); 144e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 145e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->inVisit) 146e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 147e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (*sit != mSequence.back()) 148e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitAggregate(InVisit, this); 149e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 150e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 151e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 152e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 153e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 154e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 155e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 156e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 157e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitAggregate(PostVisit, this); 1584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1614f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse a selection node. Same comments in binary node apply here. 1624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 163e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermSelection::traverse(TIntermTraverser *it) 1644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 165e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 166e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 167e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 168e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitSelection(PreVisit, this); 169e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 170e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (visit) 171e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo { 1727cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 173e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (it->rightToLeft) 174e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo { 175e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mFalseBlock) 176e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mFalseBlock->traverse(it); 177e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mTrueBlock) 178e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mTrueBlock->traverse(it); 179e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mCondition->traverse(it); 180e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo } 181e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo else 182e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo { 183e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mCondition->traverse(it); 184e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mTrueBlock) 185e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mTrueBlock->traverse(it); 186e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mFalseBlock) 187e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mFalseBlock->traverse(it); 188e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 189e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 190e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 191e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 192e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 193e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitSelection(PostVisit, this); 1944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 1974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse a loop node. Same comments in binary node apply here. 1984f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 199e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermLoop::traverse(TIntermTraverser *it) 2004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 201e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 202e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 203e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 204e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitLoop(PreVisit, this); 205e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 206e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit) 207e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 2087cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 209e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 210e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->rightToLeft) 211e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 212e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mExpr) 213e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mExpr->traverse(it); 214e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 215e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mBody) 216e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mBody->traverse(it); 217e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 218e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mCond) 219e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mCond->traverse(it); 2206cb95f3a235c20dbe4bb9f5de75401a16014c012Zhenyao Mo 221e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mInit) 222e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mInit->traverse(it); 223e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 224e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo else 225e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo { 226e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mInit) 227e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mInit->traverse(it); 2286cb95f3a235c20dbe4bb9f5de75401a16014c012Zhenyao Mo 229e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mCond) 230e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mCond->traverse(it); 231e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 232e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mBody) 233e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mBody->traverse(it); 234e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 235e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (mExpr) 236e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mExpr->traverse(it); 237e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 238e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 239e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 240e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 241e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 242e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 243e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitLoop(PostVisit, this); 2444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Traverse a branch node. Same comments in binary node apply here. 2484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 249e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Movoid TIntermBranch::traverse(TIntermTraverser *it) 2504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 251e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo bool visit = true; 252e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 253e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (it->preVisit) 254e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo visit = it->visitBranch(PreVisit, this); 255e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 256e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo if (visit && mExpression) { 2577cab38b594213c7c80f70871b72d40d30e878035Zhenyao Mo it->incrementDepth(this); 258e40d1e9c70f1d1d5d0d92f24f8868fcf0b610639Zhenyao Mo mExpression->traverse(it); 259e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->decrementDepth(); 260e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo } 261e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo 262e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo if (visit && it->postVisit) 263e88dcaf333a8a583e023b1db372668af2ce8b273Zhenyao Mo it->visitBranch(PostVisit, this); 2644f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2654f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2664cfb1e890ac39201145316ad8f3196d456283389Jamie Madillvoid TIntermRaw::traverse(TIntermTraverser *it) 2674cfb1e890ac39201145316ad8f3196d456283389Jamie Madill{ 2684cfb1e890ac39201145316ad8f3196d456283389Jamie Madill it->visitRaw(this); 2694cfb1e890ac39201145316ad8f3196d456283389Jamie Madill} 270