Make asCallableFunction to never fail and assert abount parameter size if bound instead.

This commit is contained in:
chriseth 2018-11-22 15:37:26 +01:00
parent 9e964852cc
commit 92ba8a95f6
2 changed files with 8 additions and 8 deletions

View File

@ -442,8 +442,9 @@ MemberList::MemberMap Type::boundFunctions(Type const& _type, ContractDefinition
if (!function->isVisibleAsLibraryMember() || seenFunctions.count(function))
continue;
seenFunctions.insert(function);
FunctionType funType(*function, false);
if (auto fun = funType.asCallableFunction(true, true))
if (function->parameters().empty())
continue;
FunctionTypePointer fun = FunctionType(*function, false).asCallableFunction(true, true);
if (_type.isImplicitlyConvertibleTo(*fun->selfType()))
members.push_back(MemberList::Member(function->name(), fun, function));
}
@ -3061,8 +3062,8 @@ TypePointer FunctionType::copyAndSetGasOrValue(bool _setGas, bool _setValue) con
FunctionTypePointer FunctionType::asCallableFunction(bool _inLibrary, bool _bound) const
{
if (_bound && m_parameterTypes.empty())
return FunctionTypePointer();
if (_bound)
solAssert(!m_parameterTypes.empty(), "");
TypePointers parameterTypes;
for (auto const& t: m_parameterTypes)

View File

@ -1158,9 +1158,8 @@ public:
/// from CallData to Memory. This is the type that would be used when the function is
/// called, as opposed to the parameter types that are available inside the function body.
/// Also supports variants to be used for library or bound calls.
/// Returns empty shared pointer on a failure. Namely, if a bound function has no parameters.
/// @param _inLibrary if true, uses DelegateCall as location.
/// @param _bound if true, the arguments are placed as `arg1.functionName(arg2, ..., argn)`.
/// @param _bound if true, the function type is set to be bound.
FunctionTypePointer asCallableFunction(bool _inLibrary, bool _bound = false) const;
private: