| 1911 | } |
| 1912 | |
| 1913 | std::string YulUtilFunctions::clearStorageStructFunction(StructType const& _type) |
| 1914 | { |
| 1915 | solAssert(_type.location() == DataLocation::Storage, ""); |
| 1916 | |
| 1917 | std::string functionName = "clear_struct_storage_" + _type.identifier(); |
| 1918 | |
| 1919 | return m_functionCollector.createFunction(functionName, [&] { |
| 1920 | MemberList::MemberMap structMembers = _type.nativeMembers(nullptr); |
| 1921 | std::vector<std::map<std::string, std::string>> memberSetValues; |
| 1922 | |
| 1923 | std::set<u256> slotsCleared; |
| 1924 | for (auto const& member: structMembers) |
| 1925 | { |
| 1926 | if (member.type->category() == Type::Category::Mapping) |
| 1927 | continue; |
| 1928 | if (member.type->storageBytes() < 32) |
| 1929 | { |
| 1930 | auto const& slotDiff = _type.storageOffsetsOfMember(member.name).first; |
| 1931 | if (!slotsCleared.count(slotDiff)) |
| 1932 | { |
| 1933 | memberSetValues.emplace_back().emplace("clearMember", "sstore(add(slot, " + slotDiff.str() + "), 0)"); |
| 1934 | slotsCleared.emplace(slotDiff); |
| 1935 | } |
| 1936 | } |
| 1937 | else |
| 1938 | { |
| 1939 | auto const& [memberSlotDiff, memberStorageOffset] = _type.storageOffsetsOfMember(member.name); |
| 1940 | solAssert(memberStorageOffset == 0, ""); |
| 1941 | |
| 1942 | memberSetValues.emplace_back().emplace("clearMember", Whiskers(R"( |
| 1943 | <setZero>(add(slot, <memberSlotDiff>), <memberStorageOffset>) |
| 1944 | )") |
| 1945 | ("setZero", storageSetToZeroFunction(*member.type, VariableDeclaration::Location::Unspecified)) |
| 1946 | ("memberSlotDiff", memberSlotDiff.str()) |
| 1947 | ("memberStorageOffset", std::to_string(memberStorageOffset)) |
| 1948 | .render() |
| 1949 | ); |
| 1950 | } |
| 1951 | } |
| 1952 | |
| 1953 | return Whiskers(R"( |
| 1954 | function <functionName>(slot) { |
| 1955 | <#member> |
| 1956 | <clearMember> |
| 1957 | </member> |
| 1958 | } |
| 1959 | )") |
| 1960 | ("functionName", functionName) |
| 1961 | ("member", memberSetValues) |
| 1962 | .render(); |
| 1963 | }); |
| 1964 | } |
| 1965 | |
| 1966 | std::string YulUtilFunctions::copyArrayToStorageFunction(ArrayType const& _fromType, ArrayType const& _toType) |
| 1967 | { |
nothing calls this directly
no test coverage detected