diff --git a/modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h b/modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h index aee13c498c..35dbce2155 100644 --- a/modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h +++ b/modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h @@ -985,10 +985,16 @@ private: //============================================================================== struct Statement : public AllocatedObject { + struct Visitor + { + virtual ~Visitor() {} + virtual void operator()(StatementPtr) = 0; + }; + Statement (const CodeLocation& l, BlockPtr parent) noexcept : location (l), parentBlock (parent) {} virtual void emit (CodeGenerator&, Type, int /*stackDepth*/) const {} virtual bool alwaysReturns() const { return false; } - virtual void visitSubStatements (std::function) const {} + virtual void visitSubStatements (Visitor&) const {} virtual Statement* simplify (SyntaxTreeBuilder&) { return this; } CodeLocation location; @@ -1077,15 +1083,25 @@ private: static int countMaxNumLocalVariables (StatementPtr s) noexcept { - int num = 0; + struct Counter : Statement::Visitor + { + void operator() (StatementPtr sub) override + { + num = jmax (num, countMaxNumLocalVariables (sub)); + } + + int num = 0; + }; + + Counter counter; if (s != nullptr) - s->visitSubStatements ([&] (StatementPtr sub) { num = jmax (num, countMaxNumLocalVariables (sub)); }); + s->visitSubStatements (counter); if (auto block = dynamic_cast (s)) - num += block->variables.size(); + counter.num += block->variables.size(); - return num; + return counter.num; } }; @@ -1109,7 +1125,7 @@ private: return ! statements.isEmpty() && statements.getLast()->alwaysReturns(); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { for (auto s : statements) visit (s); @@ -1234,7 +1250,7 @@ private: return trueBranch->alwaysReturns() && falseBranch != nullptr && falseBranch->alwaysReturns(); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (condition); visit (trueBranch); visit (falseBranch); } @@ -1282,7 +1298,7 @@ private: return type; } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (condition); visit (trueBranch); visit (falseBranch); } @@ -1340,7 +1356,7 @@ private: cg.continueTarget = oldContinueTarget; } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (condition); visit (initialiser); visit (iterator); visit (body); } @@ -1374,7 +1390,7 @@ private: bool alwaysReturns() const override { return true; } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (returnValue); } @@ -1508,7 +1524,7 @@ private: return Type::int_; } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (source); } @@ -1627,7 +1643,7 @@ private: return getResultType (lhs->getType (cg), rhs->getType (cg)); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (lhs); visit (rhs); } @@ -1748,7 +1764,7 @@ private: return parentBlock->getVariableType (target, location); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (newValue); } @@ -1896,7 +1912,7 @@ private: location.throwError ("Cannot find matching function: " + desc.quoted()); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { for (auto& arg : arguments) visit (arg); @@ -1915,7 +1931,7 @@ private: location.throwError ("Arrays are not implemented yet!"); } - void visitSubStatements (std::function visit) const override + void visitSubStatements (Statement::Visitor& visit) const override { visit (object); visit (index); }