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, ...@@ -1021,10 +1021,10 @@ void IdentifyBuiltIns(sh::GLenum type,
NewPoolTString("gl_Position"), zeroSourceLoc); NewPoolTString("gl_Position"), zeroSourceLoc);
glPerVertexFieldList->push_back(glPositionField); glPerVertexFieldList->push_back(glPositionField);
const TString *glPerVertexString = NewPoolTString("gl_PerVertex"); const TString *glPerVertexString = NewPoolTString("gl_PerVertex");
TInterfaceBlock *glPerVertexInBlock = new TInterfaceBlock( TInterfaceBlock *glPerVertexInBlock =
&symbolTable, glPerVertexString, glPerVertexFieldList, TLayoutQualifier::Create()); new TInterfaceBlock(&symbolTable, glPerVertexString, glPerVertexFieldList,
glPerVertexInBlock->relateToExtension(extension); TLayoutQualifier::Create(), extension);
symbolTable.insertInterfaceBlock(ESSL3_1_BUILTINS, glPerVertexInBlock); symbolTable.insertInterfaceBlock(ESSL3_1_BUILTINS, glPerVertexInBlock);
// The array size of gl_in is undefined until we get a valid input primitive // The array size of gl_in is undefined until we get a valid input primitive
......
...@@ -29,13 +29,16 @@ static const char kFunctionMangledNameSeparator = '('; ...@@ -29,13 +29,16 @@ static const char kFunctionMangledNameSeparator = '(';
} // anonymous namespace } // anonymous namespace
TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *name) TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *name, TExtension extension)
: mName(name), mUniqueId(symbolTable->nextUniqueId()), mExtension(TExtension::UNDEFINED) : mName(name), mUniqueId(symbolTable->nextUniqueId()), mExtension(extension)
{ {
} }
TVariable::TVariable(TSymbolTable *symbolTable, const TString *name, const TType &t) TVariable::TVariable(TSymbolTable *symbolTable,
: TSymbol(symbolTable, name), type(t), unionArray(nullptr) 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) ...@@ -73,8 +76,9 @@ void TStructure::setName(const TString &name)
TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable, TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
const TString *name, const TString *name,
const TFieldList *fields, const TFieldList *fields,
const TLayoutQualifier &layoutQualifier) const TLayoutQualifier &layoutQualifier,
: TSymbol(symbolTable, name), TExtension extension)
: TSymbol(symbolTable, name, extension),
TFieldListCollection(fields), TFieldListCollection(fields),
mBlockStorage(layoutQualifier.blockStorage), mBlockStorage(layoutQualifier.blockStorage),
mBinding(layoutQualifier.binding) mBinding(layoutQualifier.binding)
...@@ -356,8 +360,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level, ...@@ -356,8 +360,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
const char *name, const char *name,
const TType &type) const TType &type)
{ {
TVariable *var = new TVariable(this, NewPoolTString(name), type); TVariable *var = new TVariable(this, NewPoolTString(name), type, ext);
var->relateToExtension(ext);
if (insert(level, var)) if (insert(level, var))
{ {
if (var->getType().getBasicType() == EbtStruct) if (var->getType().getBasicType() == EbtStruct)
......
...@@ -48,7 +48,9 @@ class TSymbol : angle::NonCopyable ...@@ -48,7 +48,9 @@ class TSymbol : angle::NonCopyable
{ {
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TSymbol(TSymbolTable *symbolTable, const TString *name); TSymbol(TSymbolTable *symbolTable,
const TString *name,
TExtension extension = TExtension::UNDEFINED);
virtual ~TSymbol() virtual ~TSymbol()
{ {
...@@ -61,15 +63,14 @@ class TSymbol : angle::NonCopyable ...@@ -61,15 +63,14 @@ class TSymbol : angle::NonCopyable
virtual bool isVariable() const { return false; } virtual bool isVariable() const { return false; }
virtual bool isStruct() const { return false; } virtual bool isStruct() const { return false; }
const TSymbolUniqueId &uniqueId() const { return mUniqueId; } const TSymbolUniqueId &uniqueId() const { return mUniqueId; }
void relateToExtension(TExtension ext) { mExtension = ext; }
TExtension extension() const { return mExtension; } TExtension extension() const { return mExtension; }
protected: protected:
const TString *mName; const TString *const mName;
private: private:
const TSymbolUniqueId mUniqueId; const TSymbolUniqueId mUniqueId;
TExtension mExtension; const TExtension mExtension;
}; };
// Variable. // Variable.
...@@ -89,7 +90,10 @@ class TVariable : public TSymbol ...@@ -89,7 +90,10 @@ class TVariable : public TSymbol
private: private:
friend class TSymbolTable; 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; TType type;
const TConstantUnion *unionArray; const TConstantUnion *unionArray;
...@@ -130,7 +134,8 @@ class TInterfaceBlock : public TSymbol, public TFieldListCollection ...@@ -130,7 +134,8 @@ class TInterfaceBlock : public TSymbol, public TFieldListCollection
TInterfaceBlock(TSymbolTable *symbolTable, TInterfaceBlock(TSymbolTable *symbolTable,
const TString *name, const TString *name,
const TFieldList *fields, const TFieldList *fields,
const TLayoutQualifier &layoutQualifier); const TLayoutQualifier &layoutQualifier,
TExtension extension = TExtension::UNDEFINED);
TLayoutBlockStorage blockStorage() const { return mBlockStorage; } TLayoutBlockStorage blockStorage() const { return mBlockStorage; }
int blockBinding() const { return mBinding; } int blockBinding() const { return mBinding; }
...@@ -186,16 +191,15 @@ class TFunction : public TSymbol ...@@ -186,16 +191,15 @@ class TFunction : public TSymbol
TFunction(TSymbolTable *symbolTable, TFunction(TSymbolTable *symbolTable,
const TString *name, const TString *name,
const TType *retType, const TType *retType,
TOperator tOp = EOpNull, TOperator tOp = EOpNull,
TExtension ext = TExtension::UNDEFINED) TExtension extension = TExtension::UNDEFINED)
: TSymbol(symbolTable, name), : TSymbol(symbolTable, name, extension),
returnType(retType), returnType(retType),
mangledName(nullptr), mangledName(nullptr),
op(tOp), op(tOp),
defined(false), defined(false),
mHasPrototypeDeclaration(false) mHasPrototypeDeclaration(false)
{ {
relateToExtension(ext);
} }
~TFunction() override; ~TFunction() override;
bool isFunction() const override { return true; } bool isFunction() const override { return true; }
...@@ -374,11 +378,10 @@ class TSymbolTable : angle::NonCopyable ...@@ -374,11 +378,10 @@ class TSymbolTable : angle::NonCopyable
TPrecision precision) TPrecision precision)
{ {
TVariable *constant = 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]; TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value); unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray); constant->shareConstPointer(unionArray);
constant->relateToExtension(ext);
return insert(level, constant); 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