get_canonical_type_for: restore environment better

Message ID 20200617161720.37446-1-gprocida@google.com
State Committed
Headers
Series get_canonical_type_for: restore environment better |

Commit Message

Giuliano Procida June 17, 2020, 4:17 p.m. UTC
  The method type_base::get_canonical_type_for contains some logic which
temporarily changes a couple of control flags in the type's
environment. It then restores these, but not consistently.

This patch ensures the flags are restored unconditionally.

	* src/abg-ir.cc (get_canonical_type_for): Ensure the
	do_on_the_fly_canonicalization and
	decl_only_class_equals_definition flags are restored
	unconditionally.

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

Comments

Dodji Seketeli June 24, 2020, 5:40 a.m. UTC | #1
Giuliano Procida <gprocida@google.com> a écrit:

> The method type_base::get_canonical_type_for contains some logic which
> temporarily changes a couple of control flags in the type's
> environment. It then restores these, but not consistently.
>
> This patch ensures the flags are restored unconditionally.
>
> 	* src/abg-ir.cc (get_canonical_type_for): Ensure the
> 	do_on_the_fly_canonicalization and
> 	decl_only_class_equals_definition flags are restored
> 	unconditionally.
>
> Signed-off-by: Giuliano Procida <gprocida@google.com>

Applied to master, thanks! 

Cheers,
  

Patch

diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 5e2506a2..f3801d56 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -11912,26 +11912,19 @@  type_base::get_canonical_type_for(type_base_sptr t)
 	  // Compare types by considering that decl-only classes don't
 	  // equal their definition.
 	  env->decl_only_class_equals_definition(false);
-	  if (types_defined_same_linux_kernel_corpus_public(**it, *t))
-	    {
-	      result = *it;
-	      break;
-	    }
-	  if (*it == t)
+	  bool equal = types_defined_same_linux_kernel_corpus_public(**it, *t)
+		       || *it == t;
+	  // Restore the state of the on-the-fly-canonicalization and
+	  // the decl-only-class-being-equal-to-a-matching-definition
+	  // flags.
+	  env->do_on_the_fly_canonicalization(false);
+	  env->decl_only_class_equals_definition
+	    (saved_decl_only_class_equals_definition);
+	  if (equal)
 	    {
-	      // Restore the state of the on-the-fly-canonicalization
-	      // and the
-	      // decl-only-class-being-equal-to-a-matching-definition
-	      // flags, as we are getting out of the loop.
-	      env->do_on_the_fly_canonicalization(false);
-	      env->decl_only_class_equals_definition
-		(saved_decl_only_class_equals_definition);
 	      result = *it;
 	      break;
 	    }
-	  env->do_on_the_fly_canonicalization(false);
-	  env->decl_only_class_equals_definition
-	    (saved_decl_only_class_equals_definition);
 	}
       if (!result)
 	{