MCPcopy Create free account
hub / github.com/argotorg/solidity / generateModifier

Method generateModifier

libsolidity/codegen/ir/IRGenerator.cpp:417–511  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

415}
416
417std::string IRGenerator::generateModifier(
418 ModifierInvocation const& _modifierInvocation,
419 FunctionDefinition const& _function,
420 std::string const& _nextFunction
421)
422{
423 std::string functionName = IRNames::modifierInvocation(_modifierInvocation);
424 return m_context.functionCollector().createFunction(functionName, [&]() {
425 m_context.resetLocalVariables();
426 Whiskers t(R"(
427 <astIDComment><sourceLocationComment>
428 function <functionName>(<params>)<?+retParams> -> <retParams></+retParams> {
429 <assignRetParams>
430 <evalArgs>
431 <body>
432 }
433 <contractSourceLocationComment>
434 )");
435
436 t("functionName", functionName);
437 std::vector<std::string> retParamsIn;
438 for (auto const& varDecl: _function.returnParameters())
439 retParamsIn += m_context.addLocalVariable(*varDecl).stackSlots();
440 std::vector<std::string> params = retParamsIn;
441 for (auto const& varDecl: _function.parameters())
442 params += m_context.addLocalVariable(*varDecl).stackSlots();
443 t("params", joinHumanReadable(params));
444 std::vector<std::string> retParams;
445 std::string assignRetParams;
446 for (size_t i = 0; i < retParamsIn.size(); ++i)
447 {
448 retParams.emplace_back(m_context.newYulVariable());
449 assignRetParams += retParams.at(i) + " := " + retParamsIn.at(i) + "\n";
450 }
451 t("retParams", joinHumanReadable(retParams));
452 t("assignRetParams", assignRetParams);
453
454 ModifierDefinition const* modifier = dynamic_cast<ModifierDefinition const*>(
455 _modifierInvocation.name().annotation().referencedDeclaration
456 );
457 solAssert(modifier, "");
458
459 if (m_context.debugInfoSelection().astID)
460 t("astIDComment", "/// @ast-id " + std::to_string(modifier->id()) + "\n");
461 else
462 t("astIDComment", "");
463 t("sourceLocationComment", dispenseLocationComment(*modifier));
464 t(
465 "contractSourceLocationComment",
466 dispenseLocationComment(m_context.mostDerivedContract())
467 );
468
469 switch (*_modifierInvocation.name().annotation().requiredLookup)
470 {
471 case VirtualLookup::Virtual:
472 modifier = &modifier->resolveVirtual(m_context.mostDerivedContract());
473 solAssert(modifier, "");
474 break;

Callers

nothing calls this directly

Calls 15

joinHumanReadableFunction · 0.85
dispenseLocationCommentFunction · 0.85
resetLocalVariablesMethod · 0.80
stackSlotsMethod · 0.80
addLocalVariableMethod · 0.80
parametersMethod · 0.80
newYulVariableMethod · 0.80
atMethod · 0.80
evaluateExpressionMethod · 0.80
renderMethod · 0.80
to_stringFunction · 0.50
createFunctionMethod · 0.45

Tested by

no test coverage detected