summaryrefslogtreecommitdiff
path: root/ir_reader.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-05-26 15:20:59 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-05-26 15:24:53 -0700
commit13e1b6b725def5a22952ecd4e2e8b1e61cb3bcfa (patch)
tree95c8ae5aeca2a021a3c3677a4ad63b2ba2a1a905 /ir_reader.cpp
parent350bd703480d4e4f8dea1813cec6ee8964bce3be (diff)
ir_reader: Read record_refs.
Also changes the print visitor to not emit extraneous parenthesis.
Diffstat (limited to 'ir_reader.cpp')
-rw-r--r--ir_reader.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/ir_reader.cpp b/ir_reader.cpp
index 072842e..f4b9967 100644
--- a/ir_reader.cpp
+++ b/ir_reader.cpp
@@ -862,6 +862,22 @@ read_array_ref(_mesa_glsl_parse_state *st, s_list *list)
static ir_dereference *
read_record_ref(_mesa_glsl_parse_state *st, s_list *list)
{
- ir_read_error(st, list, "FINISHME: record refs not yet supported.");
- return NULL;
+ if (list->length() != 3) {
+ ir_read_error(st, list, "expected (record_ref <rvalue> <field>)");
+ return NULL;
+ }
+
+ s_expression *subj_expr = (s_expression*) list->subexpressions.head->next;
+ ir_rvalue *subject = read_rvalue(st, subj_expr);
+ if (subject == NULL) {
+ ir_read_error(st, NULL, "when reading the subject of a record_ref");
+ return NULL;
+ }
+
+ s_symbol *field = SX_AS_SYMBOL(subj_expr->next);
+ if (field == NULL) {
+ ir_read_error(st, list, "expected (record_ref ... <field name>)");
+ return NULL;
+ }
+ return new ir_dereference_record(subject, field->value());
}