10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Symbol table for parsing. Most functionaliy and main ideas 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// are documented in the header file. 18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 2066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#if defined(_MSC_VER) 2166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#pragma warning(disable: 4718) 2266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif 2366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 24cc863da574ed5079b055574127fe5788a9a0fc33Nicolas Capens#include "SymbolTable.h" 25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <stdio.h> 2794352d96bba1a83c89f68080888f43388da40d71Nicolas Capens#include <limits.h> 2866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#include <algorithm> 29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 30b7cab413182828b50de734ca9193a20bafe6b376Nicolas Capens#if defined(_MSC_VER) && MSC_VER < 1900 31b7cab413182828b50de734ca9193a20bafe6b376Nicolas Capens#define snprintf _snprintf 3266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman#endif 3366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 34d4ae863d01d5f448dbbba6be4ecc161971a2324fJohn Baumanint TSymbolTableLevel::uniqueId = 0; 35d4ae863d01d5f448dbbba6be4ecc161971a2324fJohn Bauman 3666b8ab22586debccb1f787d4d52b7f042d4ddeb8John BaumanTType::TType(const TPublicType &p) : 3729cb003a582fbdbd0e3e1e62722142ceb356494bAlexis Hetu type(p.type), precision(p.precision), qualifier(p.qualifier), invariant(p.invariant), layoutQualifier(p.layoutQualifier), 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens primarySize(p.primarySize), secondarySize(p.secondarySize), array(p.array), arraySize(p.arraySize), maxArraySize(0), 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens arrayInformationType(0), interfaceBlock(0), structure(0), deepestStructNesting(0), mangled(0) 4066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{ 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if (p.userDef) 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens structure = p.userDef->getStruct(); 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens computeDeepestStructNesting(); 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 4666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Recursively generate mangled names. 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid TType::buildMangledName(TString& mangledName) 52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if (isMatrix()) 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += 'm'; 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens else if (isVector()) 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += 'v'; 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens switch (type) { 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EbtFloat: mangledName += 'f'; break; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EbtInt: mangledName += 'i'; break; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EbtUInt: mangledName += 'u'; break; 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EbtBool: mangledName += 'b'; break; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens case EbtSampler2D: mangledName += "s2"; break; 64b027aa91f4b20c5062fbc781d0ff693bf294cbccAlexis Hetu case EbtSampler3D: mangledName += "s3"; break; 65a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSamplerCube: mangledName += "sC"; break; 66a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSampler2DArray: mangledName += "s2a"; break; 67a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSamplerExternalOES: mangledName += "sext"; break; 68a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtISampler2D: mangledName += "is2"; break; 69a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtISampler3D: mangledName += "is3"; break; 70a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtISamplerCube: mangledName += "isC"; break; 71a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtISampler2DArray: mangledName += "is2a"; break; 72a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtUSampler2D: mangledName += "us2"; break; 73a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtUSampler3D: mangledName += "us3"; break; 74a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtUSamplerCube: mangledName += "usC"; break; 75a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtUSampler2DArray: mangledName += "us2a"; break; 76a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSampler2DShadow: mangledName += "s2s"; break; 77a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSamplerCubeShadow: mangledName += "sCs"; break; 78a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtSampler2DArrayShadow: mangledName += "s2as"; break; 79a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtStruct: mangledName += structure->mangledName(); break; 80a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu case EbtInterfaceBlock: mangledName += interfaceBlock->mangledName(); break; 810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens default: 820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens break; 830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += static_cast<char>('0' + getNominalSize()); 860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(isMatrix()) { 870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += static_cast<char>('0' + getSecondarySize()); 880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if (isArray()) { 900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens char buf[20]; 910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens snprintf(buf, sizeof(buf), "%d", arraySize); 920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += '['; 930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += buf; 940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens mangledName += ']'; 950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 98ab752790e2502e966713359f97b76571253f7aafAlexis Hetusize_t TType::getStructSize() const 99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if (!getStruct()) { 1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens assert(false && "Not a struct"); 1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 0; 1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return getStruct()->objectSize(); 106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 10866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanvoid TType::computeDeepestStructNesting() 10966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{ 110a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu deepestStructNesting = structure ? structure->deepestNesting() : 0; 111a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu} 11266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 113a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetubool TStructure::containsArrays() const 114a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu{ 115a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 116a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu { 117a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu const TType *fieldType = (*mFields)[i]->type(); 118a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu if(fieldType->isArray() || fieldType->isStructureContainingArrays()) 119a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return true; 120a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu } 121a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return false; 122a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu} 12366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 124ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetubool TStructure::containsType(TBasicType type) const 125ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu{ 126ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 127ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu { 128ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu const TType *fieldType = (*mFields)[i]->type(); 129ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu if(fieldType->getBasicType() == type || fieldType->isStructureContainingType(type)) 130ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu return true; 131ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu } 132ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu return false; 133ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu} 134ec93b1d0e110fe5a4128939c2034738155ba4b33Alexis Hetu 135a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetubool TStructure::containsSamplers() const 136a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu{ 137a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 138a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu { 139a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu const TType *fieldType = (*mFields)[i]->type(); 140a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu if(IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers()) 141a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return true; 142a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu } 143a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return false; 14466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 14566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 146a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis HetuTString TFieldListCollection::buildMangledName() const 14766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman{ 148a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu TString mangledName(mangledNamePrefix()); 149a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu mangledName += *mName; 150a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 151a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu { 152a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu mangledName += '-'; 153a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu mangledName += (*mFields)[i]->type()->getMangledName(); 154a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu } 155a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return mangledName; 156a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu} 15766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 158a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetusize_t TFieldListCollection::calculateObjectSize() const 159a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu{ 160a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu size_t size = 0; 161a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 162a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu { 163a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu size_t fieldSize = (*mFields)[i]->type()->getObjectSize(); 164a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu if(fieldSize > INT_MAX - size) 165a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu size = INT_MAX; 166a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu else 167a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu size += fieldSize; 168a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu } 169a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return size; 170a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu} 17166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 172a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetuint TStructure::calculateDeepestNesting() const 173a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu{ 174a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu int maxNesting = 0; 175a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu for(size_t i = 0; i < mFields->size(); ++i) 176a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu maxNesting = std::max(maxNesting, (*mFields)[i]->type()->getDeepestStructNesting()); 177a8b364b735624da31500d0fe93ae75f8b36a59d1Alexis Hetu return 1 + maxNesting; 17866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 17966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Functions have buried pointers to delete. 182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanTFunction::~TFunction() 184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i) 1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete (*i).type; 187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Symbol table levels are a map of pointers to symbols that have to be deleted. 191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanTSymbolTableLevel::~TSymbolTableLevel() 193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for (tLevel::iterator it = level.begin(); it != level.end(); ++it) 1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens delete (*it).second; 196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 198e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas CapensTSymbol *TSymbolTable::find(const TString &name, int shaderVersion, bool *builtIn, bool *sameScope) const 199e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens{ 2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens int level = currentLevel(); 2010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TSymbol *symbol = nullptr; 2020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens do 2040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while((level == ESSL3_BUILTINS && shaderVersion != 300) || 2060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (level == ESSL1_BUILTINS && shaderVersion != 100)) // Skip version specific levels 2070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens --level; 2090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens symbol = table[level]->find(name); 2120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while(!symbol && --level >= 0); // Doesn't decrement level when a symbol was found 2140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(builtIn) 2160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *builtIn = (level <= LAST_BUILTIN_LEVEL); 2180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(sameScope) 2210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens *sameScope = (level == currentLevel()); 2230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return symbol; 226e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens} 227e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens 228e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas CapensTSymbol *TSymbolTable::findBuiltIn(const TString &name, int shaderVersion) const 229e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens{ 2300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens for(int level = LAST_BUILTIN_LEVEL; level >= 0; --level) 2310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens while((level == ESSL3_BUILTINS && shaderVersion != 300) || 2330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens (level == ESSL1_BUILTINS && shaderVersion != 100)) // Skip version specific levels 2340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens --level; 2360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TSymbol *symbol = table[level]->find(name); 2390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens if(symbol) 2410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 2420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return symbol; 2430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens } 2450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 2460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens return 0; 247e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens} 248e2858656575d8bc1f88ad3c885ab3cedf29a482eNicolas Capens 249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanTSymbol::TSymbol(const TSymbol& copyOf) 250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{ 2510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens name = NewPoolTString(copyOf.name->c_str()); 252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 253