Cache literal to number conversion.

This commit is contained in:
chriseth 2022-11-08 12:17:04 +01:00
parent ce18dddd20
commit c42d577fc0

View File

@ -91,9 +91,17 @@ u256 solidity::yul::valueOfNumberLiteral(Literal const& _literal)
{ {
yulAssert(_literal.kind == LiteralKind::Number, "Expected number literal!"); yulAssert(_literal.kind == LiteralKind::Number, "Expected number literal!");
std::string const& literalString = _literal.value.str(); static map<YulString, u256> numberCache;
yulAssert(isValidDecimal(literalString) || isValidHex(literalString), "Invalid number literal!"); static YulStringRepository::ResetCallback callback{[&] { numberCache.clear(); }};
return u256(literalString);
auto&& [it, isNew] = numberCache.try_emplace(_literal.value, 0);
if (isNew)
{
std::string const& literalString = _literal.value.str();
yulAssert(isValidDecimal(literalString) || isValidHex(literalString), "Invalid number literal!");
it->second = u256(literalString);
}
return it->second;
} }
u256 solidity::yul::valueOfStringLiteral(Literal const& _literal) u256 solidity::yul::valueOfStringLiteral(Literal const& _literal)