Module Name: src Committed By: rillig Date: Sat Dec 18 11:25:15 UTC 2021
Modified Files: src/usr.bin/xlint/lint1: init.c Log Message: lint: use vector instead of list for designation in initialization This change is a prerequisite for fixing the current bugs in handling initializations. Part of the fix will be designation_pop, which is costly for a singly linked list. As a side benefit, memory management becomes simpler and needs fewer malloc calls. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.217 -r1.218 src/usr.bin/xlint/lint1/init.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/init.c diff -u src/usr.bin/xlint/lint1/init.c:1.217 src/usr.bin/xlint/lint1/init.c:1.218 --- src/usr.bin/xlint/lint1/init.c:1.217 Fri Dec 17 17:27:19 2021 +++ src/usr.bin/xlint/lint1/init.c Sat Dec 18 11:25:15 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.217 2021/12/17 17:27:19 rillig Exp $ */ +/* $NetBSD: init.c,v 1.218 2021/12/18 11:25:15 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: init.c,v 1.217 2021/12/17 17:27:19 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.218 2021/12/18 11:25:15 rillig Exp $"); #endif #include <stdlib.h> @@ -97,7 +97,6 @@ __RCSID("$NetBSD: init.c,v 1.217 2021/12 struct designator { const char *dr_name; /* for struct and union */ size_t dr_subscript; /* for array */ - struct designator *dr_next; }; /* @@ -108,8 +107,9 @@ struct designator { * C99 6.7.8p6, 6.7.8p7 */ struct designation { - struct designator *dn_head; - struct designator *dn_tail; + struct designator *dn_items; + size_t dn_len; + size_t dn_cap; }; /* @@ -371,25 +371,6 @@ check_init_expr(const type_t *tp, sym_t } -static struct designator * -designator_new(const char *name, size_t subscript) -{ - struct designator *dr; - - dr = xcalloc(1, sizeof(*dr)); - dr->dr_name = name; - dr->dr_subscript = subscript; - return dr; -} - -static void -designator_free(struct designator *dr) -{ - - free(dr); -} - - static const type_t * designator_look_up(const struct designator *dr, const type_t *tp) { @@ -427,14 +408,15 @@ designator_look_up(const struct designat static void designation_debug(const struct designation *dn) { - const struct designator *dr; + size_t i; - if (dn->dn_head == NULL) + if (dn->dn_len == 0) return; debug_indent(); debug_printf("designation: "); - for (dr = dn->dn_head; dr != NULL; dr = dr->dr_next) { + for (i = 0; i < dn->dn_len; i++) { + const struct designator *dr = dn->dn_items + i; if (dr->dr_name != NULL) { debug_printf(".%s", dr->dr_name); lint_assert(dr->dr_subscript == 0); @@ -450,17 +432,16 @@ designation_debug(const struct designati static void designation_add(struct designation *dn, const char *name, size_t subscript) { - struct designator *dr; - dr = designator_new(name, subscript); - - if (dn->dn_head != NULL) { - dn->dn_tail->dr_next = dr; - dn->dn_tail = dr; - } else { - dn->dn_head = dr; - dn->dn_tail = dr; + if (dn->dn_len == dn->dn_cap) { + dn->dn_cap += 4; + dn->dn_items = xrealloc(dn->dn_items, + dn->dn_cap * sizeof(dn->dn_items[0])); } + + dn->dn_items[dn->dn_len].dr_name = name; + dn->dn_items[dn->dn_len].dr_subscript = subscript; + dn->dn_len++; } /* @@ -472,25 +453,25 @@ designation_add(struct designation *dn, static const type_t * designation_look_up(const struct designation *dn, const type_t *tp) { - const struct designator *dr; + size_t i; - for (dr = dn->dn_head; dr != NULL && tp != NULL; dr = dr->dr_next) - tp = designator_look_up(dr, tp); + for (i = 0; i < dn->dn_len && tp != NULL; i++) + tp = designator_look_up(dn->dn_items + i, tp); return tp; } static void designation_reset(struct designation *dn) { - struct designator *dr, *next; - for (dr = dn->dn_head; dr != NULL; dr = next) { - next = dr->dr_next; - designator_free(dr); - } + dn->dn_len = 0; +} - dn->dn_head = NULL; - dn->dn_tail = NULL; +static void +designation_free(struct designation *dn) +{ + + free(dn->dn_items); } @@ -512,7 +493,7 @@ static void brace_level_free(struct brace_level *bl) { - designation_reset(&bl->bl_designation); + designation_free(&bl->bl_designation); free(bl); } @@ -542,7 +523,7 @@ static const type_t * brace_level_sub_type(const struct brace_level *bl, bool is_string) { - if (bl->bl_designation.dn_head != NULL) + if (bl->bl_designation.dn_len > 0) return designation_look_up(&bl->bl_designation, bl->bl_type); switch (bl->bl_type->t_tspec) { @@ -583,10 +564,11 @@ brace_level_sub_type(const struct brace_ static void brace_level_apply_designation(struct brace_level *bl) { - const struct designator *dr = bl->bl_designation.dn_head; + const struct designator *dr; - if (dr == NULL) + if (bl->bl_designation.dn_len == 0) return; + dr = &bl->bl_designation.dn_items[0]; designation_debug(&bl->bl_designation);