From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gproxy3-pub.mail.unifiedlayer.com (gproxy3-pub.mail.unifiedlayer.com [69.89.30.42]) by sourceware.org (Postfix) with ESMTPS id AE21B385B513 for ; Fri, 20 Jan 2023 21:46:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE21B385B513 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com Received: from cmgw12.mail.unifiedlayer.com (unknown [10.0.90.127]) by progateway5.mail.pro1.eigbox.com (Postfix) with ESMTP id DCD541004A844 for ; Fri, 20 Jan 2023 21:46:38 +0000 (UTC) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTP id IzDap9956iOW0IzDapygEN; Fri, 20 Jan 2023 21:46:38 +0000 X-Authority-Reason: nr=8 X-Authority-Analysis: v=2.4 cv=S5kcfKgP c=1 sm=1 tr=0 ts=63cb0bbe a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=RvmDmJFTN0MA:10:nop_rcvd_month_year a=Qbun_eYptAEA:10:endurance_base64_authed_username_1 a=mTsGrRJ_k39uHTPAlbMA:9 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Vy5C6aq2eK6V2ijAeZMBkBV0NjCJmWJK49u6xHWxwRc=; b=WkgRFcQa04bNEGNakLirQwnoUP EiP/6rxqcPGE2h5dUg5HhqBhCp2ssXJh5eOyGwWBVhoCsbC+94V+geZeMsy4/mQLl+VU1LjXct4V/ SS7TG4e366yqqUStENdyrCAAG; Received: from 97-122-76-186.hlrn.qwest.net ([97.122.76.186]:60138 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pIzDa-001GGF-Ks; Fri, 20 Jan 2023 14:46:38 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 17/27] Combine both styles of block iterator Date: Fri, 20 Jan 2023 14:46:08 -0700 Message-Id: <20230120214618.3236224-18-tom@tromey.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230120214618.3236224-1-tom@tromey.com> References: <20230120214618.3236224-1-tom@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.76.186 X-Source-L: No X-Exim-ID: 1pIzDa-001GGF-Ks X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-76-186.hlrn.qwest.net (localhost.localdomain) [97.122.76.186]:60138 X-Source-Auth: tom+tromey.com X-Email-Count: 18 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-3027.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,JMQ_SPF_NEUTRAL,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This merges the two styles of block iterator, having the initialization API decide which to use based on an optional parameter. --- gdb/ada-lang.c | 4 ++-- gdb/block.c | 54 ++++++++++++++++++++------------------------------ gdb/block.h | 30 ++++++++-------------------- 3 files changed, 32 insertions(+), 56 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index c04d75590fb..4d2873cfde4 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6085,9 +6085,9 @@ ada_add_block_symbols (std::vector &result, arg_sym = NULL; found_sym = false; - for (sym = block_iter_match_first (block, lookup_name, &iter); + for (sym = block_iterator_first (block, &iter, &lookup_name); sym != NULL; - sym = block_iter_match_next (&iter)) + sym = block_iterator_next (&iter)) { if (symbol_matches_domain (sym->language (), sym->domain (), domain)) { diff --git a/gdb/block.c b/gdb/block.c index e56c95013b8..e7a51af8cea 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -556,31 +556,6 @@ block_iterator_step (struct block_iterator *iterator, int first) } } -/* See block.h. */ - -struct symbol * -block_iterator_first (const struct block *block, - struct block_iterator *iterator) -{ - initialize_block_iterator (block, iterator); - - if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iterator_first (block->multidict (), &iterator->mdict_iter); - - return block_iterator_step (iterator, 1); -} - -/* See block.h. */ - -struct symbol * -block_iterator_next (struct block_iterator *iterator) -{ - if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iterator_next (&iterator->mdict_iter); - - return block_iterator_step (iterator, 0); -} - /* Perform a single step for a "match" block iterator, iterating across symbol tables as needed. Returns the next symbol, or NULL when iteration is complete. */ @@ -626,14 +601,23 @@ block_iter_match_step (struct block_iterator *iterator, /* See block.h. */ struct symbol * -block_iter_match_first (const struct block *block, - const lookup_name_info &name, - struct block_iterator *iterator) +block_iterator_first (const struct block *block, + struct block_iterator *iterator, + const lookup_name_info *name) { - initialize_block_iterator (block, iterator, &name); + initialize_block_iterator (block, iterator, name); + + if (name == nullptr) + { + if (iterator->which == FIRST_LOCAL_BLOCK) + return mdict_iterator_first (block->multidict (), + &iterator->mdict_iter); + + return block_iterator_step (iterator, 1); + } if (iterator->which == FIRST_LOCAL_BLOCK) - return mdict_iter_match_first (block->multidict (), name, + return mdict_iter_match_first (block->multidict (), *name, &iterator->mdict_iter); return block_iter_match_step (iterator, 1); @@ -642,9 +626,15 @@ block_iter_match_first (const struct block *block, /* See block.h. */ struct symbol * -block_iter_match_next (struct block_iterator *iterator) +block_iterator_next (struct block_iterator *iterator) { - gdb_assert (iterator->name != nullptr); + if (iterator->name == nullptr) + { + if (iterator->which == FIRST_LOCAL_BLOCK) + return mdict_iterator_next (&iterator->mdict_iter); + + return block_iterator_step (iterator, 0); + } if (iterator->which == FIRST_LOCAL_BLOCK) return mdict_iter_match_next (*iterator->name, &iterator->mdict_iter); diff --git a/gdb/block.h b/gdb/block.h index 5fc41c6df02..03aeebddc6b 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -471,10 +471,13 @@ struct block_iterator }; /* Initialize ITERATOR to point at the first symbol in BLOCK, and - return that first symbol, or NULL if BLOCK is empty. */ + return that first symbol, or NULL if BLOCK is empty. If NAME is + not NULL, only return symbols matching that name. */ -extern struct symbol *block_iterator_first (const struct block *block, - struct block_iterator *iterator); +extern struct symbol *block_iterator_first + (const struct block *block, + struct block_iterator *iterator, + const lookup_name_info *name = nullptr); /* Advance ITERATOR, and return the next symbol, or NULL if there are no more symbols. Don't call this if you've previously received @@ -483,23 +486,6 @@ extern struct symbol *block_iterator_first (const struct block *block, extern struct symbol *block_iterator_next (struct block_iterator *iterator); -/* Initialize ITERATOR to point at the first symbol in BLOCK whose - search_name () matches NAME, and return that first symbol, or - NULL if there are no such symbols. */ - -extern struct symbol *block_iter_match_first (const struct block *block, - const lookup_name_info &name, - struct block_iterator *iterator); - -/* Advance ITERATOR to point at the next symbol in BLOCK whose - search_name () matches NAME, or NULL if there are no more such - symbols. Don't call this if you've previously received NULL from - block_iterator_match_first or block_iterator_match_next on this - iteration. And don't call it unless ITERATOR was created by a - previous call to block_iter_match_first. */ - -extern struct symbol *block_iter_match_next (struct block_iterator *iterator); - /* Return true if symbol A is the best match possible for DOMAIN. */ extern bool best_symbol (struct symbol *a, const domain_enum domain); @@ -574,9 +560,9 @@ extern int block_find_non_opaque_type_preferred (struct symbol *sym, current symbol. */ #define ALL_BLOCK_SYMBOLS_WITH_NAME(block, name, iter, sym) \ - for ((sym) = block_iter_match_first ((block), (name), &(iter)); \ + for ((sym) = block_iterator_first ((block), &(iter), &(name)); \ (sym) != NULL; \ - (sym) = block_iter_match_next (&(iter))) + (sym) = block_iterator_next (&(iter))) /* Given a vector of pairs, allocate and build an obstack allocated blockranges struct for a block. */ -- 2.39.0