| 4057 | } |
| 4058 | |
| 4059 | std::string YulUtilFunctions::validatorFunction(Type const& _type, bool _revertOnFailure) |
| 4060 | { |
| 4061 | std::string functionName = std::string("validator_") + (_revertOnFailure ? "revert_" : "assert_") + _type.identifier(); |
| 4062 | return m_functionCollector.createFunction(functionName, [&]() { |
| 4063 | Whiskers templ(R"( |
| 4064 | function <functionName>(value) { |
| 4065 | if iszero(<condition>) { <failure> } |
| 4066 | } |
| 4067 | )"); |
| 4068 | templ("functionName", functionName); |
| 4069 | PanicCode panicCode = PanicCode::Generic; |
| 4070 | |
| 4071 | switch (_type.category()) |
| 4072 | { |
| 4073 | case Type::Category::Address: |
| 4074 | case Type::Category::Integer: |
| 4075 | case Type::Category::RationalNumber: |
| 4076 | case Type::Category::Bool: |
| 4077 | case Type::Category::FixedPoint: |
| 4078 | case Type::Category::Function: |
| 4079 | case Type::Category::Array: |
| 4080 | case Type::Category::Struct: |
| 4081 | case Type::Category::Mapping: |
| 4082 | case Type::Category::FixedBytes: |
| 4083 | case Type::Category::Contract: |
| 4084 | case Type::Category::UserDefinedValueType: |
| 4085 | { |
| 4086 | templ("condition", "eq(value, " + cleanupFunction(_type) + "(value))"); |
| 4087 | break; |
| 4088 | } |
| 4089 | case Type::Category::Enum: |
| 4090 | { |
| 4091 | size_t members = dynamic_cast<EnumType const&>(_type).numberOfMembers(); |
| 4092 | solAssert(members > 0, "empty enum should have caused a parser error."); |
| 4093 | panicCode = PanicCode::EnumConversionError; |
| 4094 | templ("condition", "lt(value, " + std::to_string(members) + ")"); |
| 4095 | break; |
| 4096 | } |
| 4097 | case Type::Category::InaccessibleDynamic: |
| 4098 | templ("condition", "1"); |
| 4099 | break; |
| 4100 | default: |
| 4101 | solAssert(false, "Validation of type " + _type.identifier() + " requested."); |
| 4102 | } |
| 4103 | |
| 4104 | if (_revertOnFailure) |
| 4105 | templ("failure", "revert(0, 0)"); |
| 4106 | else |
| 4107 | templ("failure", panicFunction(panicCode) + "()"); |
| 4108 | |
| 4109 | return templ.render(); |
| 4110 | }); |
| 4111 | } |
| 4112 | |
| 4113 | std::string YulUtilFunctions::packedHashFunction( |
| 4114 | std::vector<Type const*> const& _givenTypes, |
no test coverage detected