ir_reader: Don't emit ir_function multiple times.

This commit is contained in:
Kenneth Graunke
2010-07-07 15:23:27 -07:00
committed by Eric Anholt
parent 35c89204e5
commit e024c5c690

View File

@@ -192,6 +192,7 @@ static ir_function *
read_function(_mesa_glsl_parse_state *st, s_list *list, bool skip_body) read_function(_mesa_glsl_parse_state *st, s_list *list, bool skip_body)
{ {
void *ctx = st; void *ctx = st;
bool added = false;
if (list->length() < 3) { if (list->length() < 3) {
ir_read_error(st, list, "Expected (function <name> (signature ...) ...)"); ir_read_error(st, list, "Expected (function <name> (signature ...) ...)");
return NULL; return NULL;
@@ -206,7 +207,7 @@ read_function(_mesa_glsl_parse_state *st, s_list *list, bool skip_body)
ir_function *f = st->symbols->get_function(name->value()); ir_function *f = st->symbols->get_function(name->value());
if (f == NULL) { if (f == NULL) {
f = new(ctx) ir_function(name->value()); f = new(ctx) ir_function(name->value());
bool added = st->symbols->add_function(f->name, f); added = st->symbols->add_function(f->name, f);
assert(added); assert(added);
} }
@@ -228,7 +229,7 @@ read_function(_mesa_glsl_parse_state *st, s_list *list, bool skip_body)
read_function_sig(st, f, siglist, skip_body); read_function_sig(st, f, siglist, skip_body);
} }
return f; return added ? f : NULL;
} }
static void static void
@@ -321,10 +322,7 @@ read_instructions(_mesa_glsl_parse_state *st, exec_list *instructions,
foreach_iter(exec_list_iterator, it, list->subexpressions) { foreach_iter(exec_list_iterator, it, list->subexpressions) {
s_expression *sub = (s_expression*) it.get(); s_expression *sub = (s_expression*) it.get();
ir_instruction *ir = read_instruction(st, sub, loop_ctx); ir_instruction *ir = read_instruction(st, sub, loop_ctx);
if (ir == NULL) { if (ir != NULL)
ir_read_error(st, sub, "Invalid instruction.\n");
return;
}
instructions->push_tail(ir); instructions->push_tail(ir);
} }
} }
@@ -344,8 +342,10 @@ read_instruction(_mesa_glsl_parse_state *st, s_expression *expr,
} }
s_list *list = SX_AS_LIST(expr); s_list *list = SX_AS_LIST(expr);
if (list == NULL || list->subexpressions.is_empty()) if (list == NULL || list->subexpressions.is_empty()) {
ir_read_error(st, expr, "Invalid instruction.\n");
return NULL; return NULL;
}
s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.get_head()); s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.get_head());
if (tag == NULL) { if (tag == NULL) {