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