namespace GL {
namespace SL {
-class InlineableFunctionLocator: public StageVisitor
+class InlineableFunctionLocator: private TraversingVisitor
{
-public:
- typedef std::set<FunctionDeclaration *> ResultType;
-
private:
std::map<FunctionDeclaration *, unsigned> refcounts;
std::set<FunctionDeclaration *> inlineable;
public:
InlineableFunctionLocator();
- const ResultType &get_result() const { return inlineable; }
- using StageVisitor::visit;
+ const std::set<FunctionDeclaration *> &apply(Stage &s) { s.content.visit(*this); return inlineable; }
+
+private:
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
};
-class FunctionInliner: public StageVisitor
+class FunctionInliner: private TraversingVisitor
{
private:
std::set<FunctionDeclaration *> inlineable;
public:
FunctionInliner();
- FunctionInliner(const std::set<FunctionDeclaration *> &);
+
+ void apply(Stage &);
private:
void visit_and_inline(RefPtr<Expression> &);
-public:
- using StageVisitor::visit;
+
virtual void visit(Block &);
virtual void visit(UnaryExpression &);
virtual void visit(BinaryExpression &);
virtual void visit(Return &);
};
-class ConstantConditionEliminator: public BlockModifier
+class ConstantConditionEliminator: private TraversingVisitor
{
private:
- unsigned scope_level;
bool record_only;
ExpressionEvaluator::ValueMap variable_values;
+ NodeList<Statement>::iterator insert_point;
+ std::set<Node *> nodes_to_remove;
public:
ConstantConditionEliminator();
- using StageVisitor::visit;
+ void apply(Stage &);
+
+private:
virtual void visit(Block &);
virtual void visit(UnaryExpression &);
virtual void visit(Assignment &);
virtual void visit(Iteration &);
};
-class UnusedVariableLocator: public StageVisitor
+class UnusedVariableRemover: private TraversingVisitor
{
-public:
- typedef std::set<Node *> ResultType;
-
private:
struct VariableInfo
{
Assignment *assignment;
bool assignment_target;
bool assign_to_subscript;
- bool global_scope;
public:
- UnusedVariableLocator();
+ UnusedVariableRemover();
+
+ bool apply(Stage &);
- virtual void apply(Stage &);
- const ResultType &get_result() const { return unused_nodes; }
private:
- using StageVisitor::visit;
virtual void visit(VariableReference &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(Iteration &);
};
-class UnusedFunctionLocator: public StageVisitor
+class UnusedFunctionRemover: private TraversingVisitor
{
-public:
- typedef std::set<Node *> ResultType;
-
private:
std::set<Node *> unused_nodes;
std::set<FunctionDeclaration *> used_definitions;
public:
- const ResultType &get_result() const { return unused_nodes; }
- using StageVisitor::visit;
+ bool apply(Stage &s);
+
+private:
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
};