X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=46c37930d6d4e948299f6ef43b637746dc3e4256;hb=3b159edbe4e80a2bc19c4c2fcd42cb996b9fbfe0;hp=8c4034d4e906baae7812ee66ecc1b84abff39448;hpb=00be85f53c5bec0be00a7ed6271e1f5a38e0b534;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 8c4034d4..46c37930 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -179,6 +179,38 @@ private: virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; } }; + struct InlineableFunctionLocator: Visitor + { + typedef std::set ResultType; + + std::map refcounts; + std::set inlineable; + ProgramSyntax::FunctionDeclaration *in_function; + + InlineableFunctionLocator(); + + const ResultType &get_result() const { return inlineable; } + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + + struct FunctionInliner: Visitor + { + std::set inlineable; + unsigned extract_result; + RefPtr inline_result; + + FunctionInliner(); + FunctionInliner(const std::set &); + + void visit_and_inline(RefPtr &); + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::Return &); + }; + struct ExpressionEvaluator: ProgramSyntax::NodeVisitor { typedef std::map ValueMap;