ir_reader: Fix reading of array deferences and correct error messages.

Previously, the syntax was (array_ref <variable name> <index>), but the
subject is now a general rvalue (not a name).  In particular, it might
be a (var_ref ...).

Also, remove "expected ... or (swiz)" from error messages; swiz is not
allowed inside a var_ref.
This commit is contained in:
Kenneth Graunke
2010-05-26 13:03:14 -07:00
committed by Ian Romanick
parent a9159f9e87
commit 350bd70348
+18 -26
View File
@@ -817,50 +817,42 @@ read_constant(_mesa_glsl_parse_state *st, s_list *list)
return NULL; // should not be reached
}
static ir_variable *
read_dereferencable(_mesa_glsl_parse_state *st, s_expression *expr)
{
// Read the subject of a dereference - either a variable name or a swizzle
s_symbol *var_name = SX_AS_SYMBOL(expr);
if (var_name != NULL) {
ir_variable *var = st->symbols->get_variable(var_name->value());
if (var == NULL) {
ir_read_error(st, expr, "undeclared variable: %s", var_name->value());
}
return var;
}
ir_read_error(st, expr, "expected variable name or (swiz ...)");
return NULL;
}
static ir_dereference *
read_var_ref(_mesa_glsl_parse_state *st, s_list *list)
{
if (list->length() != 2) {
ir_read_error(st, list, "expected (var_ref <variable name or (swiz)>)");
ir_read_error(st, list, "expected (var_ref <variable name>)");
return NULL;
}
s_expression *subj_expr = (s_expression*) list->subexpressions.head->next;
ir_variable *subject = read_dereferencable(st, subj_expr);
if (subject == NULL)
s_symbol *var_name = SX_AS_SYMBOL(list->subexpressions.head->next);
if (var_name == NULL) {
ir_read_error(st, list, "expected (var_ref <variable name>)");
return NULL;
return new ir_dereference_variable(subject);
}
ir_variable *var = st->symbols->get_variable(var_name->value());
if (var == NULL) {
ir_read_error(st, list, "undeclared variable: %s", var_name->value());
return NULL;
}
return new ir_dereference_variable(var);
}
static ir_dereference *
read_array_ref(_mesa_glsl_parse_state *st, s_list *list)
{
if (list->length() != 3) {
ir_read_error(st, list, "expected (array_ref <variable name or (swiz)> "
"<rvalue>)");
ir_read_error(st, list, "expected (array_ref <rvalue> <index>)");
return NULL;
}
s_expression *subj_expr = (s_expression*) list->subexpressions.head->next;
ir_variable *subject = read_dereferencable(st, subj_expr);
if (subject == NULL)
ir_rvalue *subject = read_rvalue(st, subj_expr);
if (subject == NULL) {
ir_read_error(st, NULL, "when reading the subject of an array_ref");
return NULL;
}
s_expression *idx_expr = (s_expression*) subj_expr->next;
ir_rvalue *idx = read_rvalue(st, idx_expr);