#include "resources.h"
#include "shader.h"
+#undef interface
+
using namespace std;
namespace {
void ProgramCompiler::Formatter::visit(Iteration &iter)
{
- formatted += "for(";
- if(iter.init_statement)
- iter.init_statement->visit(*this);
- else
- formatted += ';';
- if(iter.condition)
+ if(!iter.init_statement && iter.condition && !iter.loop_expression)
{
- formatted += ' ';
+ formatted += "while(";
iter.condition->visit(*this);
+ formatted += ')';
}
- formatted += ';';
- if(iter.loop_expression)
+ else
{
- formatted += ' ';
- iter.loop_expression->visit(*this);
+ 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);
}
- formatted += ')';
- iter.body.visit(*this);
}
void ProgramCompiler::Formatter::visit(Return &ret)
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);
aggregate(0),
assignment(0),
assignment_target(false),
+ assign_to_subscript(false),
global_scope(true)
{ }
{
if(binary.oper=="[")
{
+ if(assignment_target)
+ assign_to_subscript = true;
binary.left->visit(*this);
SetForScope<bool> set(assignment_target, false);
binary.right->visit(*this);
void ProgramCompiler::UnusedVariableLocator::visit(Assignment &assign)
{
{
+ assign_to_subscript = false;
SetForScope<bool> set(assignment_target, !assign.self_referencing);
assign.left->visit(*this);
}
assignment = &assign;
}
-void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &node, bool self_ref)
+void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclaration &var, Node &node, bool chained)
{
VariableInfo &var_info = variables.back()[&var];
- if(!self_ref)
+ if(!chained)
clear_assignments(var_info, true);
var_info.assignments.push_back(&node);
var_info.conditionally_assigned = false;
assignment = 0;
TraversingVisitor::visit(expr);
if(assignment && assignment->target_declaration)
- record_assignment(*assignment->target_declaration, expr, assignment->self_referencing);
+ record_assignment(*assignment->target_declaration, expr, (assignment->self_referencing || assign_to_subscript));
}
void ProgramCompiler::UnusedVariableLocator::visit(StructDeclaration &strct)
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 &)
{