From patchwork Tue Jun 5 16:04:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 27633 Received: (qmail 129441 invoked by alias); 5 Jun 2018 16:04:57 -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 129254 invoked by uid 89); 5 Jun 2018 16:04:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=H*RU:cmsmtp, Hx-spam-relays-external:cmsmtp, H*r:cmsmtp, HX-Local-Domain:yes X-HELO: gateway36.websitewelcome.com Received: from gateway36.websitewelcome.com (HELO gateway36.websitewelcome.com) (192.185.186.5) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 05 Jun 2018 16:04:54 +0000 Received: from cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway36.websitewelcome.com (Postfix) with ESMTP id D9E9A400C6C5E for ; Tue, 5 Jun 2018 11:04:52 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id QES4f7FLbPvAdQES4fKK7K; Tue, 05 Jun 2018 11:04:52 -0500 X-Authority-Reason: nr=8 Received: from 75-166-37-59.hlrn.qwest.net ([75.166.37.59]:38022 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1fQES4-003sar-KP; Tue, 05 Jun 2018 11:04:52 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA] Remove a VEC from py-unwind.c Date: Tue, 5 Jun 2018 10:04:50 -0600 Message-Id: <20180605160450.19876-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1fQES4-003sar-KP X-Source-Sender: 75-166-37-59.hlrn.qwest.net (bapiya.Home) [75.166.37.59]:38022 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes This removes a use of VEC from py-unwind.c, replacing it wit std::vector. It also changes saved_regs to hold a gdbpy_ref<>, simplifying the memory management. Tested against gdb.python on x86-64 Fedora 26. gdb/ChangeLog 2018-06-05 Tom Tromey * python/py-unwind.c (unwind_info_object) : Now a std::vector. (unwind_infopy_str, pyuw_create_unwind_info) (unwind_infopy_add_saved_register, pyuw_sniffer) (unwind_infopy_dealloc, unwind_infopy_add_saved_register): Update. (struct saved_reg): Add constructor. : Now a gdbpy_ref<>. --- gdb/ChangeLog | 11 +++++++++ gdb/python/py-unwind.c | 60 +++++++++++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 1d235fceed1..569d1f48d87 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -46,12 +46,17 @@ typedef struct /* Saved registers array item. */ -typedef struct +struct saved_reg { + saved_reg (int n, gdbpy_ref<> &&v) + : number (n), + value (std::move (v)) + { + } + int number; - PyObject *value; -} saved_reg; -DEF_VEC_O (saved_reg); + gdbpy_ref<> value; +}; /* The data we keep for the PyUnwindInfo: pending_frame, saved registers and frame ID. */ @@ -67,7 +72,7 @@ typedef struct struct frame_id frame_id; /* Saved registers array. */ - VEC (saved_reg) *saved_regs; + std::vector *saved_regs; } unwind_info_object; /* The data we keep for a frame we can unwind: frame ID and an array of @@ -196,17 +201,15 @@ unwind_infopy_str (PyObject *self) fprint_frame_id (&stb, unwind_info->frame_id); { const char *sep = ""; - int i; struct value_print_options opts; - saved_reg *reg; get_user_print_options (&opts); stb.printf ("\nSaved registers: ("); - for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++) + for (const saved_reg ® : *unwind_info->saved_regs) { - struct value *value = value_object_to_value (reg->value); + struct value *value = value_object_to_value (reg.value.get ()); - stb.printf ("%s(%d, ", sep, reg->number); + stb.printf ("%s(%d, ", sep, reg.number); if (value != NULL) { TRY @@ -249,7 +252,7 @@ pyuw_create_unwind_info (PyObject *pyo_pending_frame, unwind_info->frame_id = frame_id; Py_INCREF (pyo_pending_frame); unwind_info->pending_frame = pyo_pending_frame; - unwind_info->saved_regs = VEC_alloc (saved_reg, 4); + unwind_info->saved_regs = new std::vector; return (PyObject *) unwind_info; } @@ -303,24 +306,19 @@ unwind_infopy_add_saved_register (PyObject *self, PyObject *args) } } { - int i; - saved_reg *reg; - - for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++) + gdbpy_ref<> new_value = gdbpy_ref<>::new_reference (pyo_reg_value); + bool found = false; + for (saved_reg ® : *unwind_info->saved_regs) { - if (regnum == reg->number) + if (regnum == reg.number) { - Py_DECREF (reg->value); + found = true; + reg.value = std::move (new_value); break; } } - if (reg == NULL) - { - reg = VEC_safe_push (saved_reg, unwind_info->saved_regs, NULL); - reg->number = regnum; - } - Py_INCREF (pyo_reg_value); - reg->value = pyo_reg_value; + if (!found) + unwind_info->saved_regs->emplace_back (regnum, std::move (new_value)); } Py_RETURN_NONE; } @@ -335,9 +333,7 @@ unwind_infopy_dealloc (PyObject *self) saved_reg *reg; Py_XDECREF (unwind_info->pending_frame); - for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++) - Py_DECREF (reg->value); - VEC_free (saved_reg, unwind_info->saved_regs); + delete unwind_info->saved_regs; Py_TYPE (self)->tp_free (self); } @@ -560,9 +556,7 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame, { unwind_info_object *unwind_info = (unwind_info_object *) pyo_unwind_info.get (); - int reg_count = VEC_length (saved_reg, unwind_info->saved_regs); - saved_reg *reg; - int i; + int reg_count = unwind_info->saved_regs->size (); cached_frame = ((cached_frame_info *) @@ -573,9 +567,11 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame, cached_frame->reg_count = reg_count; /* Populate registers array. */ - for (i = 0; VEC_iterate (saved_reg, unwind_info->saved_regs, i, reg); i++) + for (int i = 0; i < unwind_info->saved_regs->size (); ++i) { - struct value *value = value_object_to_value (reg->value); + saved_reg *reg = &(*unwind_info->saved_regs)[i]; + + struct value *value = value_object_to_value (reg->value.get ()); size_t data_size = register_size (gdbarch, reg->number); cached_frame->reg[i].num = reg->number;