mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Isabelle abiv2 fuzzer: Add type string
This commit is contained in:
parent
d75821e068
commit
2e3cba996a
@ -195,7 +195,10 @@ pair<string, string> ProtoConverter::varDecl(
|
||||
typeStr,
|
||||
((m_varCounter == 1) ? Delimiter::SKIP : Delimiter::ADD)
|
||||
);
|
||||
|
||||
appendToIsabelleTypeString(
|
||||
tVisitor.isabelleTypeString(),
|
||||
((m_varCounter == 1) ? Delimiter::SKIP : Delimiter::ADD)
|
||||
);
|
||||
// Update dyn param only if necessary
|
||||
if (tVisitor.isLastDynParamRightPadded())
|
||||
m_isLastDynParamRightPadded = true;
|
||||
@ -352,6 +355,14 @@ void ProtoConverter::appendTypedParamsPublic(
|
||||
.render();
|
||||
}
|
||||
|
||||
void ProtoConverter::appendToIsabelleTypeString(
|
||||
std::string const& _typeString,
|
||||
Delimiter _delimiter
|
||||
)
|
||||
{
|
||||
m_isabelleTypeString << delimiterToString(_delimiter) << _typeString;
|
||||
}
|
||||
|
||||
std::string ProtoConverter::typedParametersAsString(CalleeType _calleeType)
|
||||
{
|
||||
switch (_calleeType)
|
||||
@ -628,6 +639,15 @@ pragma experimental ABIEncoderV2;)";
|
||||
.render();
|
||||
}
|
||||
|
||||
string ProtoConverter::isabelleTypeString() const
|
||||
{
|
||||
string typeString = m_isabelleTypeString.str();
|
||||
if (!typeString.empty())
|
||||
return "(" + typeString + ")";
|
||||
else
|
||||
return typeString;
|
||||
}
|
||||
|
||||
string ProtoConverter::contractToString(Contract const& _input)
|
||||
{
|
||||
visit(_input);
|
||||
@ -635,27 +655,44 @@ string ProtoConverter::contractToString(Contract const& _input)
|
||||
}
|
||||
|
||||
/// Type visitor
|
||||
void TypeVisitor::StructTupleString::addTypeStringToTuple(string& _typeString)
|
||||
{
|
||||
index++;
|
||||
if (index > 1)
|
||||
stream << ",";
|
||||
stream << _typeString;
|
||||
}
|
||||
|
||||
void TypeVisitor::StructTupleString::addArrayBracketToType(string& _arrayBracket)
|
||||
{
|
||||
stream << _arrayBracket;
|
||||
}
|
||||
|
||||
string TypeVisitor::visit(BoolType const&)
|
||||
{
|
||||
m_baseType = "bool";
|
||||
m_structTupleString.addTypeStringToTuple(m_baseType);
|
||||
return m_baseType;
|
||||
}
|
||||
|
||||
string TypeVisitor::visit(IntegerType const& _type)
|
||||
{
|
||||
m_baseType = getIntTypeAsString(_type);
|
||||
m_structTupleString.addTypeStringToTuple(m_baseType);
|
||||
return m_baseType;
|
||||
}
|
||||
|
||||
string TypeVisitor::visit(FixedByteType const& _type)
|
||||
{
|
||||
m_baseType = getFixedByteTypeAsString(_type);
|
||||
m_structTupleString.addTypeStringToTuple(m_baseType);
|
||||
return m_baseType;
|
||||
}
|
||||
|
||||
string TypeVisitor::visit(AddressType const& _type)
|
||||
{
|
||||
m_baseType = getAddressTypeAsString(_type);
|
||||
m_structTupleString.addTypeStringToTuple(m_baseType);
|
||||
return m_baseType;
|
||||
}
|
||||
|
||||
@ -666,12 +703,13 @@ string TypeVisitor::visit(ArrayType const& _type)
|
||||
|
||||
string baseType = visit(_type.t());
|
||||
solAssert(!baseType.empty(), "");
|
||||
string arrayBraces = _type.is_static() ?
|
||||
string arrayBracket = _type.is_static() ?
|
||||
string("[") +
|
||||
to_string(getStaticArrayLengthFromFuzz(_type.length())) +
|
||||
string("]") :
|
||||
string("[]");
|
||||
m_baseType += arrayBraces;
|
||||
m_baseType += arrayBracket;
|
||||
m_structTupleString.addArrayBracketToType(arrayBracket);
|
||||
|
||||
// If we don't know yet if the array will be dynamically encoded,
|
||||
// check again. If we already know that it will be, there's no
|
||||
@ -679,13 +717,14 @@ string TypeVisitor::visit(ArrayType const& _type)
|
||||
if (!m_isLastDynParamRightPadded)
|
||||
m_isLastDynParamRightPadded = DynParamVisitor().visit(_type);
|
||||
|
||||
return baseType + arrayBraces;
|
||||
return baseType + arrayBracket;
|
||||
}
|
||||
|
||||
string TypeVisitor::visit(DynamicByteArrayType const& _type)
|
||||
{
|
||||
m_isLastDynParamRightPadded = true;
|
||||
m_baseType = bytesArrayTypeAsString(_type);
|
||||
m_structTupleString.addTypeStringToTuple(m_baseType);
|
||||
return m_baseType;
|
||||
}
|
||||
|
||||
@ -708,7 +747,8 @@ void TypeVisitor::structDefinition(StructType const& _type)
|
||||
to_string(m_structCounter) +
|
||||
" {"
|
||||
);
|
||||
|
||||
// Start tuple of types with parenthesis
|
||||
m_structTupleString.start();
|
||||
// Increase indentation for struct fields
|
||||
m_indentation++;
|
||||
for (auto const& t: _type.t())
|
||||
@ -731,9 +771,13 @@ void TypeVisitor::structDefinition(StructType const& _type)
|
||||
("member", "m" + to_string(m_structFieldCounter++))
|
||||
.render()
|
||||
);
|
||||
string isabelleTypeStr = tVisitor.isabelleTypeString();
|
||||
m_structTupleString.addTypeStringToTuple(isabelleTypeStr);
|
||||
}
|
||||
m_indentation--;
|
||||
structDef += lineString("}");
|
||||
// End tuple of types with parenthesis
|
||||
m_structTupleString.end();
|
||||
m_structCounter++;
|
||||
m_structDef << structDef;
|
||||
m_indentation = wasIndentation;
|
||||
|
@ -152,6 +152,7 @@ public:
|
||||
ProtoConverter(ProtoConverter const&) = delete;
|
||||
ProtoConverter(ProtoConverter&&) = delete;
|
||||
std::string contractToString(Contract const& _input);
|
||||
std::string isabelleTypeString() const;
|
||||
private:
|
||||
enum class Delimiter
|
||||
{
|
||||
@ -287,6 +288,13 @@ private:
|
||||
Delimiter _delimiter
|
||||
);
|
||||
|
||||
/// Append type name to type string meant to be
|
||||
/// passed to Isabelle coder API.
|
||||
void appendToIsabelleTypeString(
|
||||
std::string const& _typeString,
|
||||
Delimiter _delimiter
|
||||
);
|
||||
|
||||
/// Returns a Solidity variable declaration statement
|
||||
/// @param _type: string containing Solidity type of the
|
||||
/// variable to be declared.
|
||||
@ -369,6 +377,8 @@ private:
|
||||
/// Contains typed parameter list to be passed to callee functions
|
||||
std::ostringstream m_typedParamsExternal;
|
||||
std::ostringstream m_typedParamsPublic;
|
||||
/// Contains type string to be passed to Isabelle API
|
||||
std::ostringstream m_isabelleTypeString;
|
||||
/// Contains type stream to be used in returndata coder function
|
||||
/// signature
|
||||
std::ostringstream m_types;
|
||||
@ -630,7 +640,31 @@ public:
|
||||
else
|
||||
return false;
|
||||
}
|
||||
std::string isabelleTypeString()
|
||||
{
|
||||
return m_structTupleString.stream.str();
|
||||
}
|
||||
private:
|
||||
struct StructTupleString
|
||||
{
|
||||
StructTupleString() = default;
|
||||
unsigned index = 0;
|
||||
std::ostringstream stream;
|
||||
void start()
|
||||
{
|
||||
stream << "(";
|
||||
}
|
||||
void end()
|
||||
{
|
||||
stream << ")";
|
||||
}
|
||||
std::string operator()()
|
||||
{
|
||||
return stream.str();
|
||||
}
|
||||
void addTypeStringToTuple(std::string& _typeString);
|
||||
void addArrayBracketToType(std::string& _arrayBracket);
|
||||
};
|
||||
void structDefinition(StructType const&);
|
||||
|
||||
std::string indentation()
|
||||
@ -641,9 +675,11 @@ private:
|
||||
{
|
||||
return indentation() + _line + "\n";
|
||||
}
|
||||
|
||||
std::string m_baseType;
|
||||
std::ostringstream m_structDef;
|
||||
/// Utility type for conveniently composing a tuple
|
||||
/// string for struct types.
|
||||
StructTupleString m_structTupleString;
|
||||
unsigned m_indentation;
|
||||
unsigned m_structCounter;
|
||||
unsigned m_structStartCounter;
|
||||
|
Loading…
Reference in New Issue
Block a user