Commit d5f1afb5 by Olli Etuaho Committed by Commit Bot

Make TSymbol immutable

There's still an exception for changing the names of structures, but otherwise the data stored in the TSymbol base class is never changed. BUG=angleproject:2267 TEST=angle_unittests Change-Id: I5b3f44cd365320ad09b46d2cfa3654a7d3f4bbc3 Reviewed-on: https://chromium-review.googlesource.com/806556Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 030017a4
......@@ -1021,10 +1021,10 @@ void IdentifyBuiltIns(sh::GLenum type,
NewPoolTString("gl_Position"), zeroSourceLoc);
glPerVertexFieldList->push_back(glPositionField);
const TString *glPerVertexString = NewPoolTString("gl_PerVertex");
TInterfaceBlock *glPerVertexInBlock = new TInterfaceBlock(
&symbolTable, glPerVertexString, glPerVertexFieldList, TLayoutQualifier::Create());
glPerVertexInBlock->relateToExtension(extension);
const TString *glPerVertexString = NewPoolTString("gl_PerVertex");
TInterfaceBlock *glPerVertexInBlock =
new TInterfaceBlock(&symbolTable, glPerVertexString, glPerVertexFieldList,
TLayoutQualifier::Create(), extension);
symbolTable.insertInterfaceBlock(ESSL3_1_BUILTINS, glPerVertexInBlock);
// The array size of gl_in is undefined until we get a valid input primitive
......
......@@ -29,13 +29,16 @@ static const char kFunctionMangledNameSeparator = '(';
} // anonymous namespace
TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *name)
: mName(name), mUniqueId(symbolTable->nextUniqueId()), mExtension(TExtension::UNDEFINED)
TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *name, TExtension extension)
: mName(name), mUniqueId(symbolTable->nextUniqueId()), mExtension(extension)
{
}
TVariable::TVariable(TSymbolTable *symbolTable, const TString *name, const TType &t)
: TSymbol(symbolTable, name), type(t), unionArray(nullptr)
TVariable::TVariable(TSymbolTable *symbolTable,
const TString *name,
const TType &t,
TExtension extension)
: TSymbol(symbolTable, name, extension), type(t), unionArray(nullptr)
{
}
......@@ -73,8 +76,9 @@ void TStructure::setName(const TString &name)
TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
const TString *name,
const TFieldList *fields,
const TLayoutQualifier &layoutQualifier)
: TSymbol(symbolTable, name),
const TLayoutQualifier &layoutQualifier,
TExtension extension)
: TSymbol(symbolTable, name, extension),
TFieldListCollection(fields),
mBlockStorage(layoutQualifier.blockStorage),
mBinding(layoutQualifier.binding)
......@@ -356,8 +360,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
const char *name,
const TType &type)
{
TVariable *var = new TVariable(this, NewPoolTString(name), type);
var->relateToExtension(ext);
TVariable *var = new TVariable(this, NewPoolTString(name), type, ext);
if (insert(level, var))
{
if (var->getType().getBasicType() == EbtStruct)
......
......@@ -48,7 +48,9 @@ class TSymbol : angle::NonCopyable
{
public:
POOL_ALLOCATOR_NEW_DELETE();
TSymbol(TSymbolTable *symbolTable, const TString *name);
TSymbol(TSymbolTable *symbolTable,
const TString *name,
TExtension extension = TExtension::UNDEFINED);
virtual ~TSymbol()
{
......@@ -61,15 +63,14 @@ class TSymbol : angle::NonCopyable
virtual bool isVariable() const { return false; }
virtual bool isStruct() const { return false; }
const TSymbolUniqueId &uniqueId() const { return mUniqueId; }
void relateToExtension(TExtension ext) { mExtension = ext; }
TExtension extension() const { return mExtension; }
protected:
const TString *mName;
const TString *const mName;
private:
const TSymbolUniqueId mUniqueId;
TExtension mExtension;
const TExtension mExtension;
};
// Variable.
......@@ -89,7 +90,10 @@ class TVariable : public TSymbol
private:
friend class TSymbolTable;
TVariable(TSymbolTable *symbolTable, const TString *name, const TType &t);
TVariable(TSymbolTable *symbolTable,
const TString *name,
const TType &t,
TExtension ext = TExtension::UNDEFINED);
TType type;
const TConstantUnion *unionArray;
......@@ -130,7 +134,8 @@ class TInterfaceBlock : public TSymbol, public TFieldListCollection
TInterfaceBlock(TSymbolTable *symbolTable,
const TString *name,
const TFieldList *fields,
const TLayoutQualifier &layoutQualifier);
const TLayoutQualifier &layoutQualifier,
TExtension extension = TExtension::UNDEFINED);
TLayoutBlockStorage blockStorage() const { return mBlockStorage; }
int blockBinding() const { return mBinding; }
......@@ -186,16 +191,15 @@ class TFunction : public TSymbol
TFunction(TSymbolTable *symbolTable,
const TString *name,
const TType *retType,
TOperator tOp = EOpNull,
TExtension ext = TExtension::UNDEFINED)
: TSymbol(symbolTable, name),
TOperator tOp = EOpNull,
TExtension extension = TExtension::UNDEFINED)
: TSymbol(symbolTable, name, extension),
returnType(retType),
mangledName(nullptr),
op(tOp),
defined(false),
mHasPrototypeDeclaration(false)
{
relateToExtension(ext);
}
~TFunction() override;
bool isFunction() const override { return true; }
......@@ -374,11 +378,10 @@ class TSymbolTable : angle::NonCopyable
TPrecision precision)
{
TVariable *constant =
new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1));
new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1), ext);
TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray);
constant->relateToExtension(ext);
return insert(level, constant);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment