Don't query names of empty symbols
This makes it possible to return a reference from TSymbol::name()
instead of a pointer. This is safer since it completely avoids the
possibility of a nullptr dereference. An assert is making sure that
the function is not being called for empty symbols.
BUG=angleproject:2267
TEST=angle_unittests
Change-Id: I44279f65989dbb828322843fc0216ba84d91dedf
Reviewed-on: https://chromium-review.googlesource.com/836894
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/CollectVariables.cpp b/src/compiler/translator/CollectVariables.cpp
index 7a8750b..0c0dba2 100644
--- a/src/compiler/translator/CollectVariables.cpp
+++ b/src/compiler/translator/CollectVariables.cpp
@@ -91,8 +91,7 @@
std::vector<InterfaceBlock> *infoList)
{
ASSERT(interfaceBlock);
- ASSERT(interfaceBlock->name());
- InterfaceBlock *namedBlock = FindVariable(*interfaceBlock->name(), infoList);
+ InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), infoList);
ASSERT(namedBlock);
// Set static use on the parent interface block here
@@ -576,7 +575,7 @@
variableOut->type = GL_NONE;
if (structure->symbolType() != SymbolType::Empty)
{
- variableOut->structName = structure->name()->c_str();
+ variableOut->structName = structure->name().c_str();
}
const TFieldList &fields = structure->fields();
@@ -586,7 +585,7 @@
// Regardless of the variable type (uniform, in/out etc.) its fields are always plain
// ShaderVariable objects.
ShaderVariable fieldVariable;
- setCommonVariableProperties(*field->type(), TName(&field->name()), &fieldVariable);
+ setCommonVariableProperties(*field->type(), TName(field->name()), &fieldVariable);
variableOut->fields.push_back(fieldVariable);
}
}
@@ -665,7 +664,7 @@
const TInterfaceBlock *blockType = interfaceBlockType.getInterfaceBlock();
ASSERT(blockType);
- interfaceBlock->name = blockType->name()->c_str();
+ interfaceBlock->name = blockType->name().c_str();
interfaceBlock->mappedName = getMappedName(TName(blockType->name()));
interfaceBlock->instanceName = instanceName.c_str();
ASSERT(!interfaceBlockType.isArrayOfArrays()); // Disallowed by GLSL ES 3.10 section 4.3.9
@@ -687,7 +686,7 @@
const TType &fieldType = *field->type();
InterfaceBlockField fieldVariable;
- setCommonVariableProperties(fieldType, TName(&field->name()), &fieldVariable);
+ setCommonVariableProperties(fieldType, TName(field->name()), &fieldVariable);
fieldVariable.isRowMajorLayout =
(fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor);
interfaceBlock->fields.push_back(fieldVariable);
@@ -835,7 +834,7 @@
const TInterfaceBlock *interfaceBlock = blockNode->getType().getInterfaceBlock();
if (!namedBlock)
{
- namedBlock = findNamedInterfaceBlock(*interfaceBlock->name());
+ namedBlock = findNamedInterfaceBlock(interfaceBlock->name());
}
ASSERT(namedBlock);
namedBlock->staticUse = true;