From: Dodji Seketeli <dodji@seketeli.org>
To: Giuliano Procida <gprocida@google.com>
Cc: "Matthias Männich" <maennich@google.com>,
"Giuliano Procida via Libabigail" <libabigail@sourceware.org>,
kernel-team@android.com
Subject: [PATCH 3/3] reader: Use xmlFirstElementChild/xmlNextElementSibling to iterate over children elements
Date: Mon, 19 Apr 2021 16:03:27 +0200 [thread overview]
Message-ID: <877dkytlqo.fsf_-_@seketeli.org> (raw)
In-Reply-To: <87k0oytmsf.fsf@seketeli.org> (Dodji Seketeli's message of "Mon, 19 Apr 2021 15:40:48 +0200")
Hello,
Use xmlFirstElementChild/xmlNextElementSibling to iterate over element
children nodes rather than doing it by hand in the various for loops.
* src/abg-reader.cc (read_translation_unit)
(read_translation_unit_from_input, read_symbol_db_from_input)
(build_needed, read_elf_needed_from_input, build_namespace_decl)
(build_function_decl, build_function_type, build_array_type_def)
(build_enum_type_decl, build_class_decl, build_union_decl)
(build_union_decl, build_function_tdecl, build_class_tdecl)
(build_type_composition, build_template_tparameter): Use
xmlFirstElementChild/xmlNextElementSibling rather than poking at
xmlNode::children and looping over xmlNode::next by hand.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
src/abg-reader.cc | 187 +++++++++++++++++++---------------------------
1 file changed, 78 insertions(+), 109 deletions(-)
diff --git a/src/abg-reader.cc b/src/abg-reader.cc
index f5ed87b2..c214b755 100644
--- a/src/abg-reader.cc
+++ b/src/abg-reader.cc
@@ -1396,12 +1396,8 @@ read_translation_unit(read_context& ctxt, translation_unit& tu, xmlNodePtr node)
|| !ctxt.get_corpus())
walk_xml_node_to_map_type_ids(ctxt, node);
- for (xmlNodePtr n = node->children; n; n = n->next)
- {
- if (n->type != XML_ELEMENT_NODE)
- continue;
- handle_element_node(ctxt, n, /*add_decl_to_scope=*/true);
- }
+ for (xmlNodePtr n = node->children; n; n = xmlNextElementSibling(n))
+ handle_element_node(ctxt, n, /*add_decl_to_scope=*/true);
ctxt.pop_scope_or_abort(tu.get_global_scope());
@@ -1495,11 +1491,10 @@ read_translation_unit_from_input(read_context& ctxt)
else
{
node = 0;
- for (xmlNodePtr n = ctxt.get_corpus_node(); n; n = n->next)
+ for (xmlNodePtr n = ctxt.get_corpus_node();
+ n;
+ n = xmlNextElementSibling(n))
{
- if (!n
- || n->type != XML_ELEMENT_NODE)
- continue;
if (!xmlStrEqual(n->name, BAD_CAST("abi-instr")))
return nil;
node = n;
@@ -1595,11 +1590,8 @@ read_symbol_db_from_input(read_context& ctxt,
xmlTextReaderNext(reader.get());
}
else
- for (xmlNodePtr n = ctxt.get_corpus_node(); n; n = n->next)
+ for (xmlNodePtr n = ctxt.get_corpus_node(); n; n = xmlNextElementSibling(n))
{
- if (!n || n->type != XML_ELEMENT_NODE)
- continue;
-
bool has_fn_syms = false, has_var_syms = false;
if (xmlStrEqual(n->name, BAD_CAST("elf-function-symbols")))
has_fn_syms = true;
@@ -1647,10 +1639,9 @@ build_needed(xmlNode* node, vector<string>& needed)
if (!node || !xmlStrEqual(node->name,BAD_CAST("elf-needed")))
return false;
- for (xmlNodePtr n = node->children; n; n = n->next)
+ for (xmlNodePtr n = node->children; n; n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE
- || !xmlStrEqual(n->name, BAD_CAST("dependency")))
+ if (!xmlStrEqual(n->name, BAD_CAST("dependency")))
continue;
string name;
@@ -1703,10 +1694,10 @@ read_elf_needed_from_input(read_context& ctxt,
}
else
{
- for (xmlNodePtr n = ctxt.get_corpus_node(); n; n = n->next)
+ for (xmlNodePtr n = ctxt.get_corpus_node();
+ n;
+ n = xmlNextElementSibling(n))
{
- if (!n || n->type != XML_ELEMENT_NODE)
- continue;
if (!xmlStrEqual(n->name, BAD_CAST("elf-needed")))
return false;
node = n;
@@ -2746,12 +2737,10 @@ build_namespace_decl(read_context& ctxt,
ctxt.push_decl_to_current_scope(decl, add_to_current_scope);
ctxt.map_xml_node_to_decl(node, decl);
- for (xmlNodePtr n = node->children; n; n = n->next)
- {
- if (n->type != XML_ELEMENT_NODE)
- continue;
- handle_element_node(ctxt, n, /*add_to_current_scope=*/true);
- }
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
+ handle_element_node(ctxt, n, /*add_to_current_scope=*/true);
ctxt.pop_scope_or_abort(decl);
@@ -3104,12 +3093,11 @@ build_function_decl(read_context& ctxt,
std::vector<function_decl::parameter_sptr> parms;
type_base_sptr return_type = env->get_void_type();
- for (xmlNodePtr n = node->children; n ; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n ;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
- else if (xmlStrEqual(n->name, BAD_CAST("parameter")))
+ if (xmlStrEqual(n->name, BAD_CAST("parameter")))
{
if (function_decl::parameter_sptr p =
build_function_parameter(ctxt, n))
@@ -3797,12 +3785,11 @@ build_function_type(read_context& ctxt,
ctxt.get_translation_unit()->bind_function_type_life_time(fn_type);
ctxt.key_type_decl(fn_type, id);
- for (xmlNodePtr n = node->children; n ; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
- else if (xmlStrEqual(n->name, BAD_CAST("parameter")))
+ if (xmlStrEqual(n->name, BAD_CAST("parameter")))
{
if (function_decl::parameter_sptr p =
build_function_parameter(ctxt, n))
@@ -4033,12 +4020,11 @@ build_array_type_def(read_context& ctxt,
read_location(ctxt, node, loc);
array_type_def::subranges_type subranges;
- for (xmlNodePtr n = node->children; n ; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
- else if (xmlStrEqual(n->name, BAD_CAST("subrange")))
+ if (xmlStrEqual(n->name, BAD_CAST("subrange")))
{
if (array_type_def::subrange_sptr s =
build_subrange_type(ctxt, n))
@@ -4191,11 +4177,10 @@ build_enum_type_decl(read_context& ctxt,
string base_type_id;
enum_type_decl::enumerators enums;
- for (xmlNodePtr n = node->children; n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if (xmlStrEqual(n->name, BAD_CAST("underlying-type")))
{
xml_char_sptr a = xml::build_sptr(xmlGetProp(n, BAD_CAST("type-id")));
@@ -4562,11 +4547,10 @@ build_class_decl(read_context& ctxt,
decl->set_naming_typedef(naming_typedef);
}
- for (xmlNodePtr n = node->children; !is_decl_only && n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ !is_decl_only && n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if (xmlStrEqual(n->name, BAD_CAST("base-class")))
{
access_specifier access =
@@ -4613,11 +4597,10 @@ build_class_decl(read_context& ctxt,
ctxt.map_xml_node_to_decl(n, decl);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (type_base_sptr t =
build_type(ctxt, p, /*add_to_current_scope=*/true))
{
@@ -4651,11 +4634,10 @@ build_class_decl(read_context& ctxt,
bool is_static = false;
read_static(n, is_static);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (var_decl_sptr v =
build_var_decl(ctxt, p, /*add_to_cur_scope=*/false))
{
@@ -4709,11 +4691,10 @@ build_class_decl(read_context& ctxt,
bool is_ctor = false, is_dtor = false, is_const = false;
read_cdtor_const(n, is_ctor, is_dtor, is_const);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (function_decl_sptr f =
build_function_decl_if_not_suppressed(ctxt, p, decl,
/*add_to_cur_sc=*/true))
@@ -4748,11 +4729,10 @@ build_class_decl(read_context& ctxt,
bool is_ctor = false, is_dtor = false, is_const = false;
read_cdtor_const(n, is_ctor, is_dtor, is_const);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (shared_ptr<function_tdecl> f =
build_function_tdecl(ctxt, p,
/*add_to_current_scope=*/true))
@@ -4962,11 +4942,10 @@ build_union_decl(read_context& ctxt,
ctxt.map_xml_node_to_decl(node, decl);
ctxt.key_type_decl(decl, id);
- for (xmlNodePtr n = node->children; !is_decl_only && n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ !is_decl_only && n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if (xmlStrEqual(n->name, BAD_CAST("member-type")))
{
access_specifier access = private_access;
@@ -4974,11 +4953,10 @@ build_union_decl(read_context& ctxt,
ctxt.map_xml_node_to_decl(n, decl);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (type_base_sptr t =
build_type(ctxt, p, /*add_to_current_scope=*/true))
{
@@ -5006,11 +4984,10 @@ build_union_decl(read_context& ctxt,
bool is_static = false;
read_static(n, is_static);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (var_decl_sptr v =
build_var_decl(ctxt, p, /*add_to_cur_scope=*/false))
{
@@ -5048,11 +5025,10 @@ build_union_decl(read_context& ctxt,
bool is_ctor = false, is_dtor = false, is_const = false;
read_cdtor_const(n, is_ctor, is_dtor, is_const);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (function_decl_sptr f =
build_function_decl_if_not_suppressed(ctxt, p, decl,
/*add_to_cur_sc=*/true))
@@ -5081,11 +5057,10 @@ build_union_decl(read_context& ctxt,
bool is_ctor = false, is_dtor = false, is_const = false;
read_cdtor_const(n, is_ctor, is_dtor, is_const);
- for (xmlNodePtr p = n->children; p; p = p->next)
+ for (xmlNodePtr p = xmlFirstElementChild(n);
+ p;
+ p = xmlNextElementSibling(p))
{
- if (p->type != XML_ELEMENT_NODE)
- continue;
-
if (function_tdecl_sptr f =
build_function_tdecl(ctxt, p,
/*add_to_current_scope=*/true))
@@ -5160,11 +5135,10 @@ build_function_tdecl(read_context& ctxt,
ctxt.push_decl_to_current_scope(fn_tmpl_decl, add_to_current_scope);
unsigned parm_index = 0;
- for (xmlNodePtr n = node->children; n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if (template_parameter_sptr parm =
build_template_parameter(ctxt, n, parm_index, fn_tmpl_decl))
{
@@ -5224,11 +5198,10 @@ build_class_tdecl(read_context& ctxt,
ctxt.push_decl_to_current_scope(class_tmpl, add_to_current_scope);
unsigned parm_index = 0;
- for (xmlNodePtr n = node->children; n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if (template_parameter_sptr parm=
build_template_parameter(ctxt, n, parm_index, class_tmpl))
{
@@ -5343,11 +5316,10 @@ build_type_composition(read_context& ctxt,
ctxt.push_decl_to_current_scope(dynamic_pointer_cast<decl_base>(result),
/*add_to_current_scope=*/true);
- for (xmlNodePtr n = node->children; n; n = n->next)
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
if ((composed_type =
build_pointer_type_def(ctxt, n,
/*add_to_current_scope=*/true))
@@ -5473,18 +5445,15 @@ build_template_tparameter(read_context& ctxt,
// Go parse template parameters that are children nodes
int parm_index = 0;
- for (xmlNodePtr n = node->children; n; n = n->next)
- {
- if (n->type != XML_ELEMENT_NODE)
- continue;
-
- if (shared_ptr<template_parameter> p =
- build_template_parameter(ctxt, n, parm_index, result))
- {
- result->add_template_parameter(p);
- ++parm_index;
- }
- }
+ for (xmlNodePtr n = xmlFirstElementChild(node);
+ n;
+ n = xmlNextElementSibling(n))
+ if (shared_ptr<template_parameter> p =
+ build_template_parameter(ctxt, n, parm_index, result))
+ {
+ result->add_template_parameter(p);
+ ++parm_index;
+ }
if (result)
{
--
2.30.0
--
Dodji
next prev parent reply other threads:[~2021-04-19 14:03 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-31 9:23 [PATCH] XML reader: improve XML node traversal Giuliano Procida
2021-03-31 14:24 ` Matthias Maennich
2021-03-31 16:58 ` Giuliano Procida
2021-03-31 17:04 ` [PATCH v2] " Giuliano Procida
2021-04-06 11:48 ` Dodji Seketeli
2021-04-06 14:35 ` Giuliano Procida
2021-04-06 16:22 ` [PATCH v3] " Giuliano Procida
2021-04-06 17:39 ` [PATCH v4] " Giuliano Procida
2021-04-15 14:12 ` [PATCH v2, " Dodji Seketeli
2021-04-16 12:03 ` Giuliano Procida
2021-04-19 13:40 ` Dodji Seketeli
2021-04-19 14:00 ` Subject: [PATCH 1/3] reader: Handle 'abi-corpus' element being possibly empty Dodji Seketeli
2021-04-19 14:01 ` [PATCH 2/3] reader: Use xmlFirstElementChild and xmlNextElementSibling rather than xml::advance_to_next_sibling_element Dodji Seketeli
2021-04-19 14:03 ` Dodji Seketeli [this message]
2021-04-20 6:52 ` [PATCH 3/3] reader: Use xmlFirstElementChild/xmlNextElementSibling to iterate over children elements Giuliano Procida
2021-04-20 9:46 ` Dodji Seketeli
2021-05-03 15:18 ` Dodji Seketeli
2021-05-04 11:13 ` Giuliano Procida
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=877dkytlqo.fsf_-_@seketeli.org \
--to=dodji@seketeli.org \
--cc=gprocida@google.com \
--cc=kernel-team@android.com \
--cc=libabigail@sourceware.org \
--cc=maennich@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).