Be more careful with boolean expressions.

Either true_list or false_list may be null.
This commit is contained in:
Bill Currie 2012-12-05 20:12:57 +09:00
parent 08b27efe33
commit fea806c155

View file

@ -151,6 +151,7 @@ print_bool (dstring_t *dstr, expr_t *e, int level, int id, expr_t *next)
{ {
int indent = level * 2 + 2; int indent = level * 2 + 2;
int i, count; int i, count;
int tl_count = 0, fl_count = 0;
ex_bool_t *bool = &e->e.bool; ex_bool_t *bool = &e->e.bool;
dasprintf (dstr, "%*se_%p [shape=none,label=<\n", indent, "", e); dasprintf (dstr, "%*se_%p [shape=none,label=<\n", indent, "", e);
@ -161,17 +162,21 @@ print_bool (dstring_t *dstr, expr_t *e, int level, int id, expr_t *next)
indent + 4, "", e->line); indent + 4, "", e->line);
dasprintf (dstr, "%*s<tr><td>true</td><td>false</td></tr>\n", dasprintf (dstr, "%*s<tr><td>true</td><td>false</td></tr>\n",
indent + 4, ""); indent + 4, "");
count = min (bool->true_list->size, bool->false_list->size); if (bool->true_list)
tl_count = bool->true_list->size;
if (bool->false_list)
fl_count = bool->false_list->size;
count = min (tl_count, fl_count);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
dasprintf (dstr, "%*s<tr><td port=\"t%d\">t</td>" dasprintf (dstr, "%*s<tr><td port=\"t%d\">t</td>"
"<td port=\"f%d\">f</td></tr>\n", indent, "", i, i); "<td port=\"f%d\">f</td></tr>\n", indent, "", i, i);
for ( ; i < bool->true_list->size; i++) for ( ; i < tl_count; i++)
dasprintf (dstr, "%*s<tr><td port=\"t%d\">t</td>%s</tr>\n", dasprintf (dstr, "%*s<tr><td port=\"t%d\">t</td>%s</tr>\n",
indent, "", i, indent, "", i,
i == count ? va ("<td rowspan=\"%d\"></td>", i == count ? va ("<td rowspan=\"%d\"></td>",
bool->true_list->size - count) bool->true_list->size - count)
: ""); : "");
for ( ; i < bool->false_list->size; i++) for ( ; i < fl_count; i++)
dasprintf (dstr, "%*s<tr>%s<td port=\"f%d\">f</td></tr>\n", dasprintf (dstr, "%*s<tr>%s<td port=\"f%d\">f</td></tr>\n",
indent, "", indent, "",
i == count ? va ("<td rowspan=\"%d\"></td>", i == count ? va ("<td rowspan=\"%d\"></td>",
@ -183,10 +188,10 @@ print_bool (dstring_t *dstr, expr_t *e, int level, int id, expr_t *next)
if (e->next) if (e->next)
next = e->next; next = e->next;
_print_expr (dstr, e->e.bool.e, level, id, next); _print_expr (dstr, e->e.bool.e, level, id, next);
for (i = 0; i < bool->true_list->size; i++) for (i = 0; i < tl_count; i++)
dasprintf (dstr, "%*se_%p:t%d -> e_%p;\n", indent, "", e, i, dasprintf (dstr, "%*se_%p:t%d -> e_%p;\n", indent, "", e, i,
bool->true_list->e[i]); bool->true_list->e[i]);
for (i = 0; i < bool->false_list->size; i++) for (i = 0; i < fl_count; i++)
dasprintf (dstr, "%*se_%p:f%d -> e_%p;\n", indent, "", e, i, dasprintf (dstr, "%*se_%p:f%d -> e_%p;\n", indent, "", e, i,
bool->false_list->e[i]); bool->false_list->e[i]);
dasprintf (dstr, "%*se_%p -> e_%p;\n", indent, "", e, e->e.bool.e); dasprintf (dstr, "%*se_%p -> e_%p;\n", indent, "", e, e->e.bool.e);