[qfcc] Make a general integral value extractor

All too often I just want the value.
This commit is contained in:
Bill Currie 2020-03-17 11:07:50 +09:00
parent 80967e1471
commit c3f04384d5
2 changed files with 58 additions and 0 deletions

View file

@ -567,6 +567,8 @@ unsigned expr_uinteger (expr_t *e) __attribute__((pure));
expr_t *new_short_expr (short short_val);
short expr_short (expr_t *e) __attribute__((pure));
int expr_integral (expr_t *e) __attribute__((pure));
/** Check of the expression refers to a constant value.
\param e The expression to check.
@ -613,7 +615,9 @@ int is_float_val (expr_t *e) __attribute__((pure));
int is_vector_val (expr_t *e) __attribute__((pure));
int is_quaternion_val (expr_t *e) __attribute__((pure));
int is_integer_val (expr_t *e) __attribute__((pure));
int is_uinteger_val (expr_t *e) __attribute__((pure));
int is_short_val (expr_t *e) __attribute__((pure));
int is_integral_val (expr_t *e) __attribute__((pure));
/** Create a reference to the global <code>.self</code> entity variable.

View file

@ -1082,6 +1082,26 @@ expr_integer (expr_t *e)
internal_error (e, "not an integer constant");
}
int
is_uinteger_val (expr_t *e)
{
if (e->type == ex_nil) {
return 1;
}
if (e->type == ex_value && e->e.value->lltype == ev_uinteger) {
return 1;
}
if (e->type == ex_symbol && e->e.symbol->sy_type == sy_const
&& is_integral (e->e.symbol->type)) {
return 1;
}
if (e->type == ex_def && e->e.def->constant
&& is_integral (e->e.def->type)) {
return 1;
}
return 0;
}
unsigned
expr_uinteger (expr_t *e)
{
@ -1139,6 +1159,40 @@ expr_short (expr_t *e)
internal_error (e, "not a short constant");
}
int
is_integral_val (expr_t *e)
{
if (is_constant (e)) {
if (is_integer_val (e)) {
return 1;
}
if (is_uinteger_val (e)) {
return 1;
}
if (is_short_val (e)) {
return 1;
}
}
return 0;
}
int
expr_integral (expr_t *e)
{
if (is_constant (e)) {
if (is_integer_val (e)) {
return expr_integer (e);
}
if (is_uinteger_val (e)) {
return expr_uinteger (e);
}
if (is_short_val (e)) {
return expr_short (e);
}
}
internal_error (e, "not an integral constant");
}
expr_t *
new_alias_expr (type_t *type, expr_t *expr)
{