mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
allow initialized globals (since they're constant) to be used in most places
constants are required (switch, initializing globals, enums)
This commit is contained in:
parent
11596e4b42
commit
ef762e21eb
4 changed files with 36 additions and 0 deletions
|
@ -150,6 +150,8 @@ expr_t *new_integer_expr (int integer_val);
|
||||||
expr_t *new_uinteger_expr (unsigned int uinteger_val);
|
expr_t *new_uinteger_expr (unsigned int uinteger_val);
|
||||||
expr_t *new_short_expr (short short_val);
|
expr_t *new_short_expr (short short_val);
|
||||||
|
|
||||||
|
expr_t *constant_expr (expr_t *var);
|
||||||
|
|
||||||
expr_t *new_bind_expr (expr_t *e1, expr_t *e2);
|
expr_t *new_bind_expr (expr_t *e1, expr_t *e2);
|
||||||
expr_t *new_self_expr (void);
|
expr_t *new_self_expr (void);
|
||||||
expr_t *new_this_expr (void);
|
expr_t *new_this_expr (void);
|
||||||
|
|
|
@ -605,6 +605,32 @@ new_short_expr (short short_val)
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr_t *
|
||||||
|
constant_expr (expr_t *var)
|
||||||
|
{
|
||||||
|
if (var->type != ex_def || !var->e.def->constant) {
|
||||||
|
error (var, "internal error");
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
switch (var->e.def->type->type) {
|
||||||
|
case ev_string:
|
||||||
|
return new_string_expr (G_GETSTR (var->e.def->ofs));
|
||||||
|
case ev_float:
|
||||||
|
return new_float_expr (G_FLOAT (var->e.def->ofs));
|
||||||
|
case ev_vector:
|
||||||
|
return new_vector_expr (G_VECTOR (var->e.def->ofs));
|
||||||
|
case ev_field:
|
||||||
|
return new_field_expr (G_var (integer, var->e.def->ofs));
|
||||||
|
case ev_integer:
|
||||||
|
return new_integer_expr (G_INT (var->e.def->ofs));
|
||||||
|
case ev_uinteger:
|
||||||
|
return new_uinteger_expr (G_INT (var->e.def->ofs));
|
||||||
|
default:
|
||||||
|
error (var, "internal error");
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
expr_t *
|
expr_t *
|
||||||
new_bind_expr (expr_t *e1, expr_t *e2)
|
new_bind_expr (expr_t *e1, expr_t *e2)
|
||||||
{
|
{
|
||||||
|
@ -2309,6 +2335,8 @@ init_elements (def_t *def, expr_t *eles)
|
||||||
count = def->type->num_parms;
|
count = def->type->num_parms;
|
||||||
}
|
}
|
||||||
for (i = 0, e = eles->e.block.head; i < count; i++, e = e->next) {
|
for (i = 0, e = eles->e.block.head; i < count; i++, e = e->next) {
|
||||||
|
if (e->type == ex_def && e->e.def->constant)
|
||||||
|
e = constant_expr (e);
|
||||||
if (e->type == ex_block) {
|
if (e->type == ex_block) {
|
||||||
warning (e, "not yet implemented");
|
warning (e, "not yet implemented");
|
||||||
} else if (e->type >= ex_string) {
|
} else if (e->type >= ex_string) {
|
||||||
|
|
|
@ -275,6 +275,8 @@ enum
|
||||||
| NAME '=' expr
|
| NAME '=' expr
|
||||||
{
|
{
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
|
if ($3->type == ex_def && $3->e.def->constant)
|
||||||
|
$3 = constant_expr ($3);
|
||||||
if ($3->type < ex_string) {
|
if ($3->type < ex_string) {
|
||||||
error ($3, "non-constant initializer");
|
error ($3, "non-constant initializer");
|
||||||
} else if ($3->type != ex_integer) {
|
} else if ($3->type != ex_integer) {
|
||||||
|
@ -413,6 +415,8 @@ var_initializer
|
||||||
assign_expr (new_def_expr ($<def>0), $2));
|
assign_expr (new_def_expr ($<def>0), $2));
|
||||||
def_initialized ($<def>0);
|
def_initialized ($<def>0);
|
||||||
} else {
|
} else {
|
||||||
|
if ($2->type == ex_def && $2->e.def->constant)
|
||||||
|
$2 = constant_expr ($2);
|
||||||
if ($2->type >= ex_string) {
|
if ($2->type >= ex_string) {
|
||||||
if ($<def>0->constant) {
|
if ($<def>0->constant) {
|
||||||
error ($2, "%s re-initialized", $<def>0->name);
|
error ($2, "%s re-initialized", $<def>0->name);
|
||||||
|
|
|
@ -96,6 +96,8 @@ case_label_expr (switch_block_t *switch_block, expr_t *value)
|
||||||
|
|
||||||
if (value)
|
if (value)
|
||||||
convert_name (value);
|
convert_name (value);
|
||||||
|
if (value->type == ex_def && value->e.def->constant)
|
||||||
|
value = constant_expr (value);
|
||||||
if (value && value->type < ex_string) {
|
if (value && value->type < ex_string) {
|
||||||
error (value, "non-constant case value");
|
error (value, "non-constant case value");
|
||||||
free (cl);
|
free (cl);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue