mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge remote-tracking branch 'origin/develop' into breaking
This commit is contained in:
+41
-3
@@ -198,11 +198,11 @@ vector<pair<util::FixedHash<4>, FunctionTypePointer>> const& ContractDefinition:
|
||||
});
|
||||
}
|
||||
|
||||
uint64_t ContractDefinition::interfaceId() const
|
||||
uint32_t ContractDefinition::interfaceId() const
|
||||
{
|
||||
uint64_t result{0};
|
||||
uint32_t result{0};
|
||||
for (auto const& function: interfaceFunctionList(false))
|
||||
result ^= util::fromBigEndian<uint64_t>(function.first.ref());
|
||||
result ^= util::fromBigEndian<uint32_t>(function.first.ref());
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -752,6 +752,44 @@ FunctionCallAnnotation& FunctionCall::annotation() const
|
||||
return initAnnotation<FunctionCallAnnotation>();
|
||||
}
|
||||
|
||||
vector<ASTPointer<Expression const>> FunctionCall::sortedArguments() const
|
||||
{
|
||||
// normal arguments
|
||||
if (m_names.empty())
|
||||
return arguments();
|
||||
|
||||
// named arguments
|
||||
FunctionTypePointer functionType;
|
||||
if (*annotation().kind == FunctionCallKind::StructConstructorCall)
|
||||
{
|
||||
auto const& type = dynamic_cast<TypeType const&>(*m_expression->annotation().type);
|
||||
auto const& structType = dynamic_cast<StructType const&>(*type.actualType());
|
||||
functionType = structType.constructorType();
|
||||
}
|
||||
else
|
||||
functionType = dynamic_cast<FunctionType const*>(m_expression->annotation().type);
|
||||
|
||||
vector<ASTPointer<Expression const>> sorted;
|
||||
for (auto const& parameterName: functionType->parameterNames())
|
||||
{
|
||||
bool found = false;
|
||||
for (size_t j = 0; j < m_names.size() && !found; j++)
|
||||
if ((found = (parameterName == *m_names.at(j))))
|
||||
// we found the actual parameter position
|
||||
sorted.push_back(m_arguments.at(j));
|
||||
solAssert(found, "");
|
||||
}
|
||||
|
||||
if (!functionType->takesArbitraryParameters())
|
||||
{
|
||||
solAssert(m_arguments.size() == functionType->parameterTypes().size(), "");
|
||||
solAssert(m_arguments.size() == m_names.size(), "");
|
||||
solAssert(m_arguments.size() == sorted.size(), "");
|
||||
}
|
||||
|
||||
return sorted;
|
||||
}
|
||||
|
||||
IdentifierAnnotation& Identifier::annotation() const
|
||||
{
|
||||
return initAnnotation<IdentifierAnnotation>();
|
||||
|
||||
@@ -515,7 +515,7 @@ public:
|
||||
std::map<util::FixedHash<4>, FunctionTypePointer> interfaceFunctions(bool _includeInheritedFunctions = true) const;
|
||||
std::vector<std::pair<util::FixedHash<4>, FunctionTypePointer>> const& interfaceFunctionList(bool _includeInheritedFunctions = true) const;
|
||||
/// @returns the EIP-165 compatible interface identifier. This will exclude inherited functions.
|
||||
uint64_t interfaceId() const;
|
||||
uint32_t interfaceId() const;
|
||||
|
||||
/// @returns a list of all declarations in this contract
|
||||
std::vector<Declaration const*> declarations() const { return filteredNodes<Declaration>(m_subNodes); }
|
||||
@@ -1936,7 +1936,13 @@ public:
|
||||
void accept(ASTConstVisitor& _visitor) const override;
|
||||
|
||||
Expression const& expression() const { return *m_expression; }
|
||||
/// @returns the given arguments in the order they were written.
|
||||
std::vector<ASTPointer<Expression const>> arguments() const { return {m_arguments.begin(), m_arguments.end()}; }
|
||||
/// @returns the given arguments sorted by how the called function takes them.
|
||||
std::vector<ASTPointer<Expression const>> sortedArguments() const;
|
||||
/// @returns the list of given argument names if this is a named call,
|
||||
/// in the order they were written.
|
||||
/// If this is not a named call, this is empty.
|
||||
std::vector<ASTPointer<ASTString>> const& names() const { return m_names; }
|
||||
|
||||
FunctionCallAnnotation& annotation() const override;
|
||||
|
||||
@@ -3002,6 +3002,11 @@ TypePointers FunctionType::parameterTypes() const
|
||||
return TypePointers(m_parameterTypes.cbegin() + 1, m_parameterTypes.cend());
|
||||
}
|
||||
|
||||
TypePointers const& FunctionType::parameterTypesIncludingSelf() const
|
||||
{
|
||||
return m_parameterTypes;
|
||||
}
|
||||
|
||||
string FunctionType::richIdentifier() const
|
||||
{
|
||||
string id = "t_function_";
|
||||
@@ -3247,8 +3252,7 @@ vector<tuple<string, TypePointer>> FunctionType::makeStackItems() const
|
||||
if (m_saltSet)
|
||||
slots.emplace_back("salt", TypeProvider::fixedBytes(32));
|
||||
if (bound())
|
||||
for (auto const& [boundName, boundType]: m_parameterTypes.front()->stackItems())
|
||||
slots.emplace_back("self_" + boundName, boundType);
|
||||
slots.emplace_back("self", m_parameterTypes.front());
|
||||
return slots;
|
||||
}
|
||||
|
||||
|
||||
@@ -1239,6 +1239,7 @@ public:
|
||||
static FunctionTypePointer newExpressionType(ContractDefinition const& _contract);
|
||||
|
||||
TypePointers parameterTypes() const;
|
||||
TypePointers const& parameterTypesIncludingSelf() const;
|
||||
std::vector<std::string> parameterNames() const;
|
||||
TypePointers const& returnParameterTypes() const { return m_returnParameterTypes; }
|
||||
/// @returns the list of return parameter types. All dynamically-sized types (this excludes
|
||||
|
||||
Reference in New Issue
Block a user