From patchwork Tue Nov 26 21:29:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 36271 Received: (qmail 12416 invoked by alias); 26 Nov 2019 21:29:17 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 12344 invoked by uid 89); 26 Nov 2019 21:29:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy=spots X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 26 Nov 2019 21:29:14 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 6F27820413; Tue, 26 Nov 2019 16:29:12 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id 5051C2068F; Tue, 26 Nov 2019 16:29:08 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 2F08220AF6; Tue, 26 Nov 2019 16:29:08 -0500 (EST) X-Gerrit-PatchSet: 3 Date: Tue, 26 Nov 2019 16:29:08 -0500 From: "Sourceware to Gerrit sync (Code Review)" To: Tom Tromey , gdb-patches@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: merged Subject: [pushed] Let commands free "name" X-Gerrit-Change-Id: Ie1435cea5bbf4bd92056125f112917c607cbb761 X-Gerrit-Change-Number: 663 X-Gerrit-ChangeURL: X-Gerrit-Commit: 3ea16160a66e0e3bc59842e27e41890411729a86 In-Reply-To: References: Reply-To: noreply@gnutoolchain-gerrit.osci.io, tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Message-Id: <20191126212908.2F08220AF6@gnutoolchain-gerrit.osci.io> Sourceware to Gerrit sync has submitted this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/663 ...................................................................... Let commands free "name" This adds a "name_allocated" field to cmd_list_element, so that commands can own their "name" when necessary. Then, this changes a few spots in gdb that currently free the name by hand to instead use this facility. gdb/ChangeLog 2019-11-26 Tom Tromey * python/py-function.c (fnpy_init): Update. * value.h (add_internal_function): Adjust declaration. * value.c (function_destroyer): Remove. (do_add_internal_function): Don't set destroyer or copy name. (add_internal_function): Take unique_xmalloc_ptr for name. Set name_allocated. * python/py-cmd.c (cmdpy_destroyer): Don't free "name". (cmdpy_init): Set name_allocated. * cli/cli-decode.h (struct cmd_list_element) : New member. (~cmd_list_element): Free "name" if needed. Change-Id: Ie1435cea5bbf4bd92056125f112917c607cbb761 --- M gdb/ChangeLog M gdb/cli/cli-decode.h M gdb/python/py-cmd.c M gdb/python/py-function.c M gdb/value.c M gdb/value.h 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d8d582..d2e9adf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,19 @@ 2019-11-26 Tom Tromey + * python/py-function.c (fnpy_init): Update. + * value.h (add_internal_function): Adjust declaration. + * value.c (function_destroyer): Remove. + (do_add_internal_function): Don't set destroyer or copy name. + (add_internal_function): Take unique_xmalloc_ptr for name. + Set name_allocated. + * python/py-cmd.c (cmdpy_destroyer): Don't free "name". + (cmdpy_init): Set name_allocated. + * cli/cli-decode.h (struct cmd_list_element) : New + member. + (~cmd_list_element): Free "name" if needed. + +2019-11-26 Tom Tromey + * value.h (add_internal_function): Add new overload. Move documentation from value.h. * value.c (do_add_internal_function): New function. diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h index 2ec4a97..8ea4059 100644 --- a/gdb/cli/cli-decode.h +++ b/gdb/cli/cli-decode.h @@ -55,6 +55,7 @@ deprecated_warn_user (0), malloced_replacement (0), doc_allocated (0), + name_allocated (0), hook_in (0), allow_unknown (0), abbrev_flag (0), @@ -69,6 +70,8 @@ { if (doc && doc_allocated) xfree ((char *) doc); + if (name_allocated) + xfree ((char *) name); } DISABLE_COPY_AND_ASSIGN (cmd_list_element); @@ -109,6 +112,10 @@ unsigned int doc_allocated : 1; + /* Set if the name field should be xfree'd. */ + + unsigned int name_allocated : 1; + /* Flag that specifies if this command is already running its hook. */ /* Prevents the possibility of hook recursion. */ unsigned int hook_in : 1; diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index e3497d6..3897340 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -98,8 +98,7 @@ gdbpy_ref cmd ((cmdpy_object *) context); cmd->command = NULL; - /* We allocated the name and perhaps the prefix name. */ - xfree ((char *) self->name); + /* We may have allocated the prefix name. */ xfree ((char *) self->prefixname); } @@ -562,6 +561,7 @@ cmd->func = cmdpy_function; cmd->destroyer = cmdpy_destroyer; cmd->doc_allocated = 1; + cmd->name_allocated = 1; obj->command = cmd; set_cmd_context (cmd, self_ref.release ()); diff --git a/gdb/python/py-function.c b/gdb/python/py-function.c index 1c45887..d946105 100644 --- a/gdb/python/py-function.c +++ b/gdb/python/py-function.c @@ -127,8 +127,8 @@ if (! docstring) docstring.reset (xstrdup (_("This function is not documented."))); - add_internal_function (name, std::move (docstring), fnpy_call, - self_ref.release ()); + add_internal_function (make_unique_xstrdup (name), std::move (docstring), + fnpy_call, self_ref.release ()); return 0; } diff --git a/gdb/value.c b/gdb/value.c index 8e22ac7..57e62b9 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2421,31 +2421,19 @@ /* Do nothing. */ } -/* Clean up if an internal function's command is destroyed. */ -static void -function_destroyer (struct cmd_list_element *self, void *ignore) -{ - xfree ((char *) self->name); -} - /* Helper function that does the work for add_internal_function. */ static struct cmd_list_element * do_add_internal_function (const char *name, const char *doc, internal_function_fn handler, void *cookie) { - struct cmd_list_element *cmd; struct internal_function *ifn; struct internalvar *var = lookup_internalvar (name); ifn = create_internal_function (name, handler, cookie); set_internalvar_function (var, ifn); - cmd = add_cmd (xstrdup (name), no_class, function_command, (char *) doc, - &functionlist); - cmd->destroyer = function_destroyer; - - return cmd; + return add_cmd (name, no_class, function_command, doc, &functionlist); } /* See value.h. */ @@ -2460,13 +2448,16 @@ /* See value.h. */ void -add_internal_function (const char *name, gdb::unique_xmalloc_ptr &&doc, +add_internal_function (gdb::unique_xmalloc_ptr &&name, + gdb::unique_xmalloc_ptr &&doc, internal_function_fn handler, void *cookie) { struct cmd_list_element *cmd - = do_add_internal_function (name, doc.get (), handler, cookie); + = do_add_internal_function (name.get (), doc.get (), handler, cookie); doc.release (); cmd->doc_allocated = 1; + name.release (); + cmd->name_allocated = 1; } /* Update VALUE before discarding OBJFILE. COPIED_TYPES is used to diff --git a/gdb/value.h b/gdb/value.h index fdef835..96c9c21 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1177,7 +1177,7 @@ /* This overload takes an allocated documentation string. */ -extern void add_internal_function (const char *name, +extern void add_internal_function (gdb::unique_xmalloc_ptr &&name, gdb::unique_xmalloc_ptr &&doc, internal_function_fn handler, void *cookie);