]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Some fixes to assignment management in UnusedVariableLocator
[libs/gl.git] / source / programcompiler.cpp
index 14c9d3d3ced42958e539e7ef27a6623f297e41cb..cc4b5efe3df0bfca482feb8d9ae3f46e46391d42 100644 (file)
@@ -1229,8 +1229,7 @@ void ProgramCompiler::UnusedVariableLocator::apply(Stage &s)
                if(!i->second.referenced)
                {
                        unused_nodes.insert(i->first);
-                       for(vector<Node *>::iterator j=i->second.assignments.begin(); j!=i->second.assignments.end(); ++j)
-                               unused_nodes.insert(*j);
+                       clear_assignments(i->second, true);
                }
        }
        variables.pop_back();
@@ -1282,11 +1281,21 @@ void ProgramCompiler::UnusedVariableLocator::record_assignment(VariableDeclarati
 {
        VariableInfo &var_info = variables.back()[&var];
        if(!self_ref)
-               var_info.assignments.clear();
+               clear_assignments(var_info, true);
        var_info.assignments.push_back(&node);
        var_info.conditionally_assigned = false;
 }
 
+void ProgramCompiler::UnusedVariableLocator::clear_assignments(VariableInfo &var_info, bool mark_unused)
+{
+       if(mark_unused)
+       {
+               for(vector<Node *>::iterator i=var_info.assignments.begin(); i!=var_info.assignments.end(); ++i)
+                       unused_nodes.insert(*i);
+       }
+       var_info.assignments.clear();
+}
+
 void ProgramCompiler::UnusedVariableLocator::visit(ExpressionStatement &expr)
 {
        assignment = 0;
@@ -1350,8 +1359,7 @@ void ProgramCompiler::UnusedVariableLocator::merge_down_variables()
                {
                        if(!i->second.referenced)
                                unused_nodes.insert(i->first);
-                       for(vector<Node *>::iterator j=i->second.assignments.begin(); j!=i->second.assignments.end(); ++j)
-                               unused_nodes.insert(*j);
+                       clear_assignments(i->second, true);
                        continue;
                }
 
@@ -1360,11 +1368,9 @@ void ProgramCompiler::UnusedVariableLocator::merge_down_variables()
                        parent_variables.insert(*i);
                else
                {
-                       if(!i->second.conditionally_assigned)
-                       {
-                               j->second.assignments.clear();
-                               j->second.conditionally_assigned = true;
-                       }
+                       if(i->second.referenced || !i->second.conditionally_assigned)
+                               clear_assignments(j->second, !i->second.referenced);
+                       j->second.conditionally_assigned = i->second.conditionally_assigned;
                        j->second.referenced |= i->second.referenced;
                        j->second.assignments.insert(j->second.assignments.end(), i->second.assignments.begin(), i->second.assignments.end());
                }