namespace SL {
/** Finds functions which are candidates for inlining. Currently this means
-functions which have no parameters, are only called once, and that call occurs
-after the definition of the function. */
+functions which have no parameters and are only called once. */
class InlineableFunctionLocator: private TraversingVisitor
{
private:
virtual void visit(FunctionDeclaration &);
};
+/** Collects declarations referenced by a function. */
+class InlineDependencyCollector: private TraversingVisitor
+{
+private:
+ std::set<Node *> dependencies;
+
+public:
+ const std::set<Node *> &apply(FunctionDeclaration &f) { f.visit(*this); return dependencies; }
+
+private:
+ virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(VariableDeclaration &);
+};
+
/** Inlines functions. Internally uses InlineableFunctionLocator to find
candidate functions. Only functions which consist of a single return statement
are inlined. */
class FunctionInliner: private TraversingVisitor
{
private:
+ Stage *stage;
std::set<FunctionDeclaration *> inlineable;
+ FunctionDeclaration *current_function;
unsigned extract_result;
RefPtr<Expression> inline_result;
+ bool any_inlined;
public:
FunctionInliner();
- void apply(Stage &);
+ bool apply(Stage &);
private:
void visit_and_inline(RefPtr<Expression> &);
virtual void visit(MemberAccess &);
virtual void visit(FunctionCall &);
virtual void visit(VariableDeclaration &);
+ virtual void visit(FunctionDeclaration &);
virtual void visit(Return &);
};