6666
6767#include < libsolidity/interface/OptimiserSettings.h>
6868
69+ #include < range/v3/view/enumerate.hpp>
70+
6971#include < random>
7072
7173using namespace solidity ;
@@ -81,15 +83,6 @@ YulOptimizerTestCommon::YulOptimizerTestCommon(std::shared_ptr<Object const> _ob
8183{
8284 soltestAssert (m_object && m_optimizedObject);
8385
84- if (
85- std::any_of (
86- m_object->subObjects .begin (),
87- m_object->subObjects .end (),
88- [](auto const & subObject) { return dynamic_cast <Data*>(subObject.get ()) == nullptr ;}
89- )
90- )
91- solUnimplemented (" The current implementation of YulOptimizerTests ignores subobjects that are not Data." );
92-
9386 m_namedSteps = {
9487 {" disambiguator" , [&]() { return disambiguate (); }},
9588 {" nameDisplacer" , [&]() {
@@ -496,8 +489,19 @@ void YulOptimizerTestCommon::setStep(std::string const& _optimizerStep)
496489
497490bool YulOptimizerTestCommon::runStep ()
498491{
499- if (m_namedSteps.count (m_optimizerStep))
492+ if (m_namedSteps.contains (m_optimizerStep))
500493 {
494+ for (auto const & [ix, subNode]: m_object->subObjects | ranges::views::enumerate)
495+ if (auto const subObject = std::dynamic_pointer_cast<Object const >(subNode))
496+ {
497+ YulOptimizerTestCommon subTest (subObject);
498+ subTest.setStep (m_optimizerStep);
499+ subTest.run ();
500+ auto const optimizedSubObject = std::dynamic_pointer_cast<Object>(m_optimizedObject->subObjects [ix]);
501+ yulAssert (optimizedSubObject);
502+ optimizedSubObject->setCode (subTest.m_optimizedObject ->code ());
503+ }
504+
501505 auto block = m_namedSteps[m_optimizerStep]();
502506 m_optimizedObject->setCode (std::make_shared<AST>(*m_object->dialect (), std::move (block)));
503507 }
0 commit comments