summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-05-26 13:03:14 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-05-26 15:24:40 -0700
commit350bd703480d4e4f8dea1813cec6ee8964bce3be (patch)
tree92b62e6162194d80365566ff29f4d857a5baaf29
parenta9159f9e87b518ba0a4ad43db8fdd58a678b3a92 (diff)
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.
-rw-r--r--ir_reader.cpp44
1 files changed, 18 insertions, 26 deletions
diff --git a/ir_reader.cpp b/ir_reader.cpp
index 744606d4f2..072842e83b 100644
--- a/ir_reader.cpp
+++ b/ir_reader.cpp
@@ -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;
+ }
+
+ 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(subject);
+ }
+
+ 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);