Begin tracking the nesting of loops and switch-statements
This commit is contained in:
@@ -2093,6 +2093,12 @@ ast_iteration_statement::hir(exec_list *instructions,
|
|||||||
ir_loop *const stmt = new ir_loop();
|
ir_loop *const stmt = new ir_loop();
|
||||||
instructions->push_tail(stmt);
|
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) {
|
if (condition != NULL) {
|
||||||
ir_rvalue *const cond =
|
ir_rvalue *const cond =
|
||||||
condition->hir(& stmt->body_instructions, state);
|
condition->hir(& stmt->body_instructions, state);
|
||||||
@@ -2135,6 +2141,10 @@ ast_iteration_statement::hir(exec_list *instructions,
|
|||||||
if (mode == ast_for)
|
if (mode == ast_for)
|
||||||
state->symbols->pop_scope();
|
state->symbols->pop_scope();
|
||||||
|
|
||||||
|
/* Restore previous nesting before returning.
|
||||||
|
*/
|
||||||
|
state->loop_or_switch_nesting = nesting;
|
||||||
|
|
||||||
/* Loops do not have r-values.
|
/* Loops do not have r-values.
|
||||||
*/
|
*/
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -637,6 +637,7 @@ main(int argc, char **argv)
|
|||||||
state.symbols = new glsl_symbol_table;
|
state.symbols = new glsl_symbol_table;
|
||||||
state.error = false;
|
state.error = false;
|
||||||
state.temp_index = 0;
|
state.temp_index = 0;
|
||||||
|
state.loop_or_switch_nesting = NULL;
|
||||||
|
|
||||||
_mesa_glsl_lexer_ctor(& state, shader, shader_len);
|
_mesa_glsl_lexer_ctor(& state, shader, shader_len);
|
||||||
_mesa_glsl_parse(& state);
|
_mesa_glsl_parse(& state);
|
||||||
|
@@ -56,6 +56,9 @@ struct _mesa_glsl_parse_state {
|
|||||||
|
|
||||||
/** Index of last generated anonymous temporary. */
|
/** Index of last generated anonymous temporary. */
|
||||||
unsigned temp_index;
|
unsigned temp_index;
|
||||||
|
|
||||||
|
/** Loop or switch statement containing the current instructions. */
|
||||||
|
class ir_instruction *loop_or_switch_nesting;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct YYLTYPE {
|
typedef struct YYLTYPE {
|
||||||
|
Reference in New Issue
Block a user