summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-04-05 17:01:53 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-04-07 11:42:36 -0700
commite9d0f265aabb39928d4d8a527684bf3b9eebc21c (patch)
treed9d7946a8314352fe8d510f0db5ec1df3ee760ec
parentc0e76d8352fbe96efb0338e9d98b08494671e504 (diff)
Begin tracking the nesting of loops and switch-statements
-rw-r--r--ast_to_hir.cpp10
-rw-r--r--glsl_parser_extras.cpp1
-rw-r--r--glsl_parser_extras.h3
3 files changed, 14 insertions, 0 deletions
diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp
index 823bab9dfa..444cb7d54e 100644
--- a/ast_to_hir.cpp
+++ b/ast_to_hir.cpp
@@ -2093,6 +2093,12 @@ ast_iteration_statement::hir(exec_list *instructions,
ir_loop *const stmt = new ir_loop();
instructions->push_tail(stmt);
+ /* Track the current loop and / or switch-statement nesting.
+ */
+ ir_instruction *const nesting = state->loop_or_switch_nesting;
+ state->loop_or_switch_nesting = stmt;
+
+
if (condition != NULL) {
ir_rvalue *const cond =
condition->hir(& stmt->body_instructions, state);
@@ -2135,6 +2141,10 @@ ast_iteration_statement::hir(exec_list *instructions,
if (mode == ast_for)
state->symbols->pop_scope();
+ /* Restore previous nesting before returning.
+ */
+ state->loop_or_switch_nesting = nesting;
+
/* Loops do not have r-values.
*/
return NULL;
diff --git a/glsl_parser_extras.cpp b/glsl_parser_extras.cpp
index 538d77c663..877b165ad7 100644
--- a/glsl_parser_extras.cpp
+++ b/glsl_parser_extras.cpp
@@ -637,6 +637,7 @@ main(int argc, char **argv)
state.symbols = new glsl_symbol_table;
state.error = false;
state.temp_index = 0;
+ state.loop_or_switch_nesting = NULL;
_mesa_glsl_lexer_ctor(& state, shader, shader_len);
_mesa_glsl_parse(& state);
diff --git a/glsl_parser_extras.h b/glsl_parser_extras.h
index 96c975ba11..373d295bba 100644
--- a/glsl_parser_extras.h
+++ b/glsl_parser_extras.h
@@ -56,6 +56,9 @@ struct _mesa_glsl_parse_state {
/** Index of last generated anonymous temporary. */
unsigned temp_index;
+
+ /** Loop or switch statement containing the current instructions. */
+ class ir_instruction *loop_or_switch_nesting;
};
typedef struct YYLTYPE {