public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
From: Giuliano Procida <gprocida@google.com>
To: libabigail@sourceware.org
Cc: dodji@seketeli.org, kernel-team@android.com, gprocida@google.com,
	 maennich@google.com
Subject: [PATCH 2/3] abg-ir.cc: Refactor operator== methods with helper
Date: Wed,  8 Jul 2020 10:53:14 +0100	[thread overview]
Message-ID: <20200708095315.948634-3-gprocida@google.com> (raw)
In-Reply-To: <20200708095315.948634-1-gprocida@google.com>

Many of the operator== definitions in this source file follow the same
pattern:

- the address of the argument is dynamic_cast to type of 'this'
- naked canonical type pointers are compared, if both present
- the types are compared structurally with 'equals'

In a couple of cases extra work is done to fetch the canonical type
of the definition of a declaration.

This commit refactors all the common logic into a couple of templated
helper functions.

There are no behavioural changes.

	* src/abg-ir.cc (equality_helper): Add an overloaded function
	to perform the common actions needed for operator==. The first
	overload takes two extra canonical type pointer arguments
	while the second obtains these from the types being compared.
	(type_decl::operator==): Call equality_helper to perform
	canonical type pointer and 'equals' comparisons.
	(scope_type_decl::operator==): Likewise.
	(qualified_type_def::operator==): Likewise.
	(pointer_type_def::operator==): Likewise.
	(reference_type_def::operator==): Likewise.
	(array_type_def::subrange_type::operator==): Likewise.
	(array_type_def::operator==): Likewise.
	(enum_type_decl::operator==): Likewise.
	(typedef_decl::operator==): Likewise.
	(function_type::operator==): Likewise.
	(class_or_union::operator==): Likewise.
	(class_decl::operator==): Likewise.
	(union_decl::operator==): Likewise.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 src/abg-ir.cc | 104 ++++++++++++++------------------------------------
 1 file changed, 29 insertions(+), 75 deletions(-)

diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 41e2f00e..4b7e180d 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -651,6 +651,22 @@ struct type_name_comp
   {return operator()(type_base_sptr(l), type_base_sptr(r));}
 }; // end struct type_name_comp
 
+template<typename T>
+bool equality_helper(const T* lptr, const T* rptr,
+		     const type_base* lcanon,
+		     const type_base* rcanon)
+{
+  return lcanon && rcanon ? lcanon == rcanon : equals(*lptr, *rptr, 0);
+}
+
+template<typename T>
+bool equality_helper(const T* lptr, const T* rptr)
+{
+  return equality_helper(lptr, rptr,
+			 lptr->get_naked_canonical_type(),
+			 rptr->get_naked_canonical_type());
+}
+
 /// Getter of all types types sorted by their pretty representation.
 ///
 /// @return a sorted vector of all types sorted by their pretty
@@ -12690,11 +12706,7 @@ type_decl::operator==(const decl_base& o) const
   const type_decl* other = dynamic_cast<const type_decl*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Return true if both types equals.
@@ -12871,11 +12883,7 @@ scope_type_decl::operator==(const decl_base& o) const
   const scope_type_decl* other = dynamic_cast<const scope_type_decl*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Equality operator between two scope_type_decl.
@@ -13239,11 +13247,7 @@ qualified_type_def::operator==(const decl_base& o) const
     dynamic_cast<const qualified_type_def*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Equality operator for qualified types.
@@ -13610,14 +13614,7 @@ pointer_type_def::operator==(const decl_base& o) const
   const pointer_type_def* other = is_pointer_type(&o);
   if (!other)
     return false;
-
-  type_base* canonical_type = get_naked_canonical_type();
-  type_base* other_canonical_type = other->get_naked_canonical_type();
-
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Return true iff both instances of pointer_type_def are equal.
@@ -13921,14 +13918,7 @@ reference_type_def::operator==(const decl_base& o) const
     dynamic_cast<const reference_type_def*>(&o);
   if (!other)
     return false;
-
-  type_base* canonical_type = get_naked_canonical_type();
-  type_base* other_canonical_type = other->get_naked_canonical_type();
-
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Equality operator of the @ref reference_type_def type.
@@ -14470,11 +14460,7 @@ array_type_def::subrange_type::operator==(const decl_base& o) const
     dynamic_cast<const subrange_type*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Equality operator.
@@ -14792,11 +14778,7 @@ array_type_def::operator==(const decl_base& o) const
     dynamic_cast<const array_type_def*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 bool
@@ -15272,11 +15254,7 @@ enum_type_decl::operator==(const decl_base& o) const
   const enum_type_decl* op = dynamic_cast<const enum_type_decl*>(&o);
   if (!op)
     return false;
-
-  if (get_naked_canonical_type() && op->get_naked_canonical_type())
-    return get_naked_canonical_type() == op->get_naked_canonical_type();
-
-  return equals(*this, *op, 0);
+  return equality_helper(this, op);
 }
 
 /// Equality operator.
@@ -15626,11 +15604,7 @@ typedef_decl::operator==(const decl_base& o) const
   const typedef_decl* other = dynamic_cast<const typedef_decl*>(&o);
   if (!other)
     return false;
-
-  if (get_naked_canonical_type() && other->get_naked_canonical_type())
-    return get_naked_canonical_type() == other->get_naked_canonical_type();
-
-  return equals(*this, *other, 0);
+  return equality_helper(this, other);
 }
 
 /// Equality operator
@@ -16725,14 +16699,7 @@ function_type::operator==(const type_base& other) const
   const function_type* o = dynamic_cast<const function_type*>(&other);
   if (!o)
     return false;
-
-  type_base* canonical_type = get_naked_canonical_type();
-  type_base* other_canonical_type = other.get_naked_canonical_type();
-
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *o, 0);
+  return equality_helper(this, o);
 }
 
 /// Return a copy of the pretty representation of the current @ref
@@ -19107,10 +19074,7 @@ class_or_union::operator==(const decl_base& other) const
     other_canonical_type =
       op->get_naked_definition_of_declaration()->get_naked_canonical_type();
 
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *op, 0);
+  return equality_helper(this, op, canonical_type, other_canonical_type);
 }
 
 /// Equality operator.
@@ -20961,10 +20925,7 @@ class_decl::operator==(const decl_base& other) const
     other_canonical_type =
       op->get_naked_definition_of_declaration()->get_naked_canonical_type();
 
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *op, 0);
+  return equality_helper(this, op, canonical_type, other_canonical_type);
 }
 
 /// Equality operator for class_decl.
@@ -21745,14 +21706,7 @@ union_decl::operator==(const decl_base& other) const
   const union_decl* op = dynamic_cast<const union_decl*>(&other);
   if (!op)
     return false;
-
-  type_base *canonical_type = get_naked_canonical_type(),
-    *other_canonical_type = op->get_naked_canonical_type();
-
-  if (canonical_type && other_canonical_type)
-    return canonical_type == other_canonical_type;
-
-  return equals(*this, *op, 0);
+  return equality_helper(this, op);
 }
 
 /// Equality operator for union_decl.
-- 
2.27.0.383.g050319c2ae-goog


  parent reply	other threads:[~2020-07-08  9:53 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-08  9:53 [PATCH 0/3] Type equality refactor and instrumentation Giuliano Procida
2020-07-08  9:53 ` [PATCH 1/3] abg-ir.cc: Tidy some operator== definitions Giuliano Procida
2020-07-08  9:53 ` Giuliano Procida [this message]
2020-07-27  7:56   ` [PATCH 2/3] abg-ir.cc: Refactor operator== methods with helper Dodji Seketeli
2020-07-27 10:36     ` Giuliano Procida
2020-07-27 16:12       ` Dodji Seketeli
2020-07-08  9:53 ` [PATCH 3/3] Add some type equality paranoia Giuliano Procida
2020-07-27  7:32 ` [PATCH 0/3] Type equality refactor and instrumentation Dodji Seketeli
2020-07-27 10:55   ` 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=20200708095315.948634-3-gprocida@google.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).