X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.cpp;h=0559d41e4023fedcf4d485e18049c48b21f798b4;hp=a3691b112fd4fc22d8121f04c4d37024037f8470;hb=4e4a3514961d130045619ea74d0bbab71580838c;hpb=20af6dd2f04caa224d8cae00befc97d010a1ed08 diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index a3691b11..0559d41e 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -8,6 +8,8 @@ #include "resources.h" #include "shader.h" +#undef interface + using namespace std; namespace { @@ -543,14 +545,40 @@ void ProgramCompiler::Formatter::visit(Conditional &cond) void ProgramCompiler::Formatter::visit(Iteration &iter) { - formatted += "for("; - iter.init_statement->visit(*this); - formatted += ' '; - iter.condition->visit(*this); - formatted += "; "; - iter.loop_expression->visit(*this); - formatted += ")\n"; - iter.body.visit(*this); + if(!iter.init_statement && iter.condition && !iter.loop_expression) + { + formatted += "while("; + iter.condition->visit(*this); + formatted += ')'; + } + else + { + formatted += "for("; + if(iter.init_statement) + iter.init_statement->visit(*this); + else + formatted += ';'; + if(iter.condition) + { + formatted += ' '; + iter.condition->visit(*this); + } + formatted += ';'; + if(iter.loop_expression) + { + formatted += ' '; + iter.loop_expression->visit(*this); + } + formatted += ')'; + } + + if(iter.body.body.empty()) + formatted += " { }"; + else + { + formatted += '\n'; + iter.body.visit(*this); + } } void ProgramCompiler::Formatter::visit(Return &ret) @@ -1197,6 +1225,13 @@ void ProgramCompiler::FunctionInliner::visit(FunctionCall &call) inline_result = 0; } +void ProgramCompiler::FunctionInliner::visit(VariableDeclaration &var) +{ + if(var.init_expression) + visit_and_inline(var.init_expression); + inline_result = 0; +} + void ProgramCompiler::FunctionInliner::visit(Return &ret) { TraversingVisitor::visit(ret); @@ -1648,6 +1683,13 @@ void ProgramCompiler::NodeRemover::visit(VariableDeclaration &var) var.init_expression = 0; } +void ProgramCompiler::NodeRemover::visit(Iteration &iter) +{ + if(to_remove.count(iter.init_statement.get())) + iter.init_statement = 0; + TraversingVisitor::visit(iter); +} + void ProgramCompiler::PrecisionRemover::visit(Precision &) {