mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Evaluate base arguments in derived to base order.
This commit is contained in:
parent
6fe3e0116c
commit
e97ca0a777
@ -437,17 +437,32 @@ pair<string, map<ContractDefinition const*, vector<string>>> IRGenerator::evalua
|
|||||||
ContractDefinition const& _contract
|
ContractDefinition const& _contract
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
struct InheritanceOrder
|
||||||
|
{
|
||||||
|
bool operator()(ContractDefinition const* _c1, ContractDefinition const* _c2) const
|
||||||
|
{
|
||||||
|
solAssert(contains(linearizedBaseContracts, _c1) && contains(linearizedBaseContracts, _c2), "");
|
||||||
|
auto it1 = find(linearizedBaseContracts.begin(), linearizedBaseContracts.end(), _c1);
|
||||||
|
auto it2 = find(linearizedBaseContracts.begin(), linearizedBaseContracts.end(), _c2);
|
||||||
|
return it1 < it2;
|
||||||
|
}
|
||||||
|
vector<ContractDefinition const*> const& linearizedBaseContracts;
|
||||||
|
} inheritanceOrder{_contract.annotation().linearizedBaseContracts};
|
||||||
|
|
||||||
map<ContractDefinition const*, vector<string>> constructorParams;
|
map<ContractDefinition const*, vector<string>> constructorParams;
|
||||||
vector<pair<ContractDefinition const*, std::vector<ASTPointer<Expression>>const *>> baseConstructorArguments;
|
|
||||||
|
map<ContractDefinition const*, std::vector<ASTPointer<Expression>>const *, InheritanceOrder>
|
||||||
|
baseConstructorArguments(inheritanceOrder);
|
||||||
|
;
|
||||||
|
|
||||||
for (ASTPointer<InheritanceSpecifier> const& base: _contract.baseContracts())
|
for (ASTPointer<InheritanceSpecifier> const& base: _contract.baseContracts())
|
||||||
if (FunctionDefinition const* baseConstructor = dynamic_cast<ContractDefinition const*>(
|
if (FunctionDefinition const* baseConstructor = dynamic_cast<ContractDefinition const*>(
|
||||||
base->name().annotation().referencedDeclaration
|
base->name().annotation().referencedDeclaration
|
||||||
)->constructor(); baseConstructor && base->arguments())
|
)->constructor(); baseConstructor && base->arguments())
|
||||||
baseConstructorArguments.emplace_back(
|
solAssert(baseConstructorArguments.emplace(
|
||||||
dynamic_cast<ContractDefinition const*>(baseConstructor->scope()),
|
dynamic_cast<ContractDefinition const*>(baseConstructor->scope()),
|
||||||
base->arguments()
|
base->arguments()
|
||||||
);
|
).second, "");
|
||||||
|
|
||||||
if (FunctionDefinition const* constructor = _contract.constructor())
|
if (FunctionDefinition const* constructor = _contract.constructor())
|
||||||
for (ASTPointer<ModifierInvocation> const& modifier: constructor->modifiers())
|
for (ASTPointer<ModifierInvocation> const& modifier: constructor->modifiers())
|
||||||
@ -458,10 +473,10 @@ pair<string, map<ContractDefinition const*, vector<string>>> IRGenerator::evalua
|
|||||||
FunctionDefinition const* baseConstructor = baseContract->constructor();
|
FunctionDefinition const* baseConstructor = baseContract->constructor();
|
||||||
baseConstructor && modifier->arguments()
|
baseConstructor && modifier->arguments()
|
||||||
)
|
)
|
||||||
baseConstructorArguments.emplace_back(
|
solAssert(baseConstructorArguments.emplace(
|
||||||
dynamic_cast<ContractDefinition const*>(baseConstructor->scope()),
|
dynamic_cast<ContractDefinition const*>(baseConstructor->scope()),
|
||||||
modifier->arguments()
|
modifier->arguments()
|
||||||
);
|
).second, "");
|
||||||
|
|
||||||
IRGeneratorForStatements generator{m_context, m_utils};
|
IRGeneratorForStatements generator{m_context, m_utils};
|
||||||
for (auto&& [baseContract, arguments]: baseConstructorArguments)
|
for (auto&& [baseContract, arguments]: baseConstructorArguments)
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
contract A {
|
||||||
|
constructor(uint) {}
|
||||||
|
}
|
||||||
|
contract B {
|
||||||
|
constructor(uint) {}
|
||||||
|
}
|
||||||
|
contract C {
|
||||||
|
constructor(uint) {}
|
||||||
|
}
|
||||||
|
contract D {
|
||||||
|
constructor(uint) {}
|
||||||
|
}
|
||||||
|
contract X is D, C, B, A {
|
||||||
|
uint[] x;
|
||||||
|
function f(uint _x) internal returns (uint) {
|
||||||
|
x.push(_x);
|
||||||
|
}
|
||||||
|
function g() public view returns (uint[] memory) { return x; }
|
||||||
|
constructor() A(f(1)) C(f(2)) B(f(3)) D(f(4)) {}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// g() -> 0x20, 4, 1, 3, 2, 4
|
Loading…
Reference in New Issue
Block a user