mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Yul codegen for .selector
.
This commit is contained in:
parent
0f7a5e8062
commit
f271dfa2e2
@ -842,11 +842,18 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
|
||||
case Type::Category::Function:
|
||||
if (member == "selector")
|
||||
{
|
||||
solUnimplementedAssert(
|
||||
dynamic_cast<FunctionType const&>(*_memberAccess.expression().annotation().type).kind() ==
|
||||
FunctionType::Kind::External, ""
|
||||
FunctionType const& functionType = dynamic_cast<FunctionType const&>(
|
||||
*_memberAccess.expression().annotation().type
|
||||
);
|
||||
define(IRVariable{_memberAccess}, IRVariable(_memberAccess.expression()).part("functionIdentifier"));
|
||||
if (functionType.kind() == FunctionType::Kind::External)
|
||||
define(IRVariable{_memberAccess}, IRVariable(_memberAccess.expression()).part("functionIdentifier"));
|
||||
else if (functionType.kind() == FunctionType::Kind::Declaration)
|
||||
{
|
||||
solAssert(functionType.hasDeclaration(), "");
|
||||
define(IRVariable{_memberAccess}) << formatNumber(functionType.externalIdentifier() << 224) << "\n";
|
||||
}
|
||||
else
|
||||
solAssert(false, "Invalid use of .selector");
|
||||
}
|
||||
else if (member == "address")
|
||||
{
|
||||
@ -973,6 +980,16 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
|
||||
solAssert(false, "Illegal fixed bytes member.");
|
||||
break;
|
||||
}
|
||||
case Type::Category::TypeType:
|
||||
{
|
||||
TypeType const& type = dynamic_cast<TypeType const&>(*_memberAccess.expression().annotation().type);
|
||||
solUnimplementedAssert(type.actualType()->category() == Type::Category::Contract, "");
|
||||
FunctionType const* funType = dynamic_cast<FunctionType const*>(_memberAccess.annotation().type);
|
||||
solUnimplementedAssert(funType, "");
|
||||
solUnimplementedAssert(funType->kind() == FunctionType::Kind::Declaration, "");
|
||||
// Nothing to do for declaration.
|
||||
break;
|
||||
}
|
||||
default:
|
||||
solAssert(false, "Member access to unknown type.");
|
||||
}
|
||||
|
@ -19,6 +19,8 @@ contract C {
|
||||
return this.x.selector;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
||||
// g() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
||||
|
@ -15,6 +15,8 @@ contract C {
|
||||
return (a.f.selector, a.g.selector, b.f.selector, b.g.selector);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// test1() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a)
|
||||
// test2() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a)
|
||||
|
Loading…
Reference in New Issue
Block a user