namespace GL {
namespace SL {
-class InlineableFunctionLocator: public StageVisitor
+class InlineableFunctionLocator: public 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) { visit(s.content); return inlineable; }
+
+ using TraversingVisitor::visit;
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
};
-class FunctionInliner: public StageVisitor
+class FunctionInliner: public TraversingVisitor
{
private:
std::set<FunctionDeclaration *> inlineable;
FunctionInliner();
FunctionInliner(const std::set<FunctionDeclaration *> &);
+ void apply(Stage &s) { visit(s.content); }
+
private:
void visit_and_inline(RefPtr<Expression> &);
public:
- using StageVisitor::visit;
+ using TraversingVisitor::visit;
virtual void visit(Block &);
virtual void visit(UnaryExpression &);
virtual void visit(BinaryExpression &);
public:
ConstantConditionEliminator();
- using StageVisitor::visit;
+ void apply(Stage &s) { visit(s.content); }
+
+ using BlockModifier::visit;
virtual void visit(Block &);
virtual void visit(UnaryExpression &);
virtual void visit(Assignment &);
virtual void visit(Iteration &);
};
-class UnusedVariableLocator: public StageVisitor
+class UnusedVariableLocator: public TraversingVisitor
{
-public:
- typedef std::set<Node *> ResultType;
-
private:
struct VariableInfo
{
public:
UnusedVariableLocator();
- virtual void apply(Stage &);
- const ResultType &get_result() const { return unused_nodes; }
-private:
- using StageVisitor::visit;
+ const std::set<Node *> &apply(Stage &);
+
+ using TraversingVisitor::visit;
virtual void visit(VariableReference &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
+private:
void record_assignment(VariableDeclaration &, Node &, bool);
void clear_assignments(VariableInfo &, bool);
+public:
virtual void visit(ExpressionStatement &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
virtual void visit(InterfaceBlock &);
virtual void visit(FunctionDeclaration &);
+private:
void merge_down_variables();
+public:
virtual void visit(Conditional &);
virtual void visit(Iteration &);
};
-class UnusedFunctionLocator: public StageVisitor
+class UnusedFunctionLocator: public 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;
+ const std::set<Node *> &apply(Stage &s) { visit(s.content); return unused_nodes; }
+
+ using TraversingVisitor::visit;
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
};