ir_reader: Add support for reading (return ...)
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 10 Apr 2010 00:56:22 +0000 (17:56 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 29 Apr 2010 01:14:54 +0000 (18:14 -0700)
ir_reader.cpp

index 00fcc9475ccf7e1d56f66bd8debdd57daacf187c..2289095dfdee378e8f9f76252623688b5e96e45e 100644 (file)
@@ -33,6 +33,7 @@ static glsl_type *read_type(_mesa_glsl_parse_state *, s_expression *);
 static ir_instruction *read_instruction(_mesa_glsl_parse_state *,
                                        s_expression *);
 static ir_variable *read_declaration(_mesa_glsl_parse_state *, s_list *);
+static ir_return *read_return(_mesa_glsl_parse_state *, s_list *);
 
 static ir_rvalue *read_rvalue(_mesa_glsl_parse_state *, s_expression *);
 static ir_assignment *read_assignment(_mesa_glsl_parse_state *, s_list *);
@@ -143,6 +144,8 @@ read_instruction(_mesa_glsl_parse_state *st, s_expression *expr)
    ir_instruction *inst = NULL;
    if (strcmp(tag->value(), "declare") == 0)
       inst = read_declaration(st, list);
+   else if (strcmp(tag->value(), "return") == 0)
+      inst = read_return(st, list);
    else
       ir_read_error(expr, "unrecognized instruction tag: %s", tag->value());
 
@@ -220,6 +223,26 @@ read_declaration(_mesa_glsl_parse_state *st, s_list *list)
 }
 
 
+static ir_return *
+read_return(_mesa_glsl_parse_state *st, s_list *list)
+{
+   if (list->length() != 2) {
+      ir_read_error(list, "expected (return <rvalue>)");
+      return NULL;
+   }
+
+   s_expression *expr = (s_expression*) list->subexpressions.head->next;
+
+   ir_rvalue *retval = read_rvalue(st, expr);
+   if (retval == NULL) {
+      ir_read_error(list, "when reading return value");
+      return NULL;
+   }
+
+   return new ir_return(retval);
+}
+
+
 static ir_rvalue *
 read_rvalue(_mesa_glsl_parse_state *st, s_expression *expr)
 {