Skip to content

Commit c42d577

Browse files
committed
Cache literal to number conversion.
1 parent ce18ddd commit c42d577

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

libyul/Utilities.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,17 @@ u256 solidity::yul::valueOfNumberLiteral(Literal const& _literal)
9191
{
9292
yulAssert(_literal.kind == LiteralKind::Number, "Expected number literal!");
9393

94-
std::string const& literalString = _literal.value.str();
95-
yulAssert(isValidDecimal(literalString) || isValidHex(literalString), "Invalid number literal!");
96-
return u256(literalString);
94+
static map<YulString, u256> numberCache;
95+
static YulStringRepository::ResetCallback callback{[&] { numberCache.clear(); }};
96+
97+
auto&& [it, isNew] = numberCache.try_emplace(_literal.value, 0);
98+
if (isNew)
99+
{
100+
std::string const& literalString = _literal.value.str();
101+
yulAssert(isValidDecimal(literalString) || isValidHex(literalString), "Invalid number literal!");
102+
it->second = u256(literalString);
103+
}
104+
return it->second;
97105
}
98106

99107
u256 solidity::yul::valueOfStringLiteral(Literal const& _literal)

0 commit comments

Comments
 (0)