public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
From: Giuliano Procida <gprocida@google.com>
To: Dodji Seketeli <dodji@seketeli.org>
Cc: "Matthias Männich" <maennich@google.com>,
	"Giuliano Procida via Libabigail" <libabigail@sourceware.org>,
	kernel-team@android.com
Subject: Re: [PATCH 3/3] reader: Use xmlFirstElementChild/xmlNextElementSibling to iterate over children elements
Date: Tue, 20 Apr 2021 07:52:52 +0100	[thread overview]
Message-ID: <CAGvU0H=2XMOV-XwJvP9QVLqMsmwgKhoGOcpotPrCMUBX_PH2aA@mail.gmail.com> (raw)
In-Reply-To: <877dkytlqo.fsf_-_@seketeli.org>

Hi.

I had a quick look and there's (at least) one place where there still a
direct access to ->children. The code works because there are separate
tests to not process wrong nodes, but it would be neater to use the first
element child function uniformly (as well).

Regards,
Giuliano.

On Mon, 19 Apr 2021, 15:03 Dodji Seketeli, <dodji@seketeli.org> wrote:

> 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
>

  reply	other threads:[~2021-04-20  6:53 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             ` [PATCH 3/3] reader: Use xmlFirstElementChild/xmlNextElementSibling to iterate over children elements Dodji Seketeli
2021-04-20  6:52               ` Giuliano Procida [this message]
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='CAGvU0H=2XMOV-XwJvP9QVLqMsmwgKhoGOcpotPrCMUBX_PH2aA@mail.gmail.com' \
    --to=gprocida@google.com \
    --cc=dodji@seketeli.org \
    --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).