X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=e43b3a2d45c0e1c272976de51abd6c643cff0054;hb=f02daac8305327d403e947e23c4f2d231eced417;hp=8c4034d4e906baae7812ee66ecc1b84abff39448;hpb=00be85f53c5bec0be00a7ed6271e1f5a38e0b534;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 8c4034d4..e43b3a2d 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -60,6 +60,7 @@ private: virtual void visit(ProgramSyntax::Conditional &); virtual void visit(ProgramSyntax::Iteration &); virtual void visit(ProgramSyntax::Return &); + virtual void visit(ProgramSyntax::Jump &); }; template @@ -179,6 +180,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;