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