Ensure that non-sequence single-statement conditional blocks and loop bodies get unfolding of short-circuiting operators.
TRAC #11866
Signed-off-by: Daniel Koch
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/trunk@1060 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index fcc2344..69634f0 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -1172,12 +1172,7 @@
{
outputLineDirective((*sit)->getLine());
- if (isSingleStatement(*sit))
- {
- mUnfoldSelect->traverse(*sit);
- }
-
- (*sit)->traverse(this);
+ traverseStatements(*sit);
out << ";\n";
}
@@ -1601,11 +1596,11 @@
if (node->getTrueBlock())
{
- node->getTrueBlock()->traverse(this);
+ traverseStatements(node->getTrueBlock());
}
outputLineDirective(node->getLine());
- out << ";}\n";
+ out << ";\n}\n";
if (node->getFalseBlock())
{
@@ -1615,10 +1610,10 @@
out << "{\n";
outputLineDirective(node->getFalseBlock()->getLine());
- node->getFalseBlock()->traverse(this);
+ traverseStatements(node->getFalseBlock());
outputLineDirective(node->getFalseBlock()->getLine());
- out << ";}\n";
+ out << ";\n}\n";
}
}
@@ -1677,7 +1672,7 @@
if (node->getBody())
{
- node->getBody()->traverse(this);
+ traverseStatements(node->getBody());
}
outputLineDirective(node->getLine());
@@ -1733,6 +1728,16 @@
return true;
}
+void OutputHLSL::traverseStatements(TIntermNode *node)
+{
+ if (isSingleStatement(node))
+ {
+ mUnfoldSelect->traverse(node);
+ }
+
+ node->traverse(this);
+}
+
bool OutputHLSL::isSingleStatement(TIntermNode *node)
{
TIntermAggregate *aggregate = node->getAsAggregate();