Always create TVariables for TIntermSymbol nodes
TIntermSymbol nodes are now constructed based on a specific TVariable.
This makes sure that all TIntermSymbol nodes that are created to refer
to a specific temporary in an AST transform will have consistent data.
The TVariable objects are not necessarily added to the symbol table
levels - just those variables that can be referred to by their name
during parsing need to be reachable through there.
In the future this can be taken a step further so that TIntermSymbol
nodes just to point to a TVariable instead of duplicating the
information.
BUG=angleproject:2267
TEST=angle_unittests
Change-Id: I4e7bcdb0637cd3b588d3c202ef02f4b7bd7954a1
Reviewed-on: https://chromium-review.googlesource.com/811925
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index 5fa8741..04956d3 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -39,6 +39,20 @@
mExtension(extension)
{
ASSERT(mSymbolType == SymbolType::BuiltIn || mExtension == TExtension::UNDEFINED);
+ ASSERT(mName != nullptr || mSymbolType == SymbolType::AngleInternal ||
+ mSymbolType == SymbolType::NotResolved);
+}
+
+const TString &TSymbol::name() const
+{
+ if (mName != nullptr)
+ {
+ return *mName;
+ }
+ ASSERT(mSymbolType == SymbolType::AngleInternal);
+ TInfoSinkBase symbolNameOut;
+ symbolNameOut << "s" << mUniqueId.get();
+ return *NewPoolTString(symbolNameOut.c_str());
}
TVariable::TVariable(TSymbolTable *symbolTable,
@@ -332,9 +346,10 @@
}
}
-TVariable *TSymbolTable::declareVariable(const TString *name, const TType &type)
+bool TSymbolTable::declareVariable(TVariable *variable)
{
- return insertVariable(currentLevel(), name, type, SymbolType::UserDefined);
+ ASSERT(variable->symbolType() == SymbolType::UserDefined);
+ return insertVariable(currentLevel(), variable);
}
bool TSymbolTable::declareStructType(TStructure *str)
@@ -388,6 +403,12 @@
return nullptr;
}
+bool TSymbolTable::insertVariable(ESymbolLevel level, TVariable *variable)
+{
+ ASSERT(variable);
+ return insert(level, variable);
+}
+
bool TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str)
{
ASSERT(str);