[qfcc] Clean up the last general uses of expr's next

It's now meant only for ALLOC. Interestingly, when DEBUG_QF_MEMORY is
defined in expr.c, something breaks badly with vkgen (no sniffles out of
valgrind, though), but everything is fine with it not defined. It seems
there may be some unpleasant UB going on somewhere.
This commit is contained in:
Bill Currie 2023-10-02 21:38:16 +09:00
parent ef807f411e
commit 7f42677a34
6 changed files with 23 additions and 42 deletions

View file

@ -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

View file

@ -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</table>\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);
}

View file

@ -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);
}

View file

@ -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 {

View file

@ -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;
}

View file

@ -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;