X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.cpp;h=3cb8611c0192be3d08d67798aa9c1c0d6407f09a;hp=937639a49157bf6f73cda381d306585e1c05b482;hb=acec85413f86c58ff262fbc26c2c1aa8726b5c58;hpb=859015dce969a0d9ba2bc603d6dbb2685159e393 diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index 937639a4..3cb8611c 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -647,11 +647,44 @@ void ProgramCompiler::FunctionResolver::visit(FunctionDeclaration &func) } -ProgramCompiler::InterfaceGenerator::InterfaceGenerator(): - scope_level(0), +ProgramCompiler::BlockModifier::BlockModifier(): remove_node(false) { } +void ProgramCompiler::BlockModifier::flatten_block(Block &block) +{ + for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) + insert_nodes.push_back((*i)->clone()); + remove_node = true; +} + +void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list >::iterator &i) +{ + for(list::iterator j=insert_nodes.begin(); j!=insert_nodes.end(); ++j) + block.body.insert(i, *j); + insert_nodes.clear(); + + if(remove_node) + block.body.erase(i++); + else + ++i; + remove_node = false; +} + +void ProgramCompiler::BlockModifier::visit(Block &block) +{ + for(list >::iterator i=block.body.begin(); i!=block.body.end(); ) + { + (*i)->visit(*this); + apply_and_increment(block, i); + } +} + + +ProgramCompiler::InterfaceGenerator::InterfaceGenerator(): + scope_level(0) +{ } + string ProgramCompiler::InterfaceGenerator::get_out_prefix(StageType type) { if(type==VERTEX) @@ -688,15 +721,7 @@ void ProgramCompiler::InterfaceGenerator::visit(Block &block) iface_declarations.clear(); } - for(list::iterator j=insert_nodes.begin(); j!=insert_nodes.end(); ++j) - block.body.insert(i, *j); - insert_nodes.clear(); - - if(remove_node) - block.body.erase(i++); - else - ++i; - remove_node = false; + apply_and_increment(block, i); } } @@ -959,30 +984,13 @@ void ProgramCompiler::ExpressionEvaluator::visit(BinaryExpression &binary) ProgramCompiler::ConstantConditionEliminator::ConstantConditionEliminator(): - scope_level(0), - remove_node(false), - replacement_block(0) + scope_level(0) { } void ProgramCompiler::ConstantConditionEliminator::visit(Block &block) { SetForScope set(scope_level, scope_level+1); - for(list >::iterator i=block.body.begin(); i!=block.body.end(); ) - { - (*i)->visit(*this); - if(replacement_block) - { - for(list >::iterator j=replacement_block->body.begin(); j!=replacement_block->body.end(); ++j) - block.body.insert(i, *j); - replacement_block = 0; - } - - if(remove_node) - block.body.erase(i++); - else - ++i; - remove_node = false; - } + BlockModifier::visit(block); for(map::const_iterator i=block.variables.begin(); i!=block.variables.end(); ++i) variable_values.erase(i->second); @@ -1004,10 +1012,7 @@ void ProgramCompiler::ConstantConditionEliminator::visit(Conditional &cond) ExpressionEvaluator eval(variable_values); cond.condition->visit(eval); if(eval.result_valid) - { - remove_node = true; - replacement_block = (eval.result ? &cond.body : &cond.else_body); - } + flatten_block(eval.result ? cond.body : cond.else_body); else TraversingVisitor::visit(cond); }