Commit 1a3bbaa8 by Olli Etuaho Committed by Commit Bot

Use ImmutableString instead of TString in QualifierTypes

This avoids unnecessary pool allocations when generating errors. Most of the returned strings are static. BUG=angleproject:2267 TEST=angle_unittests Change-Id: Ia9b26898d499985d61e629fddde7aded4714eddf Reviewed-on: https://chromium-review.googlesource.com/885818Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent e033999e
......@@ -2294,7 +2294,7 @@ void TParseContext::checkLocalVariableConstStorageQualifier(const TQualifierWrap
{
error(storageQualifier.getLine(),
"Local variables can only use the const storage qualifier.",
storageQualifier.getQualifierString().c_str());
storageQualifier.getQualifierString());
}
}
}
......
......@@ -7,6 +7,7 @@
#include "compiler/translator/QualifierTypes.h"
#include "compiler/translator/Diagnostics.h"
#include "compiler/translator/ImmutableStringBuilder.h"
#include <algorithm>
......@@ -16,6 +17,35 @@ namespace sh
namespace
{
constexpr const ImmutableString kSpecifiedMultipleTimes(" specified multiple times");
constexpr const ImmutableString kInvariantMultipleTimes(
"The invariant qualifier specified multiple times.");
constexpr const ImmutableString kPrecisionMultipleTimes(
"The precision qualifier specified multiple times.");
constexpr const ImmutableString kLayoutMultipleTimes(
"The layout qualifier specified multiple times.");
constexpr const ImmutableString kLayoutAndInvariantDisallowed(
"The layout qualifier and invariant qualifier cannot coexist in the same "
"declaration according to the grammar.");
constexpr const ImmutableString kInterpolationMultipleTimes(
"The interpolation qualifier specified multiple times.");
constexpr const ImmutableString kOutputLayoutMultipleTimes(
"Output layout location specified multiple times.");
constexpr const ImmutableString kInvariantQualifierFirst(
"The invariant qualifier has to be first in the expression.");
constexpr const ImmutableString kStorageAfterInterpolation(
"Storage qualifiers have to be after interpolation qualifiers.");
constexpr const ImmutableString kPrecisionAfterInterpolation(
"Precision qualifiers have to be after interpolation qualifiers.");
constexpr const ImmutableString kStorageAfterLayout(
"Storage qualifiers have to be after layout qualifiers.");
constexpr const ImmutableString kPrecisionAfterLayout(
"Precision qualifiers have to be after layout qualifiers.");
constexpr const ImmutableString kPrecisionAfterStorage(
"Precision qualifiers have to be after storage qualifiers.");
constexpr const ImmutableString kPrecisionAfterMemory(
"Precision qualifiers have to be after memory qualifiers.");
// GLSL ES 3.10 does not impose a strict order on type qualifiers and allows multiple layout
// declarations.
// GLSL ES 3.10 Revision 4, 4.10 Order of Qualification
......@@ -47,11 +77,18 @@ bool IsInvariantCorrect(const TTypeQualifierBuilder::QualifierSequence &qualifie
return qualifiers.size() >= 1 && IsScopeQualifierWrapper(qualifiers[0]);
}
ImmutableString QualifierSpecifiedMultipleTimesErrorMessage(const ImmutableString &qualifierString)
{
ImmutableStringBuilder errorMsg(qualifierString.length() + kSpecifiedMultipleTimes.length());
errorMsg << qualifierString << kSpecifiedMultipleTimes;
return errorMsg;
}
// Returns true if there are qualifiers which have been specified multiple times
// If areQualifierChecksRelaxed is set to true, then layout qualifier repetition is allowed.
bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qualifiers,
bool areQualifierChecksRelaxed,
std::string *errorMessage)
ImmutableString *errorMessage)
{
bool invariantFound = false;
bool precisionFound = false;
......@@ -71,7 +108,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
{
if (invariantFound)
{
*errorMessage = "The invariant qualifier specified multiple times.";
*errorMessage = kInvariantMultipleTimes;
return true;
}
invariantFound = true;
......@@ -81,7 +118,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
{
if (precisionFound)
{
*errorMessage = "The precision qualifier specified multiple times.";
*errorMessage = kPrecisionMultipleTimes;
return true;
}
precisionFound = true;
......@@ -91,7 +128,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
{
if (layoutFound && !areQualifierChecksRelaxed)
{
*errorMessage = "The layout qualifier specified multiple times.";
*errorMessage = kLayoutMultipleTimes;
return true;
}
if (invariantFound && !areQualifierChecksRelaxed)
......@@ -99,9 +136,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
// This combination is not correct according to the syntax specified in the
// formal grammar in the ESSL 3.00 spec. In ESSL 3.10 the grammar does not have
// a similar restriction.
*errorMessage =
"The layout qualifier and invariant qualifier cannot coexist in the same "
"declaration according to the grammar.";
*errorMessage = kLayoutAndInvariantDisallowed;
return true;
}
layoutFound = true;
......@@ -117,7 +152,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
// 'smooth centroid' will be squashed to 'centroid'
if (interpolationFound)
{
*errorMessage = "The interpolation qualifier specified multiple times.";
*errorMessage = kInterpolationMultipleTimes;
return true;
}
interpolationFound = true;
......@@ -142,8 +177,8 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
TQualifier previousQualifier = previousQualifierWrapper->getQualifier();
if (currentQualifier == previousQualifier)
{
*errorMessage = previousQualifierWrapper->getQualifierString().c_str();
*errorMessage += " specified multiple times";
*errorMessage = QualifierSpecifiedMultipleTimesErrorMessage(
previousQualifierWrapper->getQualifierString());
return true;
}
}
......@@ -167,8 +202,8 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
TQualifier previousQualifier = previousQualifierWrapper->getQualifier();
if (currentQualifier == previousQualifier)
{
*errorMessage = previousQualifierWrapper->getQualifierString().c_str();
*errorMessage += " specified multiple times";
*errorMessage = QualifierSpecifiedMultipleTimesErrorMessage(
previousQualifierWrapper->getQualifierString());
return true;
}
}
......@@ -185,7 +220,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
// GLSL ES 3.00.6 section 4.3.8.2 Output Layout Qualifiers
// GLSL ES 3.10 section 4.4.2 Output Layout Qualifiers
// "The qualifier may appear at most once within a declaration."
*errorMessage = "Output layout location specified multiple times.";
*errorMessage = kOutputLayoutMultipleTimes;
return true;
}
......@@ -197,7 +232,7 @@ bool HasRepeatingQualifiers(const TTypeQualifierBuilder::QualifierSequence &qual
// invariant-qualifier interpolation-qualifier storage-qualifier precision-qualifier
// layout-qualifier has to be before storage-qualifier.
bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualifiers,
std::string *errorMessage)
ImmutableString *errorMessage)
{
bool foundInterpolation = false;
bool foundStorage = false;
......@@ -209,20 +244,19 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif
case QtInvariant:
if (foundInterpolation || foundStorage || foundPrecision)
{
*errorMessage = "The invariant qualifier has to be first in the expression.";
*errorMessage = kInvariantQualifierFirst;
return false;
}
break;
case QtInterpolation:
if (foundStorage)
{
*errorMessage = "Storage qualifiers have to be after interpolation qualifiers.";
*errorMessage = kStorageAfterInterpolation;
return false;
}
else if (foundPrecision)
{
*errorMessage =
"Precision qualifiers have to be after interpolation qualifiers.";
*errorMessage = kPrecisionAfterInterpolation;
return false;
}
foundInterpolation = true;
......@@ -230,19 +264,19 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif
case QtLayout:
if (foundStorage)
{
*errorMessage = "Storage qualifiers have to be after layout qualifiers.";
*errorMessage = kStorageAfterLayout;
return false;
}
else if (foundPrecision)
{
*errorMessage = "Precision qualifiers have to be after layout qualifiers.";
*errorMessage = kPrecisionAfterLayout;
return false;
}
break;
case QtStorage:
if (foundPrecision)
{
*errorMessage = "Precision qualifiers have to be after storage qualifiers.";
*errorMessage = kPrecisionAfterStorage;
return false;
}
foundStorage = true;
......@@ -250,7 +284,7 @@ bool AreQualifiersInOrder(const TTypeQualifierBuilder::QualifierSequence &qualif
case QtMemory:
if (foundPrecision)
{
*errorMessage = "Precision qualifiers have to be after memory qualifiers.";
*errorMessage = kPrecisionAfterMemory;
return false;
}
break;
......@@ -480,9 +514,9 @@ TTypeQualifier GetVariableTypeQualifierFromSortedSequence(
}
if (!isQualifierValid)
{
const TString &qualifierString = qualifier->getQualifierString();
const ImmutableString &qualifierString = qualifier->getQualifierString();
diagnostics->error(qualifier->getLine(), "invalid qualifier combination",
qualifierString.c_str());
qualifierString.data());
break;
}
}
......@@ -525,9 +559,9 @@ TTypeQualifier GetParameterTypeQualifierFromSortedSequence(
}
if (!isQualifierValid)
{
const TString &qualifierString = qualifier->getQualifierString();
const ImmutableString &qualifierString = qualifier->getQualifierString();
diagnostics->error(qualifier->getLine(), "invalid parameter qualifier",
qualifierString.c_str());
qualifierString.data());
break;
}
}
......@@ -717,16 +751,16 @@ void TTypeQualifierBuilder::appendQualifier(const TQualifierWrapperBase *qualifi
bool TTypeQualifierBuilder::checkSequenceIsValid(TDiagnostics *diagnostics) const
{
bool areQualifierChecksRelaxed = AreTypeQualifierChecksRelaxed(mShaderVersion);
std::string errorMessage;
ImmutableString errorMessage("");
if (HasRepeatingQualifiers(mQualifiers, areQualifierChecksRelaxed, &errorMessage))
{
diagnostics->error(mQualifiers[0]->getLine(), errorMessage.c_str(), "qualifier sequence");
diagnostics->error(mQualifiers[0]->getLine(), errorMessage.data(), "qualifier sequence");
return false;
}
if (!areQualifierChecksRelaxed && !AreQualifiersInOrder(mQualifiers, &errorMessage))
{
diagnostics->error(mQualifiers[0]->getLine(), errorMessage.c_str(), "qualifier sequence");
diagnostics->error(mQualifiers[0]->getLine(), errorMessage.data(), "qualifier sequence");
return false;
}
......
......@@ -9,6 +9,7 @@
#include "common/angleutils.h"
#include "compiler/translator/BaseTypes.h"
#include "compiler/translator/ImmutableString.h"
#include "compiler/translator/Types.h"
namespace sh
......@@ -37,7 +38,7 @@ class TQualifierWrapperBase : angle::NonCopyable
TQualifierWrapperBase(const TSourceLoc &line) : mLine(line) {}
virtual ~TQualifierWrapperBase(){};
virtual TQualifierType getType() const = 0;
virtual TString getQualifierString() const = 0;
virtual ImmutableString getQualifierString() const = 0;
virtual unsigned int getRank() const = 0;
const TSourceLoc &getLine() const { return mLine; }
private:
......@@ -50,9 +51,9 @@ class TInvariantQualifierWrapper final : public TQualifierWrapperBase
TInvariantQualifierWrapper(const TSourceLoc &line) : TQualifierWrapperBase(line) {}
~TInvariantQualifierWrapper() {}
TQualifierType getType() const { return QtInvariant; }
TString getQualifierString() const { return "invariant"; }
unsigned int getRank() const;
TQualifierType getType() const override { return QtInvariant; }
ImmutableString getQualifierString() const override { return ImmutableString("invariant"); }
unsigned int getRank() const override;
};
class TInterpolationQualifierWrapper final : public TQualifierWrapperBase
......@@ -64,10 +65,13 @@ class TInterpolationQualifierWrapper final : public TQualifierWrapperBase
}
~TInterpolationQualifierWrapper() {}
TQualifierType getType() const { return QtInterpolation; }
TString getQualifierString() const { return sh::getQualifierString(mInterpolationQualifier); }
TQualifierType getType() const override { return QtInterpolation; }
ImmutableString getQualifierString() const override
{
return ImmutableString(sh::getQualifierString(mInterpolationQualifier));
}
TQualifier getQualifier() const { return mInterpolationQualifier; }
unsigned int getRank() const;
unsigned int getRank() const override;
private:
TQualifier mInterpolationQualifier;
......@@ -82,10 +86,10 @@ class TLayoutQualifierWrapper final : public TQualifierWrapperBase
}
~TLayoutQualifierWrapper() {}
TQualifierType getType() const { return QtLayout; }
TString getQualifierString() const { return "layout"; }
TQualifierType getType() const override { return QtLayout; }
ImmutableString getQualifierString() const override { return ImmutableString("layout"); }
const TLayoutQualifier &getQualifier() const { return mLayoutQualifier; }
unsigned int getRank() const;
unsigned int getRank() const override;
private:
TLayoutQualifier mLayoutQualifier;
......@@ -100,10 +104,13 @@ class TStorageQualifierWrapper final : public TQualifierWrapperBase
}
~TStorageQualifierWrapper() {}
TQualifierType getType() const { return QtStorage; }
TString getQualifierString() const { return sh::getQualifierString(mStorageQualifier); }
TQualifierType getType() const override { return QtStorage; }
ImmutableString getQualifierString() const override
{
return ImmutableString(sh::getQualifierString(mStorageQualifier));
}
TQualifier getQualifier() const { return mStorageQualifier; }
unsigned int getRank() const;
unsigned int getRank() const override;
private:
TQualifier mStorageQualifier;
......@@ -118,10 +125,13 @@ class TPrecisionQualifierWrapper final : public TQualifierWrapperBase
}
~TPrecisionQualifierWrapper() {}
TQualifierType getType() const { return QtPrecision; }
TString getQualifierString() const { return sh::getPrecisionString(mPrecisionQualifier); }
TQualifierType getType() const override { return QtPrecision; }
ImmutableString getQualifierString() const override
{
return ImmutableString(sh::getPrecisionString(mPrecisionQualifier));
}
TPrecision getQualifier() const { return mPrecisionQualifier; }
unsigned int getRank() const;
unsigned int getRank() const override;
private:
TPrecision mPrecisionQualifier;
......@@ -136,10 +146,13 @@ class TMemoryQualifierWrapper final : public TQualifierWrapperBase
}
~TMemoryQualifierWrapper() {}
TQualifierType getType() const { return QtMemory; }
TString getQualifierString() const { return sh::getQualifierString(mMemoryQualifier); }
TQualifierType getType() const override { return QtMemory; }
ImmutableString getQualifierString() const override
{
return ImmutableString(sh::getQualifierString(mMemoryQualifier));
}
TQualifier getQualifier() const { return mMemoryQualifier; }
unsigned int getRank() const;
unsigned int getRank() const override;
private:
TQualifier mMemoryQualifier;
......
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