diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 4fb859faf..a1650cbed 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -129,7 +129,7 @@ typedef struct { typedef struct { type_t *type; ///< Type of vector (vector/quaternion) - const expr_t *list; ///< Linked list of element expressions. + ex_list_t list; ///< Linked list of element expressions. } ex_vector_t; typedef struct { @@ -310,7 +310,7 @@ typedef struct { #define POINTER_VAL(p) (((p).def ? (p).def->offset : 0) + (p).val) typedef struct expr_s { - expr_t *next; + expr_t *next; expr_type type; ///< the type of the result of this expression int line; ///< source line that generated this expression pr_string_t file; ///< source file that generated this expression diff --git a/tools/qfcc/source/dot_expr.c b/tools/qfcc/source/dot_expr.c index 9e774a5ff..672e49848 100644 --- a/tools/qfcc/source/dot_expr.c +++ b/tools/qfcc/source/dot_expr.c @@ -178,8 +178,6 @@ print_bool (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t *n i); dasprintf (dstr, "%*s\n", indent + 2, ""); dasprintf (dstr, "%*s>];\n", indent, ""); - if (e->next) - next = e->next; _print_expr (dstr, e->boolean.e, level, id, next); for (i = 0; i < tl_count; i++) dasprintf (dstr, "%*se_%p:t%d -> e_%p;\n", indent, "", e, i, @@ -195,8 +193,6 @@ print_label (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t * { int indent = level * 2 + 2; - if (e->next) - next = e->next; if (next) dasprintf (dstr, "%*se_%p -> e_%p [constraint=true,style=dashed];\n", indent, "", e, next); @@ -209,8 +205,6 @@ print_labelref (dstring_t *dstr, const expr_t *e, int level, int id, const expr_ { int indent = level * 2 + 2; - if (e->next) - next = e->next; if (next) dasprintf (dstr, "%*se_%p -> e_%p [constraint=true,style=dashed];\n", indent, "", e, next); @@ -227,7 +221,7 @@ print_block (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t *exprs[num_exprs + 1]; list_scatter (&e->block.list, exprs); - exprs[num_exprs] = 0; + exprs[num_exprs] = next; int colspan = num_exprs ? num_exprs : 1; @@ -397,9 +391,6 @@ print_conditional (dstring_t *dstr, const expr_t *e, int level, int id, const ex e->branch.test); dasprintf (dstr, "%*se_%p -> \"e_%p\" [label=\"g\"];\n", indent, "", e, e->branch.target); - if (e->next) { - next = e->next; - } if (next) { dasprintf (dstr, "%*se_%p -> e_%p [constraint=true," "style=dashed];\n", indent, "", e, next); @@ -520,7 +511,8 @@ print_vector (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t { int indent = level * 2 + 2; - for (const expr_t *ele = e->vector.list; ele; ele = ele->next) { + for (auto li = e->vector.list.head; li; li = li->next) { + auto ele = li->expr; _print_expr (dstr, ele, level, id, next); dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, ele); } diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 2e192159f..d58a681fc 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -1384,9 +1384,6 @@ append_expr (expr_t *block, const expr_t *e) if (!e || e->type == ex_error) return block; - if (e->next) - internal_error (e, "append_expr: expr loop detected"); - auto li = new_listitem (e); *block->block.tail = li; block->block.tail = &li->next; @@ -1403,9 +1400,6 @@ prepend_expr (expr_t *block, const expr_t *e) if (!e || e->type == ex_error) return block; - if (e->next) - internal_error (e, "append_expr: expr loop detected"); - auto li = new_listitem (e); li->next = block->block.head; block->block.head = li; @@ -1591,7 +1585,6 @@ convert_from_bool (const expr_t *e, type_t *type) } auto cond = new_expr (); *cond = *e; - cond->next = 0; return conditional_expr (cond, one, zero); } diff --git a/tools/qfcc/source/expr_assign.c b/tools/qfcc/source/expr_assign.c index 43e9029e9..6892fd465 100644 --- a/tools/qfcc/source/expr_assign.c +++ b/tools/qfcc/source/expr_assign.c @@ -230,12 +230,15 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) const expr_t *dw, *sw; const expr_t *ds, *ss; const expr_t *dv, *sv; + int count = list_count (&src->vector.list); + const expr_t *components[count]; + list_scatter (&src->vector.list, components); if (is_vector (src->vector.type)) { // guaranteed to have three elements - sx = src->vector.list; - sy = sx->next; - sz = sy->next; + sx = components[0]; + sy = components[1]; + sz = components[2]; dx = field_expr (dst, new_name_expr ("x")); dy = field_expr (dst, new_name_expr ("y")); dz = field_expr (dst, new_name_expr ("z")); @@ -244,12 +247,12 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) append_expr (block, assign_expr (dz, sz)); } else { // guaranteed to have two or four elements - if (src->vector.list->next->next) { + if (count == 4) { // four vals: x, y, z, w - sx = src->vector.list; - sy = sx->next; - sz = sy->next; - sw = sz->next; + sx = components[0]; + sy = components[1]; + sz = components[2]; + sw = components[3]; dx = field_expr (dst, new_name_expr ("x")); dy = field_expr (dst, new_name_expr ("y")); dz = field_expr (dst, new_name_expr ("z")); @@ -260,8 +263,8 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) append_expr (block, assign_expr (dw, sw)); } else { // v, s - sv = src->vector.list; - ss = sv->next; + sv = components[0]; + ss = components[1]; dv = field_expr (dst, new_name_expr ("v")); ds = field_expr (dst, new_name_expr ("s")); append_expr (block, assign_expr (dv, sv)); @@ -274,7 +277,8 @@ static int copy_elements (expr_t *block, const expr_t *dst, const expr_t *src, int base) { int index = 0; - for (const expr_t *e = src->vector.list; e; e = e->next) { + for (auto li = src->vector.list.head; li; li = li->next) { + auto e = li->expr; if (e->type == ex_vector) { index += copy_elements (block, dst, e, index + base); } else { diff --git a/tools/qfcc/source/expr_vector.c b/tools/qfcc/source/expr_vector.c index 1dced7ec1..76a512994 100644 --- a/tools/qfcc/source/expr_vector.c +++ b/tools/qfcc/source/expr_vector.c @@ -132,14 +132,9 @@ new_vector_list (const expr_t *expr_list) return vec; } - for (int i = 0; i < count; i++) { - //FIXME this should use ex_list - ((expr_t *) elements[i])->next = (expr_t *) elements[i + 1]; - } - expr_t *vec = new_expr (); vec->type = ex_vector; vec->vector.type = vector_type (ele_type, width); - vec->vector.list = elements[0]; + list_gather (&vec->vector.list, elements, count); return vec; } diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index c529f37e6..52364bebd 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -1926,7 +1926,8 @@ static int statement_copy_elements (sblock_t **sblock, const expr_t *dst, const expr_t *src, int base) { int index = 0; - for (const expr_t *e = src->vector.list; e; e = e->next) { + for (auto li = src->vector.list.head; li; li = li->next) { + auto e = li->expr; if (e->type == ex_vector) { index += statement_copy_elements (sblock, dst, e, index + base); } else { @@ -2073,15 +2074,12 @@ build_bool_block (expr_t *block, expr_t *e) build_bool_block (block, (expr_t *) e->boolean.e); return; case ex_label: - e->next = 0; append_expr (block, e); return; case ex_assign: - e->next = 0; append_expr (block, e); return; case ex_branch: - e->next = 0; append_expr (block, e); return; case ex_expr: @@ -2089,7 +2087,6 @@ build_bool_block (expr_t *block, expr_t *e) build_bool_block (block, (expr_t *) e->expr.e1); build_bool_block (block, (expr_t *) e->expr.e2); } else { - e->next = 0; append_expr (block, e); } return;