Make ir_read_error print out the given S-Expression, for context.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 22 Apr 2010 06:23:23 +0000 (23:23 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 29 Apr 2010 01:14:54 +0000 (18:14 -0700)
ir_reader.cpp

index 976af2ab1289ad31c7528ef7a97571bffec3692f..74fe5faaf6726ff5d915268cf10bfbc9b3c0de0a 100644 (file)
@@ -87,19 +87,22 @@ static void
 ir_read_error(_mesa_glsl_parse_state *state, s_expression *expr,
              const char *fmt, ...)
 {
-   char buf[1024];
-   int len;
    va_list ap;
 
    state->error = true;
 
-   len = snprintf(buf, sizeof(buf), "error: ");
+   printf("error: ");
 
    va_start(ap, fmt);
-   vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
+   vprintf(fmt, ap);
    va_end(ap);
+   printf("\n");
 
-   printf("%s\n", buf);
+   if (expr != NULL) {
+      printf("...in this context:\n   ");
+      expr->print();
+      printf("\n\n");
+   }
 }
 
 static const glsl_type *
@@ -122,7 +125,7 @@ read_type(_mesa_glsl_parse_state *st, s_expression *expr)
         s_expression *base_expr = (s_expression*) type_sym->next;
         const glsl_type *base_type = read_type(st, base_expr);
         if (base_type == NULL) {
-           ir_read_error(st, expr, "when reading base type of array");
+           ir_read_error(st, NULL, "when reading base type of array");
            return NULL;
         }
 
@@ -340,7 +343,7 @@ read_instruction(_mesa_glsl_parse_state *st, s_expression *expr,
    } else {
       inst = read_rvalue(st, list);
       if (inst == NULL)
-        ir_read_error(st, list, "when reading instruction");
+        ir_read_error(st, NULL, "when reading instruction");
    }
    return inst;
 }
@@ -429,7 +432,7 @@ read_if(_mesa_glsl_parse_state *st, s_list *list, ir_loop *loop_ctx)
    s_expression *cond_expr = (s_expression*) list->subexpressions.head->next;
    ir_rvalue *condition = read_rvalue(st, cond_expr);
    if (condition == NULL) {
-      ir_read_error(st, list, "when reading condition of (if ...)");
+      ir_read_error(st, NULL, "when reading condition of (if ...)");
       return NULL;
    }
 
@@ -487,7 +490,7 @@ read_return(_mesa_glsl_parse_state *st, s_list *list)
 
    ir_rvalue *retval = read_rvalue(st, expr);
    if (retval == NULL) {
-      ir_read_error(st, list, "when reading return value");
+      ir_read_error(st, NULL, "when reading return value");
       return NULL;
    }
 
@@ -546,19 +549,19 @@ read_assignment(_mesa_glsl_parse_state *st, s_list *list)
    // FINISHME: Deal with "true" condition
    ir_rvalue *condition = read_rvalue(st, cond_expr);
    if (condition == NULL) {
-      ir_read_error(st, list, "when reading condition of assignment");
+      ir_read_error(st, NULL, "when reading condition of assignment");
       return NULL;
    }
 
    ir_rvalue *lhs = read_rvalue(st, lhs_expr);
    if (lhs == NULL) {
-      ir_read_error(st, list, "when reading left-hand side of assignment");
+      ir_read_error(st, NULL, "when reading left-hand side of assignment");
       return NULL;
    }
 
    ir_rvalue *rhs = read_rvalue(st, rhs_expr);
    if (rhs == NULL) {
-      ir_read_error(st, list, "when reading right-hand side of assignment");
+      ir_read_error(st, NULL, "when reading right-hand side of assignment");
       return NULL;
    }
 
@@ -612,7 +615,7 @@ read_expression(_mesa_glsl_parse_state *st, s_list *list)
    s_expression *exp1 = (s_expression*) (op_sym->next);
    ir_rvalue *arg1 = read_rvalue(st, exp1);
    if (arg1 == NULL) {
-      ir_read_error(st, list, "when reading first operand of %s",
+      ir_read_error(st, NULL, "when reading first operand of %s",
                    op_sym->value());
       return NULL;
    }
@@ -622,7 +625,7 @@ read_expression(_mesa_glsl_parse_state *st, s_list *list)
       s_expression *exp2 = (s_expression*) (exp1->next);
       arg2 = read_rvalue(st, exp2);
       if (arg2 == NULL) {
-        ir_read_error(st, list, "when reading second operand of %s",
+        ir_read_error(st, NULL, "when reading second operand of %s",
                       op_sym->value());
         return NULL;
       }