mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #8984 from ethereum/sol-yul-refactor-internal-dispatch-for-multislot-arguments
[Sol->Yul] Internal dispatch for multislot arguments
This commit is contained in:
commit
d1512223d2
@ -153,7 +153,7 @@ string IRGenerationContext::internalDispatch(size_t _in, size_t _out)
|
|||||||
for (auto const& contract: mostDerivedContract().annotation().linearizedBaseContracts)
|
for (auto const& contract: mostDerivedContract().annotation().linearizedBaseContracts)
|
||||||
for (FunctionDefinition const* function: contract->definedFunctions())
|
for (FunctionDefinition const* function: contract->definedFunctions())
|
||||||
if (
|
if (
|
||||||
FunctionType const* functionType = TypeProvider::function(*function)->asCallableFunction(false);
|
FunctionType const* functionType = TypeProvider::function(*function, FunctionType::Kind::Internal);
|
||||||
!function->isConstructor() &&
|
!function->isConstructor() &&
|
||||||
TupleType(functionType->parameterTypes()).sizeOnStack() == _in &&
|
TupleType(functionType->parameterTypes()).sizeOnStack() == _in &&
|
||||||
TupleType(functionType->returnParameterTypes()).sizeOnStack() == _out
|
TupleType(functionType->returnParameterTypes()).sizeOnStack() == _out
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
contract C {
|
||||||
|
function m(
|
||||||
|
function() external returns (uint) a,
|
||||||
|
function() external returns (uint) b
|
||||||
|
) internal returns (function() external returns (uint)) {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function s(uint a, uint b) internal returns (uint) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function foo() external returns (uint) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test() public returns (uint) {
|
||||||
|
function(uint, uint) internal returns (uint) single_slot_function = s;
|
||||||
|
|
||||||
|
function(
|
||||||
|
function() external returns (uint),
|
||||||
|
function() external returns (uint)
|
||||||
|
) internal returns (function() external returns (uint)) multi_slot_function = m;
|
||||||
|
|
||||||
|
return multi_slot_function(this.foo, this.foo)() + single_slot_function(5, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// test() -> 12
|
Loading…
Reference in New Issue
Block a user