Begin tracking the nesting of loops and switch-statements

This commit is contained in:
Ian Romanick
2010-04-05 17:01:53 -07:00
parent c0e76d8352
commit e9d0f265aa
3 changed files with 14 additions and 0 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 {