mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #8431 from mijovic/sol2YulSelectorAddress
Adding sol->yul for f.selector and f.address
This commit is contained in:
commit
e58a1de57f
@ -2924,7 +2924,10 @@ vector<tuple<string, TypePointer>> FunctionType::makeStackItems() const
|
|||||||
{
|
{
|
||||||
case Kind::External:
|
case Kind::External:
|
||||||
case Kind::DelegateCall:
|
case Kind::DelegateCall:
|
||||||
slots = {make_tuple("address", TypeProvider::address()), make_tuple("functionIdentifier", TypeProvider::fixedBytes(4))};
|
slots = {
|
||||||
|
make_tuple("address", TypeProvider::address()),
|
||||||
|
make_tuple("functionIdentifier", TypeProvider::uint(32))
|
||||||
|
};
|
||||||
break;
|
break;
|
||||||
case Kind::BareCall:
|
case Kind::BareCall:
|
||||||
case Kind::BareCallCode:
|
case Kind::BareCallCode:
|
||||||
|
@ -800,11 +800,19 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
|
|||||||
case Type::Category::Function:
|
case Type::Category::Function:
|
||||||
if (member == "selector")
|
if (member == "selector")
|
||||||
{
|
{
|
||||||
solUnimplementedAssert(false, "");
|
solUnimplementedAssert(
|
||||||
|
dynamic_cast<FunctionType const&>(*_memberAccess.expression().annotation().type).kind() ==
|
||||||
|
FunctionType::Kind::External, ""
|
||||||
|
);
|
||||||
|
define(IRVariable{_memberAccess}, IRVariable(_memberAccess.expression()).part("functionIdentifier"));
|
||||||
}
|
}
|
||||||
else if (member == "address")
|
else if (member == "address")
|
||||||
{
|
{
|
||||||
solUnimplementedAssert(false, "");
|
solUnimplementedAssert(
|
||||||
|
dynamic_cast<FunctionType const&>(*_memberAccess.expression().annotation().type).kind() ==
|
||||||
|
FunctionType::Kind::External, ""
|
||||||
|
);
|
||||||
|
define(IRVariable{_memberAccess}, IRVariable(_memberAccess.expression()).part("address"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
solAssert(
|
solAssert(
|
||||||
|
17
test/libsolidity/semanticTests/viaYul/function_address.sol
Normal file
17
test/libsolidity/semanticTests/viaYul/function_address.sol
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
contract C {
|
||||||
|
function f() external returns (address) {
|
||||||
|
return this.f.address;
|
||||||
|
}
|
||||||
|
function g() external returns (bool) {
|
||||||
|
return this.f.address == address(this);
|
||||||
|
}
|
||||||
|
function h(function() external a) public returns (address) {
|
||||||
|
return a.address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f() -> 0x0fdd67305928fcac8d213d1e47bfa6165cd0b87b
|
||||||
|
// g() -> true
|
||||||
|
// h(function): left(0x1122334400112233445566778899AABBCCDDEEFF42424242) -> 0x1122334400112233445566778899AABBCCDDEEFF
|
13
test/libsolidity/semanticTests/viaYul/function_selector.sol
Normal file
13
test/libsolidity/semanticTests/viaYul/function_selector.sol
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
contract C {
|
||||||
|
function f() external returns (bytes4) {
|
||||||
|
return this.f.selector;
|
||||||
|
}
|
||||||
|
function h(function() external a) public returns (bytes4) {
|
||||||
|
return a.selector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f() -> left(0x26121ff0)
|
||||||
|
// h(function): left(0x1122334400112233445566778899AABBCCDDEEFF42424242) -> left(0x42424242)
|
Loading…
Reference in New Issue
Block a user