summaryrefslogtreecommitdiff
path: root/source/slang/stmt-defs.h
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-18 14:51:12 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-18 14:51:12 -0700
commit2476c035ec15d3ee22239ebd1fe10e6e8c1e01e3 (patch)
tree30e1bf209e232d7f8d6723959db68b2c0cb015dd /source/slang/stmt-defs.h
parent3d313d963f29f6ca6a8d12bd5c403a70c49aca2a (diff)
Add a compile-time loop construct to Slang
The basic syntax is: $for(i in Range(0,99)) { /* stuff goes here */ } Note that the exact form is very restrictive. All that you are allowed to change is `i`, `0`, `99` or `/* stuff goes here */`. As a tiny bit of syntax sugar, the following should work: $for(i in Range(99)) { /* stuff goes here */ } Note that the range given is half-open (C++ iterator `[begin,end)` style). Both the beginning and end of the range must be compile-time constant expressions that Slang knows how to constant-fold. The implementation will basically generate code for `/* stuff goes here */` N times, once for each value in the half-open range. Each time, the variable `i` will be replaced with a different compile-time-constant expression. While I was working on a test case for this, I also found that our build of glslang had an issue with resource limits, so I fixed that. Clients will need to build a new glslang to use the fix.
Diffstat (limited to 'source/slang/stmt-defs.h')
-rw-r--r--source/slang/stmt-defs.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/source/slang/stmt-defs.h b/source/slang/stmt-defs.h
index 9dea40fbf..80e3cd60d 100644
--- a/source/slang/stmt-defs.h
+++ b/source/slang/stmt-defs.h
@@ -96,6 +96,16 @@ SYNTAX_CLASS(DoWhileStatementSyntaxNode, LoopStmt)
SYNTAX_FIELD(RefPtr<ExpressionSyntaxNode>, Predicate)
END_SYNTAX_CLASS()
+// A compile-time, range-based `for` loop, which will not appear in the output code
+SYNTAX_CLASS(CompileTimeForStmt, ScopeStmt)
+ SYNTAX_FIELD(RefPtr<Variable>, varDecl)
+ SYNTAX_FIELD(RefPtr<ExpressionSyntaxNode>, rangeBeginExpr)
+ SYNTAX_FIELD(RefPtr<ExpressionSyntaxNode>, rangeEndExpr)
+ SYNTAX_FIELD(RefPtr<StatementSyntaxNode>, body)
+ SYNTAX_FIELD(RefPtr<IntVal>, rangeBeginVal)
+ SYNTAX_FIELD(RefPtr<IntVal>, rangeEndVal)
+END_SYNTAX_CLASS()
+
// The case of child statements that do control flow relative
// to their parent statement.
ABSTRACT_SYNTAX_CLASS(JumpStmt, ChildStmt)