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:
|
case Type::Category::Function:
|
||||||
if (member == "selector")
|
if (member == "selector")
|
||||||
{
|
{
|
||||||
solUnimplementedAssert(
|
FunctionType const& functionType = dynamic_cast<FunctionType const&>(
|
||||||
dynamic_cast<FunctionType const&>(*_memberAccess.expression().annotation().type).kind() ==
|
*_memberAccess.expression().annotation().type
|
||||||
FunctionType::Kind::External, ""
|
|
||||||
);
|
);
|
||||||
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")
|
else if (member == "address")
|
||||||
{
|
{
|
||||||
@ -973,6 +980,16 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
|
|||||||
solAssert(false, "Illegal fixed bytes member.");
|
solAssert(false, "Illegal fixed bytes member.");
|
||||||
break;
|
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:
|
default:
|
||||||
solAssert(false, "Member access to unknown type.");
|
solAssert(false, "Member access to unknown type.");
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,8 @@ contract C {
|
|||||||
return this.x.selector;
|
return this.x.selector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
// ----
|
// ----
|
||||||
// f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
// f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
||||||
// g() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
// g() -> 0x26121ff000000000000000000000000000000000000000000000000000000000
|
||||||
|
@ -15,6 +15,8 @@ contract C {
|
|||||||
return (a.f.selector, a.g.selector, b.f.selector, b.g.selector);
|
return (a.f.selector, a.g.selector, b.f.selector, b.g.selector);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
// ----
|
// ----
|
||||||
// test1() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a)
|
// test1() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a)
|
||||||
// test2() -> 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