From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 108788 invoked by alias); 27 Jun 2018 18:44:21 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 108774 invoked by uid 89); 27 Jun 2018 18:44:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=5609, HX-Received:sk:v2-v6mr, management X-HELO: mail-wm0-f46.google.com Received: from mail-wm0-f46.google.com (HELO mail-wm0-f46.google.com) (74.125.82.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 27 Jun 2018 18:44:18 +0000 Received: by mail-wm0-f46.google.com with SMTP id p11-v6so6497377wmc.4 for ; Wed, 27 Jun 2018 11:44:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=KRT2/jdWolNCYEX9kCH7acziIhVly3T/bZCgVc5ib64=; b=J3KqCpJ1egy8mLeeQqQd28R5QxF8q8xDR6H4IJaoE41Ml5geJUd9lxG4T2ydecKdo2 SKy85U6J/R1tBEhO/bj3ovWvN4LZU6Nun7o6oPJkOVlH2JS22hm6PGjYbePFjIprwqey OxT2syxv38IRnD9j3GVXgSjSy3FLltKVpw5DmcH8zQ1wezO1CEX9ebX/CZGc8ACMLNiI cl4plKhnLIaVK5DthrR0fXLvM+bmvUJPh/pjJa6LXeyyET+wQ+UjkJPVRv7lE4/zaBIQ 3n31e/sMR+TIBQ6RUpepuXN58B+Kfx/Ar2h7ImQYkV/L+Ee5wNZ4mp4d93U/fKcvcE/U GAxQ== Return-Path: Received: from localhost (host81-140-212-80.range81-140.btcentralplus.com. [81.140.212.80]) by smtp.gmail.com with ESMTPSA id 132-v6sm8720733wmr.33.2018.06.27.11.44.15 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 27 Jun 2018 11:44:15 -0700 (PDT) Date: Wed, 27 Jun 2018 18:44:00 -0000 From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: Re: [RFA] Remove a VEC from py-unwind.c Message-ID: <20180627184414.GB15881@embecosm.com> References: <20180605160450.19876-1-tom@tromey.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180605160450.19876-1-tom@tromey.com> X-Fortune: Kissing a fish is like smoking a bicycle. X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes X-SW-Source: 2018-06/txt/msg00663.txt.bz2 * Tom Tromey [2018-06-05 10:04:50 -0600]: > 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<>. FWIW I took a look through this patch and it looks good. Thanks, Andrew > --- > 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; > -- > 2.13.6 >