+ result_valid = false;
+}
+
+void ProgramCompiler::ExpressionEvaluator::visit(BinaryExpression &binary)
+{
+ result_valid = false;
+ binary.left->visit(*this);
+ if(!result_valid)
+ return;
+
+ float left_result = result;
+ result_valid = false;
+ binary.right->visit(*this);
+ if(!result_valid)
+ return;
+
+ if(binary.oper=="<")
+ result = (left_result<result);
+ else if(binary.oper=="<=")
+ result = (left_result<=result);
+ else if(binary.oper==">")
+ result = (left_result>result);
+ else if(binary.oper==">=")
+ result = (left_result>=result);
+ else if(binary.oper=="==")
+ result = (left_result==result);
+ else if(binary.oper=="!=")
+ result = (left_result!=result);
+ else if(binary.oper=="&&")
+ result = (left_result && result);
+ else if(binary.oper=="||")
+ result = (left_result || result);
+ else
+ result_valid = false;
+}
+
+
+ProgramCompiler::ConstantConditionEliminator::ConstantConditionEliminator():
+ scope_level(0),
+ remove_node(false),
+ replacement_block(0)
+{ }
+
+void ProgramCompiler::ConstantConditionEliminator::visit(Block &block)
+{
+ SetForScope<unsigned> set(scope_level, scope_level+1);
+ for(list<NodePtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
+ {
+ (*i)->visit(*this);
+ if(replacement_block)
+ {
+ for(list<NodePtr<Node> >::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;
+ }
+
+ for(map<string, VariableDeclaration *>::const_iterator i=block.variables.begin(); i!=block.variables.end(); ++i)
+ variable_values.erase(i->second);
+}
+
+void ProgramCompiler::ConstantConditionEliminator::visit(Assignment &assign)
+{
+ variable_values.erase(assign.target_declaration);
+}
+
+void ProgramCompiler::ConstantConditionEliminator::visit(VariableDeclaration &var)
+{
+ if(var.constant || scope_level>1)
+ variable_values[&var] = &*var.init_expression;
+}
+
+void ProgramCompiler::ConstantConditionEliminator::visit(Conditional &cond)
+{
+ ExpressionEvaluator eval(variable_values);
+ cond.condition->visit(eval);
+ if(eval.result_valid)