diff options
Diffstat (limited to 'ir.c')
| -rw-r--r-- | ir.c | 66 |
1 files changed, 40 insertions, 26 deletions
@@ -4,6 +4,38 @@ #include "ir.h" #include "strio.h" +/* node lists */ + +void nodelist_push(NodeList *l, Node *p, Arena *a) { + ZDA_PUSH(a, l, p); +} + +void nodelist_remove(NodeList *l, Node *p) { + for (int i = l->len - 1; i >= 0; i--) { + if (l->data[i] == p) { + if (p) p->refs--; + l->len--; + if (i < l->len) { + memmove(&l->data[i], &l->data[i + 1], sizeof(Node*) * (l->len - i)); + } + break; + } + } +} + +void nodelist_remove_unordered(NodeList *l, Node *p) { + for (int i = l->len - 1; i >= 0; i--) { + if (l->data[i] == p) { + if (p) p->refs--; + l->len--; + if (i < l->len) { + l->data[i] = l->data[l->len]; + } + break; + } + } +} + /* nodes */ const char *node_type_name(NodeType t) { @@ -24,29 +56,11 @@ void node_die(Node *n, Graph *p) { } void node_del_out(Node *n, Node *p) { - for (int i = n->out.len - 1; i >= 0; i--) { - if (n->out.data[i] == p) { - if (p) p->refs--; - n->out.len--; - if (i < n->out.len) { - n->out.data[i] = n->out.data[n->out.len]; - } - break; - } - } + nodelist_remove_unordered(&n->out, p); } void node_del_in(Node *n, Node *p) { - for (int i = n->in.len - 1; i >= 0; i--) { - if (n->in.data[i] == p) { - if (p) p->refs--; - n->in.len--; - if (i < n->in.len) { - memmove(&n->in.data[i], &n->in.data[i + 1], sizeof(Node*) * (n->in.len - i)); - } - break; - } - } + nodelist_remove(&n->in, p); } void node_kill(Node *n, Graph *p) { @@ -54,27 +68,27 @@ void node_kill(Node *n, Graph *p) { /* probably this is fine */ p->ctrl = CTRL(n); } - while (n->refs > 0 && n->in.len > 0) node_remove(p, n->in.data[0], n); - while (n->refs > 0 && n->out.len > 0) node_remove(p, n, n->out.data[0]); + while (n->refs > 0 && n->in.len > 0) node_remove(p, IN(n, 0), n); + while (n->refs > 0 && n->out.len > 0) node_remove(p, n, OUT(n, 0)); assert(n->refs == 0); } void node_add_out(Graph *p, Node *a, Node *b) { - ZDA_PUSH(p->pool->arena, &a->out, b); + nodelist_push(&a->out, b, p->pool->arena); if (b) b->refs++; } void node_add_in(Graph *p, Node *a, Node *b) { - ZDA_PUSH(p->pool->arena, &a->in, b); + nodelist_push(&a->in, b, p->pool->arena); if (b) b->refs++; } void node_set_in(Graph *p, Node *n, int idx, Node *to) { - Node *in = n->in.data[idx]; + Node *in = IN(n, idx); if (in) in->refs--; node_add_out(p, to, n); node_del_out(in, n); - n->in.data[0] = to; + IN(n, 0) = to; if (in->out.len < 1) node_kill(in, p); } |
