Merge pull request #10756 from ethereum/fixModifierLookup

Fix modifier lookup
This commit is contained in:
chriseth 2021-01-14 11:28:26 +01:00 committed by GitHub
commit 45be47fc6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 9 deletions

View File

@ -338,14 +338,24 @@ string IRGenerator::generateModifier(
t("retParams", joinHumanReadable(retParams)); t("retParams", joinHumanReadable(retParams));
t("assignRetParams", assignRetParams); t("assignRetParams", assignRetParams);
solAssert(*_modifierInvocation.name().annotation().requiredLookup == VirtualLookup::Virtual, ""); ModifierDefinition const* modifier = dynamic_cast<ModifierDefinition const*>(
_modifierInvocation.name().annotation().referencedDeclaration
ModifierDefinition const& modifier = dynamic_cast<ModifierDefinition const&>( );
*_modifierInvocation.name().annotation().referencedDeclaration solAssert(modifier, "");
).resolveVirtual(m_context.mostDerivedContract()); switch (*_modifierInvocation.name().annotation().requiredLookup)
{
case VirtualLookup::Virtual:
modifier = &modifier->resolveVirtual(m_context.mostDerivedContract());
solAssert(modifier, "");
break;
case VirtualLookup::Static:
break;
case VirtualLookup::Super:
solAssert(false, "");
}
solAssert( solAssert(
modifier.parameters().empty() == modifier->parameters().empty() ==
(!_modifierInvocation.arguments() || _modifierInvocation.arguments()->empty()), (!_modifierInvocation.arguments() || _modifierInvocation.arguments()->empty()),
"" ""
); );
@ -355,10 +365,10 @@ string IRGenerator::generateModifier(
{ {
IRVariable argument = expressionEvaluator.evaluateExpression( IRVariable argument = expressionEvaluator.evaluateExpression(
*_modifierInvocation.arguments()->at(i), *_modifierInvocation.arguments()->at(i),
*modifier.parameters()[i]->annotation().type *modifier->parameters()[i]->annotation().type
); );
expressionEvaluator.define( expressionEvaluator.define(
m_context.addLocalVariable(*modifier.parameters()[i]), m_context.addLocalVariable(*modifier->parameters()[i]),
argument argument
); );
} }
@ -370,7 +380,7 @@ string IRGenerator::generateModifier(
(ret.empty() ? "" : ret + " := ") + (ret.empty() ? "" : ret + " := ") +
_nextFunction + "(" + joinHumanReadable(params) + ")\n"; _nextFunction + "(" + joinHumanReadable(params) + ")\n";
}); });
generator.generate(modifier.body()); generator.generate(modifier->body());
t("body", generator.code()); t("body", generator.code());
return t.render(); return t.render();
}); });

View File

@ -12,6 +12,8 @@ contract C is A {
return 10; return 10;
} }
} }
// ====
// compileViaYul: also
// ---- // ----
// x() -> 7 // x() -> 7
// f() -> 9 // f() -> 9

View File

@ -15,6 +15,8 @@ contract C {
r = 10; r = 10;
} }
} }
// ====
// compileViaYul: also
// ---- // ----
// x() -> 0x00 // x() -> 0x00
// f() -> 1, 9 // f() -> 1, 9