From 3ea67fa6af035b3f5b2865e6eeb39ceea49bf07c Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Wed, 19 Jun 2024 21:04:17 +0200 Subject: Add f32 and f64 as types --- src/analyzer.c | 5 +++-- src/analyzer.h | 15 ++------------- src/primitives.gperf | 28 +++++++++++++++------------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/analyzer.c b/src/analyzer.c index 4d41a33..dc22190 100644 --- a/src/analyzer.c +++ b/src/analyzer.c @@ -292,6 +292,7 @@ typecompat(struct type lhs, struct type rhs) return true; /* Two typed numeric types are only compatible if they have the same size - and sign */ - return lhs.issigned == rhs.issigned && lhs.size == rhs.size; + and sign and are either both integral or both floats */ + return lhs.issigned == rhs.issigned && lhs.isfloat == rhs.isfloat + && lhs.size == rhs.size; } diff --git a/src/analyzer.h b/src/analyzer.h index 5e28903..261427c 100644 --- a/src/analyzer.h +++ b/src/analyzer.h @@ -9,20 +9,8 @@ enum { TYPE_UNSET = 0, TYPE_CHECKING = 1, - TYPE_NUM, - - /* Floating point numbers */ - TYPE_F16, - TYPE_F32, - TYPE_F64, - - /* Unicode codepoint */ - TYPE_RUNE, - - /* Function type */ TYPE_FN, - _TYPE_LAST_ENT, }; @@ -32,8 +20,9 @@ static_assert(_TYPE_LAST_ENT - 1 <= (type_kind_t_)-1, struct type { type_kind_t_ kind; - uint8_t size : 7; /* bytes */ + uint8_t size : 6; /* bytes */ bool issigned : 1; + bool isfloat : 1; /* For functions */ const struct type *params, *ret; diff --git a/src/primitives.gperf b/src/primitives.gperf index 4391565..09d9b68 100644 --- a/src/primitives.gperf +++ b/src/primitives.gperf @@ -16,19 +16,21 @@ struct typeslot { char *name; struct type inner; }; %% -i8, { TYPE_NUM, 1, true } -i16, { TYPE_NUM, 2, true } -i32, { TYPE_NUM, 4, true } -i64, { TYPE_NUM, 8, true } -i128, { TYPE_NUM, 16, true } -int, { TYPE_NUM, 8, true } -u8, { TYPE_NUM, 1, false } -u16, { TYPE_NUM, 2, false } -u32, { TYPE_NUM, 4, false } -u64, { TYPE_NUM, 8, false } -u128, { TYPE_NUM, 16, false } -uint, { TYPE_NUM, 8, false } -rune, { TYPE_NUM , 4, true } +i8, { TYPE_NUM, 1, true, false } +i16, { TYPE_NUM, 2, true, false } +i32, { TYPE_NUM, 4, true, false } +i64, { TYPE_NUM, 8, true, false } +i128, { TYPE_NUM, 16, true, false } +int, { TYPE_NUM, 8, true, false } +u8, { TYPE_NUM, 1, false, false } +u16, { TYPE_NUM, 2, false, false } +u32, { TYPE_NUM, 4, false, false } +u64, { TYPE_NUM, 8, false, false } +u128, { TYPE_NUM, 16, false, false } +uint, { TYPE_NUM, 8, false, false } +rune, { TYPE_NUM , 4, true, false } +f32, { TYPE_NUM, 4, true, true } +f64, { TYPE_NUM, 8, true, true } %% const struct type * typelookup(const uchar *p, size_t len) -- cgit v1.2.3