diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2010-05-26 15:20:59 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-05-26 15:24:53 -0700 |
commit | 13e1b6b725def5a22952ecd4e2e8b1e61cb3bcfa (patch) | |
tree | 95c8ae5aeca2a021a3c3677a4ad63b2ba2a1a905 | |
parent | 350bd703480d4e4f8dea1813cec6ee8964bce3be (diff) |
ir_reader: Read record_refs.
Also changes the print visitor to not emit extraneous parenthesis.
-rw-r--r-- | ir_print_visitor.cpp | 2 | ||||
-rw-r--r-- | ir_reader.cpp | 20 |
2 files changed, 19 insertions, 3 deletions
diff --git a/ir_print_visitor.cpp b/ir_print_visitor.cpp index e507a0ebf9..84edad5dfa 100644 --- a/ir_print_visitor.cpp +++ b/ir_print_visitor.cpp @@ -181,7 +181,7 @@ void ir_print_visitor::visit(ir_dereference_record *ir) { printf("(record_ref "); ir->record->accept(this); - printf("(%s)) ", ir->field); + printf(" %s) ", ir->field); } diff --git a/ir_reader.cpp b/ir_reader.cpp index 072842e83b..f4b9967d44 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()); } |