Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Keith Seitz <keiths@redhat.com>
To: gdb-patches@sourceware.org
Subject: [RFA] Cleanup in find_method
Date: Wed, 01 Dec 2010 22:58:00 -0000	[thread overview]
Message-ID: <4CF6D1E3.6070709@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 593 bytes --]

Hi,

While bashing my brains against decode_compound today, I noticed that 
name canonicalization in find_method is done inside a loop, and it 
doesn't need to be.

I've also taken a small liberty, adding a cleanup for it, just in case 
something freaky happens inside find_function_start_sal. I don't think 
that this function can fail in this specific case, but call me paranoid. 
It doesn't hurt.

Comments?
Keith

ChangeLog
2010-12-01  Keith Seitz  <keiths@valrhona.uglyboxes.com>

	* linespec.c (find_method): Move name canonicalization outside
	the loop.
	Be paranoid and use a cleanup.

[-- Attachment #2: find_method-canon-cleanup.patch --]
[-- Type: text/plain, Size: 1380 bytes --]

Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.104
diff -u -p -r1.104 linespec.c
--- linespec.c	13 Jul 2010 20:07:44 -0000	1.104
+++ linespec.c	1 Dec 2010 22:47:09 -0000
@@ -1589,15 +1589,20 @@ find_method (int funfirstline, char ***c
       if (strchr (saved_arg, '(') != NULL)
 	{
 	  int i;
+	  char *name = saved_arg;
+	  char *canon = cp_canonicalize_string (name);
+	  struct cleanup *cleanup;
 
-	  for (i = 0; i < i1; ++i)
+	  if (canon != NULL)
 	    {
-	      char *name = saved_arg;
-	      char *canon = cp_canonicalize_string (name);
-
-	      if (canon != NULL)
-		name = canon;
+	      name = canon;
+	      cleanup = make_cleanup (xfree, canon);
+	    }
+	  else
+	    cleanup = make_cleanup (null_cleanup, NULL);
 
+	  for (i = 0; i < i1; ++i)
+	    {
 	      if (strcmp_iw (name, SYMBOL_LINKAGE_NAME (sym_arr[i])) == 0)
 		{
 		  values.sals = (struct symtab_and_line *)
@@ -1605,13 +1610,9 @@ find_method (int funfirstline, char ***c
 		  values.nelts = 1;
 		  values.sals[0] = find_function_start_sal (sym_arr[i],
 							    funfirstline);
-		  if (canon)
-		    xfree (canon);
+		  do_cleanups (cleanup);
 		  return values;
 		}
-
-	      if (canon)
-		xfree (canon);
 	    }
 
 	  error (_("the class `%s' does not have any method instance named %s\n"),

             reply	other threads:[~2010-12-01 22:58 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-01 22:58 Keith Seitz [this message]
2010-12-02 16:14 ` Tom Tromey
2010-12-02 20:06   ` Keith Seitz

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=4CF6D1E3.6070709@redhat.com \
    --to=keiths@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /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