mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-11 14:39:13 +00:00
Fix TextGenerator::UniqueIdentifier() failing with empty string arg
Real problem was that we relied on SymbolTable::New() to be called with the default arg of "tint_symbol", which isn't ergonomic when forwarding to this function from others, like TextGenerator::UniqueIdentifier(). Instead, make New() take emptry string by default, and make it use "tint_symbol" if input arg is empty string. Also made it so that SymbolTable::Register() must not take an empty string, so we now assert, rather than return an invalid symbol. Change-Id: I386ece318c86d1d399f1dd1557a95fecac01f7ec Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56461 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Antonio Maiorano <amaiorano@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
c035366cd5
commit
53069b283d
@ -54,7 +54,7 @@ TEST_F(IdentifierExpressionTest, Assert_DifferentProgramID_Symbol) {
|
|||||||
{
|
{
|
||||||
ProgramBuilder b1;
|
ProgramBuilder b1;
|
||||||
ProgramBuilder b2;
|
ProgramBuilder b2;
|
||||||
b1.Expr(b2.Sym(""));
|
b1.Expr(b2.Sym("b2"));
|
||||||
},
|
},
|
||||||
"internal compiler error");
|
"internal compiler error");
|
||||||
}
|
}
|
||||||
|
@ -32,8 +32,7 @@ SymbolTable& SymbolTable::operator=(const SymbolTable& other) = default;
|
|||||||
SymbolTable& SymbolTable::operator=(SymbolTable&&) = default;
|
SymbolTable& SymbolTable::operator=(SymbolTable&&) = default;
|
||||||
|
|
||||||
Symbol SymbolTable::Register(const std::string& name) {
|
Symbol SymbolTable::Register(const std::string& name) {
|
||||||
if (name == "")
|
TINT_ASSERT(Symbol, !name.empty());
|
||||||
return Symbol();
|
|
||||||
|
|
||||||
auto it = name_to_symbol_.find(name);
|
auto it = name_to_symbol_.find(name);
|
||||||
if (it != name_to_symbol_.end())
|
if (it != name_to_symbol_.end())
|
||||||
@ -63,7 +62,10 @@ std::string SymbolTable::NameFor(const Symbol symbol) const {
|
|||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol SymbolTable::New(std::string prefix /* = "tint_symbol" */) {
|
Symbol SymbolTable::New(std::string prefix /* = "" */) {
|
||||||
|
if (prefix.empty()) {
|
||||||
|
prefix = "tint_symbol";
|
||||||
|
}
|
||||||
auto it = name_to_symbol_.find(prefix);
|
auto it = name_to_symbol_.find(prefix);
|
||||||
if (it == name_to_symbol_.end()) {
|
if (it == name_to_symbol_.end()) {
|
||||||
return Register(prefix);
|
return Register(prefix);
|
||||||
|
@ -66,7 +66,7 @@ class SymbolTable {
|
|||||||
/// @returns a new, unnamed symbol with the given name. If the name is already
|
/// @returns a new, unnamed symbol with the given name. If the name is already
|
||||||
/// taken then this will be suffixed with an underscore and a unique numerical
|
/// taken then this will be suffixed with an underscore and a unique numerical
|
||||||
/// value
|
/// value
|
||||||
Symbol New(std::string name = "tint_symbol");
|
Symbol New(std::string name = "");
|
||||||
|
|
||||||
/// Foreach calls the callback function `F` for each symbol in the table.
|
/// Foreach calls the callback function `F` for each symbol in the table.
|
||||||
/// @param callback must be a function or function-like object with the
|
/// @param callback must be a function or function-like object with the
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#include "src/symbol_table.h"
|
#include "src/symbol_table.h"
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest-spi.h"
|
||||||
|
|
||||||
namespace tint {
|
namespace tint {
|
||||||
namespace {
|
namespace {
|
||||||
@ -49,10 +49,14 @@ TEST_F(SymbolTableTest, ReturnsBlankForMissingSymbol) {
|
|||||||
EXPECT_EQ("$2", s.NameFor(Symbol(2, program_id)));
|
EXPECT_EQ("$2", s.NameFor(Symbol(2, program_id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SymbolTableTest, ReturnsInvalidForBlankString) {
|
TEST_F(SymbolTableTest, AssertsForBlankString) {
|
||||||
|
EXPECT_FATAL_FAILURE(
|
||||||
|
{
|
||||||
auto program_id = ProgramID::New();
|
auto program_id = ProgramID::New();
|
||||||
SymbolTable s{program_id};
|
SymbolTable s{program_id};
|
||||||
EXPECT_FALSE(s.Register("").IsValid());
|
s.Register("");
|
||||||
|
},
|
||||||
|
"internal compiler error");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -62,7 +62,7 @@ class TextGenerator {
|
|||||||
|
|
||||||
/// @return a new, unique identifier with the given prefix.
|
/// @return a new, unique identifier with the given prefix.
|
||||||
/// @param prefix optional prefix to apply to the generated identifier. If
|
/// @param prefix optional prefix to apply to the generated identifier. If
|
||||||
/// empty "tint" will be used.
|
/// empty "tint_symbol" will be used.
|
||||||
std::string UniqueIdentifier(const std::string& prefix = "");
|
std::string UniqueIdentifier(const std::string& prefix = "");
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user