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 (FunctionDefinition const* function: contract->definedFunctions())
|
||||
if (
|
||||
FunctionType const* functionType = TypeProvider::function(*function)->asCallableFunction(false);
|
||||
FunctionType const* functionType = TypeProvider::function(*function, FunctionType::Kind::Internal);
|
||||
!function->isConstructor() &&
|
||||
TupleType(functionType->parameterTypes()).sizeOnStack() == _in &&
|
||||
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