ir_reader: Combine the three dereference reading functions into one.

These used to be more complicated, but now are so simple there's no real
point in keeping them separate.
This commit is contained in:
Kenneth Graunke 2010-12-31 02:17:58 -08:00
parent e486fca2d3
commit ec7e4f0ec5

View file

@ -62,12 +62,6 @@ static ir_texture *read_texture(_mesa_glsl_parse_state *, s_expression *);
static ir_dereference *read_dereference(_mesa_glsl_parse_state *, static ir_dereference *read_dereference(_mesa_glsl_parse_state *,
s_expression *); s_expression *);
static ir_dereference_variable *
read_var_ref(_mesa_glsl_parse_state *, s_expression *);
static ir_dereference_array *
read_array_ref(_mesa_glsl_parse_state *, s_expression *);
static ir_dereference_record *
read_record_ref(_mesa_glsl_parse_state *, s_expression *);
void void
_mesa_glsl_read_ir(_mesa_glsl_parse_state *state, exec_list *instructions, _mesa_glsl_read_ir(_mesa_glsl_parse_state *state, exec_list *instructions,
@ -827,85 +821,44 @@ read_constant(_mesa_glsl_parse_state *st, s_expression *expr)
static ir_dereference * static ir_dereference *
read_dereference(_mesa_glsl_parse_state *st, s_expression *expr) read_dereference(_mesa_glsl_parse_state *st, s_expression *expr)
{ {
s_list *list = SX_AS_LIST(expr); s_symbol *s_var;
if (list == NULL || list->subexpressions.is_empty()) s_expression *s_subject;
return NULL; s_expression *s_index;
s_symbol *s_field;
s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head); s_pattern var_pat[] = { "var_ref", s_var };
assert(tag != NULL); s_pattern array_pat[] = { "array_ref", s_subject, s_index };
s_pattern record_pat[] = { "record_ref", s_subject, s_field };
if (strcmp(tag->value(), "var_ref") == 0) if (MATCH(expr, var_pat)) {
return read_var_ref(st, list); ir_variable *var = st->symbols->get_variable(s_var->value());
if (strcmp(tag->value(), "array_ref") == 0)
return read_array_ref(st, list);
if (strcmp(tag->value(), "record_ref") == 0)
return read_record_ref(st, list);
return NULL;
}
static ir_dereference_variable *
read_var_ref(_mesa_glsl_parse_state *st, s_expression *expr)
{
void *ctx = st;
s_symbol *var_name;
s_pattern pat[] = { "var_ref", var_name };
if (!MATCH(expr, pat)) {
ir_read_error(st, expr, "expected (var_ref <variable name>)");
return NULL;
}
ir_variable *var = st->symbols->get_variable(var_name->value());
if (var == NULL) { if (var == NULL) {
ir_read_error(st, expr, "undeclared variable: %s", var_name->value()); ir_read_error(st, expr, "undeclared variable: %s", s_var->value());
return NULL; return NULL;
} }
return new(st) ir_dereference_variable(var);
return new(ctx) ir_dereference_variable(var); } else if (MATCH(expr, array_pat)) {
} ir_rvalue *subject = read_rvalue(st, s_subject);
static ir_dereference_array *
read_array_ref(_mesa_glsl_parse_state *st, s_expression *expr)
{
void *ctx = st;
s_expression *subj_expr;
s_expression *idx_expr;
s_pattern pat[] = { "array_ref", subj_expr, idx_expr };
if (!MATCH(expr, pat)) {
ir_read_error(st, expr, "expected (array_ref <rvalue> <index>)");
return NULL;
}
ir_rvalue *subject = read_rvalue(st, subj_expr);
if (subject == NULL) { if (subject == NULL) {
ir_read_error(st, NULL, "when reading the subject of an array_ref"); ir_read_error(st, NULL, "when reading the subject of an array_ref");
return NULL; return NULL;
} }
ir_rvalue *idx = read_rvalue(st, idx_expr); ir_rvalue *idx = read_rvalue(st, s_index);
return new(ctx) ir_dereference_array(subject, idx); if (subject == NULL) {
} ir_read_error(st, NULL, "when reading the index of an array_ref");
static ir_dereference_record *
read_record_ref(_mesa_glsl_parse_state *st, s_expression *expr)
{
void *ctx = st;
s_expression *subj_expr;
s_symbol *field;
s_pattern pat[] = { "record_ref", subj_expr, field };
if (!MATCH(expr, pat)) {
ir_read_error(st, expr, "expected (record_ref <rvalue> <field>)");
return NULL; return NULL;
} }
return new(st) ir_dereference_array(subject, idx);
ir_rvalue *subject = read_rvalue(st, subj_expr); } else if (MATCH(expr, record_pat)) {
ir_rvalue *subject = read_rvalue(st, s_subject);
if (subject == NULL) { if (subject == NULL) {
ir_read_error(st, NULL, "when reading the subject of a record_ref"); ir_read_error(st, NULL, "when reading the subject of a record_ref");
return NULL; return NULL;
} }
return new(ctx) ir_dereference_record(subject, field->value()); return new(st) ir_dereference_record(subject, s_field->value());
}
return NULL;
} }
static ir_texture * static ir_texture *