From patchwork Fri Sep 29 01:39:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 23217 Received: (qmail 50984 invoked by alias); 29 Sep 2017 01:40:04 -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 50970 invoked by uid 89); 29 Sep 2017 01:40:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=FORMAT X-HELO: gproxy5-pub.mail.unifiedlayer.com Received: from gproxy5-pub.mail.unifiedlayer.com (HELO gproxy5-pub.mail.unifiedlayer.com) (67.222.38.55) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 29 Sep 2017 01:40:01 +0000 Received: from cmgw2 (unknown [10.0.90.83]) by gproxy5.mail.unifiedlayer.com (Postfix) with ESMTP id 266BF140489 for ; Thu, 28 Sep 2017 19:40:00 -0600 (MDT) Received: from box522.bluehost.com ([74.220.219.122]) by cmgw2 with id FDfw1w01S2f2jeq01DfzCR; Thu, 28 Sep 2017 19:40:00 -0600 X-Authority-Analysis: v=2.2 cv=dZfw5Tfe c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=2JCJgTwv5E4A:10 a=20KFwNOVAAAA:8 a=zstS-IiYAAAA:8 a=zV-kPhr6oLvQb3uunCAA:9 a=65hG1IEgCOkBx8dd:21 a=Ks-ZcGXn76oj8yYu:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 75-166-0-208.hlrn.qwest.net ([75.166.0.208]:34836 helo=bapiya) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1dxkHU-0001tW-GE; Thu, 28 Sep 2017 19:39:56 -0600 From: Tom Tromey To: Pedro Alves Cc: Tom Tromey , gdb-patches@sourceware.org Subject: Re: [RFA 02/11] Remove cleanups from mi_cmd_break_insert_1 References: <20170912185736.20436-1-tom@tromey.com> <20170912185736.20436-3-tom@tromey.com> <294ad0fc-6500-2871-42c7-b0414dbdf563@redhat.com> Date: Thu, 28 Sep 2017 19:39:52 -0600 In-Reply-To: <294ad0fc-6500-2871-42c7-b0414dbdf563@redhat.com> (Pedro Alves's message of "Thu, 28 Sep 2017 10:23:55 +0100") Message-ID: <87mv5ewadz.fsf@tromey.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) MIME-Version: 1.0 X-BWhitelist: no X-Exim-ID: 1dxkHU-0001tW-GE X-Source-Sender: 75-166-0-208.hlrn.qwest.net (bapiya) [75.166.0.208]:34836 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-Local-Domain: yes >>>>> "Pedro" == Pedro Alves writes: Pedro> IMO, it'd be even better to build the std::string directly Pedro> instead of building an obstack and then dupping the string. Here's the new patch. Tom diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d06ed22..1a58d82 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-09-28 Tom Tromey + + * mi/mi-cmd-break.c (mi_argv_to_format): Return std::string. + (mi_cmd_break_insert_1): Update. + 2017-09-12 Tom Tromey * target.h (make_scoped_defer_target_commit_resume): Update. diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 188e4e2..6519e29 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -86,76 +86,69 @@ setup_breakpoint_reporting (void) /* Convert arguments in ARGV to the string in "format",argv,argv... and return it. */ -static char * +static std::string mi_argv_to_format (char **argv, int argc) { int i; - struct obstack obstack; - char *ret; - - obstack_init (&obstack); + std::string result; /* Convert ARGV[OIND + 1] to format string and save to FORMAT. */ - obstack_1grow (&obstack, '\"'); + result += '\"'; for (i = 0; i < strlen (argv[0]); i++) { switch (argv[0][i]) { case '\\': - obstack_grow (&obstack, "\\\\", 2); + result += "\\\\"; break; case '\a': - obstack_grow (&obstack, "\\a", 2); + result += "\\a"; break; case '\b': - obstack_grow (&obstack, "\\b", 2); + result += "\\b"; break; case '\f': - obstack_grow (&obstack, "\\f", 2); + result += "\\f"; break; case '\n': - obstack_grow (&obstack, "\\n", 2); + result += "\\n"; break; case '\r': - obstack_grow (&obstack, "\\r", 2); + result += "\\r"; break; case '\t': - obstack_grow (&obstack, "\\t", 2); + result += "\\t"; break; case '\v': - obstack_grow (&obstack, "\\v", 2); + result += "\\v"; break; case '"': - obstack_grow (&obstack, "\\\"", 2); + result += "\\\""; break; default: if (isprint (argv[0][i])) - obstack_grow (&obstack, argv[0] + i, 1); + result += argv[0][i]; else { char tmp[5]; xsnprintf (tmp, sizeof (tmp), "\\%o", (unsigned char) argv[0][i]); - obstack_grow_str (&obstack, tmp); + result += tmp; } break; } } - obstack_1grow (&obstack, '\"'); + result += '\"'; /* Apply other argv to FORMAT. */ for (i = 1; i < argc; i++) { - obstack_1grow (&obstack, ','); - obstack_grow_str (&obstack, argv[i]); + result += ','; + result += argv[i]; } - obstack_1grow (&obstack, '\0'); - - ret = xstrdup ((const char *) obstack_finish (&obstack)); - obstack_free (&obstack, NULL); - return ret; + return result; } /* Insert breakpoint. @@ -174,13 +167,12 @@ mi_cmd_break_insert_1 (int dprintf, const char *command, char **argv, int argc) int pending = 0; int enabled = 1; int tracepoint = 0; - struct cleanup *back_to = make_cleanup (null_cleanup, NULL); enum bptype type_wanted; event_location_up location; struct breakpoint_ops *ops; int is_explicit = 0; struct explicit_location explicit_loc; - char *extra_string = NULL; + std::string extra_string; enum opt { @@ -278,7 +270,6 @@ mi_cmd_break_insert_1 (int dprintf, const char *command, char **argv, int argc) error (_("-dprintf-insert: Missing ")); extra_string = mi_argv_to_format (argv + format_num, argc - format_num); - make_cleanup (xfree, extra_string); address = argv[oind]; } else @@ -343,13 +334,12 @@ mi_cmd_break_insert_1 (int dprintf, const char *command, char **argv, int argc) } create_breakpoint (get_current_arch (), location.get (), condition, thread, - extra_string, + extra_string.c_str (), 0 /* condition and thread are valid. */, temp_p, type_wanted, ignore_count, pending ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE, ops, 0, enabled, 0, 0); - do_cleanups (back_to); } /* Implements the -break-insert command.