diff --git a/libsolidity/codegen/MultiUseYulFunctionCollector.cpp b/libsolidity/codegen/MultiUseYulFunctionCollector.cpp index bfc44e927..57d2a856c 100644 --- a/libsolidity/codegen/MultiUseYulFunctionCollector.cpp +++ b/libsolidity/codegen/MultiUseYulFunctionCollector.cpp @@ -23,11 +23,13 @@ #include #include - +#include +#include using namespace std; using namespace solidity; using namespace solidity::frontend; +using namespace solidity::util; string MultiUseYulFunctionCollector::requestedFunctions() { @@ -54,3 +56,31 @@ string MultiUseYulFunctionCollector::createFunction(string const& _name, functio } return _name; } + +string MultiUseYulFunctionCollector::createFunction( + string const& _name, + function&, vector&)> const& _creator +) +{ + solAssert(!_name.empty(), ""); + if (!m_requestedFunctions.count(_name)) + { + m_requestedFunctions[_name] = "< arguments; + vector returnParameters; + string body = _creator(arguments, returnParameters); + solAssert(!body.empty(), ""); + + m_requestedFunctions[_name] = Whiskers(R"( + function () -> { + + } + )") + ("functionName", _name) + ("args", joinHumanReadable(arguments)) + ("retParams", joinHumanReadable(returnParameters)) + ("body", body) + .render();; + } + return _name; +} diff --git a/libsolidity/codegen/MultiUseYulFunctionCollector.h b/libsolidity/codegen/MultiUseYulFunctionCollector.h index 428a0c9a3..7883fa668 100644 --- a/libsolidity/codegen/MultiUseYulFunctionCollector.h +++ b/libsolidity/codegen/MultiUseYulFunctionCollector.h @@ -41,6 +41,11 @@ public: /// cases. std::string createFunction(std::string const& _name, std::function const& _creator); + std::string createFunction( + std::string const& _name, + std::function&, std::vector&)> const& _creator + ); + /// @returns concatenation of all generated functions. /// Guarantees that the order of functions in the generated code is deterministic and /// platform-independent. diff --git a/libsolidity/codegen/YulUtilFunctions.cpp b/libsolidity/codegen/YulUtilFunctions.cpp index ea3fec01b..e8b433782 100644 --- a/libsolidity/codegen/YulUtilFunctions.cpp +++ b/libsolidity/codegen/YulUtilFunctions.cpp @@ -3285,19 +3285,17 @@ string YulUtilFunctions::copyStructToStorageFunction(StructType const& _from, St "_to_" + _to.identifier(); - return m_functionCollector.createFunction(functionName, [&]() { + return m_functionCollector.createFunction(functionName, [&](auto& _arguments, auto&) { + _arguments = {"slot", "value"}; Whiskers templ(R"( - function (slot, value) { - if iszero(eq(slot, value)) { - <#member> - { - - } - - } + if iszero(eq(slot, value)) { + <#member> + { + } + + } )"); - templ("functionName", functionName); templ("fromStorage", _from.dataStoredIn(DataLocation::Storage)); MemberList::MemberMap structMembers = _from.nativeMembers(nullptr); @@ -3368,7 +3366,7 @@ string YulUtilFunctions::copyStructToStorageFunction(StructType const& _from, St } else if (fromStorage) { - auto[srcSlotOffset, srcOffset] = _from.storageOffsetsOfMember(structMembers[i].name); + auto const& [srcSlotOffset, srcOffset] = _from.storageOffsetsOfMember(structMembers[i].name); t("memberOffset", formatNumber(srcSlotOffset)); if (memberType.isValueType()) t("read", readFromStorageValueType(memberType, srcOffset, false));