aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-01-11 18:10:27 +0000
committergingerBill <bill@gingerbill.org>2023-01-11 18:10:27 +0000
commit7124d541a132fc94b2c66c54bd73eb0d103ce3d3 (patch)
treef0eb8f42e5ebc9ec6ac1ff332e09754a804c9a86 /src/types.cpp
parent3c7e45a46fc68426641047a540d4cb50b0fbd9c8 (diff)
General optimizations
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp54
1 files changed, 52 insertions, 2 deletions
diff --git a/src/types.cpp b/src/types.cpp
index 99f393cc5..69c1ebe68 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -2528,9 +2528,58 @@ gb_internal bool lookup_subtype_polymorphic_selection(Type *dst, Type *src, Sele
gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple_names);
gb_internal bool are_types_identical(Type *x, Type *y) {
+ if (x == y) {
+ return true;
+ }
+
+ if ((x == nullptr && y != nullptr) ||
+ (x != nullptr && y == nullptr)) {
+ return false;
+ }
+
+ if (x->kind == Type_Named) {
+ Entity *e = x->Named.type_name;
+ if (e->TypeName.is_type_alias) {
+ x = x->Named.base;
+ }
+ }
+ if (y->kind == Type_Named) {
+ Entity *e = y->Named.type_name;
+ if (e->TypeName.is_type_alias) {
+ y = y->Named.base;
+ }
+ }
+ if (x->kind != y->kind) {
+ return false;
+ }
+
return are_types_identical_internal(x, y, false);
}
gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) {
+ if (x == y) {
+ return true;
+ }
+
+ if (!x | !y) {
+ return false;
+ }
+
+ if (x->kind == Type_Named) {
+ Entity *e = x->Named.type_name;
+ if (e->TypeName.is_type_alias) {
+ x = x->Named.base;
+ }
+ }
+ if (y->kind == Type_Named) {
+ Entity *e = y->Named.type_name;
+ if (e->TypeName.is_type_alias) {
+ y = y->Named.base;
+ }
+ }
+ if (x->kind != y->kind) {
+ return false;
+ }
+
return are_types_identical_internal(x, y, true);
}
@@ -2540,11 +2589,11 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple
return true;
}
- if ((x == nullptr && y != nullptr) ||
- (x != nullptr && y == nullptr)) {
+ if (!x | !y) {
return false;
}
+ #if 0
if (x->kind == Type_Named) {
Entity *e = x->Named.type_name;
if (e->TypeName.is_type_alias) {
@@ -2560,6 +2609,7 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple
if (x->kind != y->kind) {
return false;
}
+ #endif
switch (x->kind) {
case Type_Generic: