mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-16 06:11:15 +00:00
[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:
parent
ef807f411e
commit
7f42677a34
6 changed files with 23 additions and 42 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue