1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 15cc863da574ed5079b055574127fe5788a9a0fc33Nicolas Capens#include "ParseHelper.h" 16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Use this class to carry along data from node to node in 19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// the traversal 20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass TConstTraverser : public TIntermTraverser { 22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanpublic: 23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TConstTraverser(ConstantUnion* cUnion, bool singleConstParam, TOperator constructType, TInfoSink& sink, TType& t) 24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens : error(false), 25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens index(0), 26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens unionArray(cUnion), 27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens type(t), 28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens constructorType(constructType), 29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens singleConstantParam(singleConstParam), 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink(sink), 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size(0), 32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens isMatrix(false), 33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens matrixSize(0) { 34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool error; 37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanprotected: 39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void visitSymbol(TIntermSymbol*); 40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void visitConstantUnion(TIntermConstantUnion*); 41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitBinary(Visit visit, TIntermBinary*); 42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitUnary(Visit visit, TIntermUnary*); 43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitSelection(Visit visit, TIntermSelection*); 44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitAggregate(Visit visit, TIntermAggregate*); 45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitLoop(Visit visit, TIntermLoop*); 46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool visitBranch(Visit visit, TIntermBranch*); 47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size_t index; 49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ConstantUnion *unionArray; 50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TType type; 51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TOperator constructorType; 52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool singleConstantParam; 53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TInfoSink& infoSink; 54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size_t size; // size of the constructor ( 4 for vec4) 55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool isMatrix; 56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int matrixSize; // dimension of the matrix (nominal size and not the instance size) 57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}; 58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The rest of the file are the traversal functions. The last one 61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// is the one that starts the traversal. 62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Return true from interior nodes to have the external traversal 64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// continue on to children. If you process children yourself, 65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// return false. 66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid TConstTraverser::visitSymbol(TIntermSymbol* node) 69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixInternalError, "Symbol Node found in constant constructor", node->getLine()); 71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitBinary(Visit visit, TIntermBinary* node) 75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TQualifier qualifier = node->getType().getQualifier(); 77c3bfb403361ae6dc1174cb6d379d2cc599663c76Nicolas Capens 78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (qualifier != EvqConstExpr) { 79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TString buf; 80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append("'constructor' : assigning non-constant to "); 81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append(type.getCompleteString()); 82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixError, buf.c_str(), node->getLine()); 83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine()); 88c3bfb403361ae6dc1174cb6d379d2cc599663c76Nicolas Capens 89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitUnary(Visit visit, TIntermUnary* node) 93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TString buf; 95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append("'constructor' : assigning non-constant to "); 96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append(type.getCompleteString()); 97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixError, buf.c_str(), node->getLine()); 98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate* node) 103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (!node->isConstructor() && node->getOp() != EOpComma) { 105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TString buf; 106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append("'constructor' : assigning non-constant to "); 107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens buf.append(type.getCompleteString()); 108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixError, buf.c_str(), node->getLine()); 109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (node->getSequence().size() == 0) { 114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion(); 119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (flag) 120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens singleConstantParam = true; 122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens constructorType = node->getOp(); 123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size = node->getType().getObjectSize(); 124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (node->getType().isMatrix()) { 126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens isMatrix = true; 127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens matrixSize = node->getType().getNominalSize(); 128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens for (TIntermSequence::iterator p = node->getSequence().begin(); 132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens p != node->getSequence().end(); p++) { 133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (node->getOp() == EOpComma) 135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens index = 0; 136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens (*p)->traverse(this); 138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (flag) 140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens singleConstantParam = false; 142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens constructorType = EOpNull; 143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size = 0; 144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens isMatrix = false; 145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens matrixSize = 0; 146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitSelection(Visit visit, TIntermSelection* node) 151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixInternalError, "Selection Node found in constant constructor", node->getLine()); 153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid TConstTraverser::visitConstantUnion(TIntermConstantUnion* node) 158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (!node->getUnionArrayPointer()) 160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // The constant was not initialized, this should already have been logged 162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens assert(infoSink.info.size() != 0); 163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ConstantUnion* leftUnionArray = unionArray; 167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size_t instanceSize = type.getObjectSize(); 168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TBasicType basicType = type.getBasicType(); 169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (index >= instanceSize) 171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (!singleConstantParam) { 174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size_t size = node->getType().getObjectSize(); 175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ConstantUnion *rightUnionArray = node->getUnionArrayPointer(); 177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens for(size_t i = 0; i < size; i++) { 178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (index >= instanceSize) 179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens leftUnionArray[index].cast(basicType, rightUnionArray[i]); 181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens (index)++; 183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } else { 185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens size_t totalSize = index + size; 186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ConstantUnion *rightUnionArray = node->getUnionArrayPointer(); 187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (!isMatrix) { 188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int count = 0; 189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens for(size_t i = index; i < totalSize; i++) { 190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (i >= instanceSize) 191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens leftUnionArray[i].cast(basicType, rightUnionArray[count]); 194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens (index)++; 196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (node->getType().getObjectSize() > 1) 198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens count++; 199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } else { // for matrix constructors 201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int count = 0; 202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens int element = index; 203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens for(size_t i = index; i < totalSize; i++) { 204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (i >= instanceSize) 205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return; 206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (element - i == 0 || (i - element) % (matrixSize + 1) == 0 ) 207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens leftUnionArray[i].cast(basicType, rightUnionArray[0]); 208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens else 209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens leftUnionArray[i].setFConst(0.0f); 210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens (index)++; 212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (node->getType().getObjectSize() > 1) 214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens count++; 215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitLoop(Visit visit, TIntermLoop* node) 221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixInternalError, "Loop Node found in constant constructor", node->getLine()); 223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitBranch(Visit visit, TIntermBranch* node) 228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens infoSink.info.message(EPrefixInternalError, "Branch Node found in constant constructor", node->getLine()); 230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens error = true; 231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This function is the one to call externally to start the traversal. 236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Individual functions can be initialized to 0 to skip processing of that 237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// type of node. It's children will still be processed. 238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 239253fdd10c2c3b428302755db0df4ca6fbb60024fAlexis Hetubool TIntermediate::parseConstTree(const TSourceLoc& line, TIntermNode* root, ConstantUnion* unionArray, TOperator constructorType, TType t, bool singleConstantParam) 240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (root == 0) 242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens TConstTraverser it(unionArray, singleConstantParam, constructorType, infoSink, t); 245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens root->traverse(&it); 247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if (it.error) 248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return true; 249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens else 250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return false; 251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 252