[qfcc] Rework binary_expr to be support matrices

And, nicely, simplify it quite a bit. I'm not sure why I didn't thinkg
of this approach before. While the ruamoko back-end doesn't support
matrices yet, the expressions are handled.

As a side effect, type checking on comparisons is "stricter" in that
more potentially bogus comparisons (eg, int-float) are caught, resulting
in a few warnings in ruamoko code and even finding a couple of bugs.
This commit is contained in:
Bill Currie 2024-12-05 00:13:56 +09:00
parent 8e2fe83c27
commit 674fbae225
11 changed files with 505 additions and 1258 deletions

View file

@ -53,7 +53,7 @@
@interface HUDAnimation : HUDObject @interface HUDAnimation : HUDObject
{ {
Array *frames; Array *frames;
int currentFrame; unsigned currentFrame;
float nextFrameTime; float nextFrameTime;
BOOL looping; BOOL looping;
} }

View file

@ -22,7 +22,7 @@
struct { struct {
qdb_state_t state; qdb_state_t state;
int depth; int depth;
int until_function; unsigned until_function;
} trace_cond; } trace_cond;
struct { struct {
int onEnter; int onEnter;

View file

@ -31,7 +31,7 @@ static string type_views[] = {
+(DefView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type +(DefView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type
{ {
string typename = nil; string typename = nil;
if (type.type == ty_alias) { if (type.meta == ty_alias) {
type = type.alias.aux_type; type = type.alias.aux_type;
} }
if (type.type >= 0 if (type.type >= 0

View file

@ -31,7 +31,7 @@ static string type_views[] = {
+(DefView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type +(DefView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type
{ {
string typename = nil; string typename = nil;
if (type.type == ty_alias) { if (type.meta == ty_alias) {
type = type.alias.aux_type; type = type.alias.aux_type;
} }
if (type.type >= 0 if (type.type >= 0

View file

@ -17,7 +17,7 @@ static void
trackCursor (Editor *self) trackCursor (Editor *self)
{ {
unsigned cx = [self.buffer charPos:self.line_index at:self.char_index]; unsigned cx = [self.buffer charPos:self.line_index at:self.char_index];
if (self.cursor.x != cx) { if ((unsigned) self.cursor.x != cx) {
if (self.char_index < [self.buffer getEOT]) { if (self.char_index < [self.buffer getEOT]) {
int c = [self.buffer getChar:self.char_index]; int c = [self.buffer getChar:self.char_index];
} }
@ -101,7 +101,7 @@ trackCursor (Editor *self)
unsigned tx = [buffer charPos:line_index at:char_index]; unsigned tx = [buffer charPos:line_index at:char_index];
cursorMode &= ~cmVInsert; cursorMode &= ~cmVInsert;
if (tx != cursor.x) { if (tx != (unsigned) cursor.x) {
if (char_index < [buffer getEOT]) { if (char_index < [buffer getEOT]) {
int c = [buffer getChar:char_index]; int c = [buffer getChar:char_index];

File diff suppressed because it is too large Load diff

View file

@ -146,7 +146,7 @@ quat_conj (const expr_t *e)
static const expr_t * static const expr_t *
int_negate (const expr_t *e) int_negate (const expr_t *e)
{ {
return new_int_expr (-expr_int (e), false); return new_int_expr (-expr_int (e), e->implicit);
} }
static const expr_t * static const expr_t *

View file

@ -1016,7 +1016,7 @@ qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
{ {
int ret = do_grab (tok->text); int ret = do_grab (tok->text);
if (ret >= 0) { if (ret >= 0) {
lval->expr = new_int_expr (ret, false); lval->expr = new_int_expr (ret, true);
token = QC_VALUE; token = QC_VALUE;
} else { } else {
yy_push_state (-ret, scanner); yy_push_state (-ret, scanner);

View file

@ -1481,12 +1481,13 @@ just_a_pointer:
ptr = new_alias_expr (ref->alias.type, ptr); ptr = new_alias_expr (ref->alias.type, ptr);
sblock = statement_subexpr (sblock, ptr, base); sblock = statement_subexpr (sblock, ptr, base);
if (is_constant (offs) if (is_constant (offs)
&& (const_offs = expr_int (offs)) < 32768 && (const_offs = expr_integral (offs)) < 32768
&& const_offs >= -32768) { && const_offs >= -32768) {
*mode = 2; *mode = 2;
*offset = short_operand (const_offs, ref); *offset = short_operand (const_offs, ref);
} else { } else {
*mode = 3; *mode = 3;
offs = cast_expr (&type_int, offs);
sblock = statement_subexpr (sblock, offs, offset); sblock = statement_subexpr (sblock, offs, offset);
} }
} }

View file

@ -869,7 +869,7 @@ base_type (const type_t *vec_type)
return algebra_base_type (vec_type); return algebra_base_type (vec_type);
} }
if (!is_math (vec_type)) { if (!is_math (vec_type)) {
return nullptr; return vec_type;
} }
if (is_bool (vec_type)) { if (is_bool (vec_type)) {
return &type_bool; return &type_bool;
@ -881,6 +881,9 @@ base_type (const type_t *vec_type)
if (is_quaternion (vec_type) || is_vector (vec_type)) { if (is_quaternion (vec_type) || is_vector (vec_type)) {
return &type_float; return &type_float;
} }
if (is_enum (vec_type)) {//FIXME enum should use valid ev_type
return type_default;
}
return ev_types[vec_type->type]; return ev_types[vec_type->type];
} }

View file

@ -5,7 +5,7 @@ int iter_check (unsigned count)
while (i-- > 0) { while (i-- > 0) {
iters++; iters++;
} }
return iters == count; return (unsigned) iters == count;
} }
int int