aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-12-12 17:29:52 +0000
committergingerBill <bill@gingerbill.org>2023-12-12 17:29:52 +0000
commitbf9ae77fbd986d7a669eb08bc1a6080cf028a000 (patch)
tree965f84a34eb7b446a0f58842548d1a53d4d8732a /src
parent4adfc120ba6fc82a9c049232c2ed72dac7bf516f (diff)
Remove duplicates from `init`/`fini` procedure list
Diffstat (limited to 'src')
-rw-r--r--src/checker.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index f17f50544..2c6878eca 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -5979,6 +5979,32 @@ gb_internal GB_COMPARE_PROC(fini_procedures_cmp) {
gb_internal void check_sort_init_and_fini_procedures(Checker *c) {
gb_sort_array(c->info.init_procedures.data, c->info.init_procedures.count, init_procedures_cmp);
gb_sort_array(c->info.fini_procedures.data, c->info.fini_procedures.count, fini_procedures_cmp);
+
+ // NOTE(bill): remove possible duplicates from the init/fini lists
+ // NOTE(bill): because the arrays are sorted, you only need to check the previous element
+ Entity *prev = nullptr;
+
+ for (isize i = 0; i < c->info.init_procedures.count; /**/) {
+ Entity *curr = c->info.init_procedures[i];
+ if (prev == curr) {
+ array_ordered_remove(&c->info.init_procedures, i);
+ } else {
+ prev = curr;
+ i += 1;
+ }
+ }
+
+ prev = nullptr;
+
+ for (isize i = 0; i < c->info.fini_procedures.count; /**/) {
+ Entity *curr = c->info.fini_procedures[i];
+ if (prev == curr) {
+ array_ordered_remove(&c->info.fini_procedures, i);
+ } else {
+ prev = curr;
+ i += 1;
+ }
+ }
}
gb_internal void add_type_info_for_type_definitions(Checker *c) {