From patchwork Thu Jan 29 19:28:33 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 4846 Received: (qmail 15743 invoked by alias); 29 Jan 2015 19:28:52 -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 15711 invoked by uid 89); 29 Jan 2015 19:28:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg20.ericsson.net Received: from usevmg20.ericsson.net (HELO usevmg20.ericsson.net) (198.24.6.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 29 Jan 2015 19:28:47 +0000 Received: from EUSAAHC005.ericsson.se (Unknown_Domain [147.117.188.87]) by usevmg20.ericsson.net (Symantec Mail Security) with SMTP id BA.85.03307.2F63AC45; Thu, 29 Jan 2015 14:34:43 +0100 (CET) Received: from elxcz23q12-y4.mo.ca.am.ericsson.se (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.87) with Microsoft SMTP Server (TLS) id 14.3.195.1; Thu, 29 Jan 2015 14:28:41 -0500 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH 3/6] Set varobj->path_expr in varobj_get_path_expr Date: Thu, 29 Jan 2015 14:28:33 -0500 Message-ID: <1422559716-5480-3-git-send-email-simon.marchi@ericsson.com> In-Reply-To: <1422559716-5480-1-git-send-email-simon.marchi@ericsson.com> References: <1422559716-5480-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-IsSubscribed: yes It seems like different languages are doing this differently (e.g. C and Ada). For C, var->path_expr is set inside c_path_expr_of_child. The next time the value is requested, is it therefore not recomputed. Ada does not set this field, but just returns the value. Since the field is never set, the value is recomputed every time it is requested. This patch makes it so that path_expr_of_child's only job is to compute the path expression, not save/cache the value. The field is set by the varobj common code. gdb/ChangeLog: * varobj.c (varobj_get_path_expr): Set var->path_expr. * c-varobj.c (c_path_expr_of_child): Set local var instead of child->path_expr. (cplus_path_expr_of_child): Same. --- gdb/c-varobj.c | 12 ++++++++---- gdb/varobj.c | 9 +++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/gdb/c-varobj.c b/gdb/c-varobj.c index 1db0957..bd0e5fb 100644 --- a/gdb/c-varobj.c +++ b/gdb/c-varobj.c @@ -433,9 +433,11 @@ c_name_of_child (struct varobj *parent, int index) static char * c_path_expr_of_child (struct varobj *child) { + char *path_expr; + c_describe_child (child->parent, child->index, NULL, NULL, NULL, - &child->path_expr); - return child->path_expr; + &path_expr); + return path_expr; } static struct value * @@ -906,9 +908,11 @@ cplus_name_of_child (struct varobj *parent, int index) static char * cplus_path_expr_of_child (struct varobj *child) { + char *path_expr; + cplus_describe_child (child->parent, child->index, NULL, NULL, NULL, - &child->path_expr); - return child->path_expr; + &path_expr); + return path_expr; } static struct value * diff --git a/gdb/varobj.c b/gdb/varobj.c index 6c9257d..28d388e 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -1034,16 +1034,17 @@ varobj_get_path_expr_parent (struct varobj *var) char * varobj_get_path_expr (struct varobj *var) { - if (var->path_expr != NULL) - return var->path_expr; - else + if (var->path_expr == NULL) { /* For root varobjs, we initialize path_expr when creating varobj, so here it should be child varobj. */ gdb_assert (!is_root_p (var)); - return (*var->root->lang_ops->path_expr_of_child) (var); + + var->path_expr = (*var->root->lang_ops->path_expr_of_child) (var); } + + return var->path_expr; } const struct language_defn *