From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16339 invoked by alias); 11 Jun 2002 06:09:20 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 16330 invoked from network); 11 Jun 2002 06:09:19 -0000 Received: from unknown (HELO potter.sfbay.redhat.com) (205.180.83.107) by sources.redhat.com with SMTP; 11 Jun 2002 06:09:19 -0000 Received: from localhost.localdomain (remus.sfbay.redhat.com [172.16.27.252]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id g5B66nv05316 for ; Mon, 10 Jun 2002 23:06:49 -0700 From: "Martin M. Hunt" Organization: Red Hat Inc To: gdb-patches@sources.redhat.com Subject: [RFA] bug fixes for varobj.c Date: Mon, 10 Jun 2002 23:09:00 -0000 User-Agent: KMail/1.4.1 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="------------Boundary-00=_GE2JGH0WT155LTJ0M0G0" Message-Id: <200206102308.40570.hunt@redhat.com> X-SW-Source: 2002-06/txt/msg00169.txt.bz2 --------------Boundary-00=_GE2JGH0WT155LTJ0M0G0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8bit Content-length: 739 Anything using varobj is randomly corrupting memory and will cause crashes in Insight or anything using mi varobjs. This patch fixes that and some other minor problems. -- Martin Hunt GDB Engineer Red Hat, Inc. 2002-06-10 Martin M. Hunt * varobj.c (struct varobj_root): Change frame from CORE_ADDR to struct frame_id. (varobj_create): Store frame_id for root. (varobj_gen_name): Use xasprintf. (varobj_update): Save and restore frame using get_frame_id() and frame_find_by_id(). (create_child): Use xasprintf. (new_root_variable): Initialize frame_id. (c_name_of_child): Use xasprintf. Call find_frame_by_id(). (c_value_of_variable): Use xasprintf. Move mem_fileopen call to prevent memory leak. --------------Boundary-00=_GE2JGH0WT155LTJ0M0G0 Content-Type: text/x-diff; charset="us-ascii"; name="v" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="v" Content-length: 8328 Index: varobj.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/varobj.c,v retrieving revision 1.28 diff -u -u -r1.28 varobj.c --- varobj.c 5 May 2002 01:15:13 -0000 1.28 +++ varobj.c 11 Jun 2002 06:04:23 -0000 @@ -27,6 +27,7 @@ =20 #include "varobj.h" =20 + /* Non-zero if we want to see trace of varobj level stuff. */ =20 int varobjdebug =3D 0; @@ -52,7 +53,7 @@ struct block *valid_block; =20 /* The frame for this expression */ - CORE_ADDR frame; + struct frame_id frame; =20 /* If 1, "update" always recomputes the frame & valid block using the currently selected frame. */ @@ -311,61 +312,61 @@ =20 /* Array of known source language routines. */ static struct language_specific - languages[vlang_end][sizeof (struct language_specific)] =3D { +languages[vlang_end][sizeof (struct language_specific)] =3D { /* Unknown (try treating as C */ { - vlang_unknown, - c_number_of_children, - c_name_of_variable, - c_name_of_child, - c_value_of_root, - c_value_of_child, - c_type_of_child, - c_variable_editable, - c_value_of_variable} + vlang_unknown, + c_number_of_children, + c_name_of_variable, + c_name_of_child, + c_value_of_root, + c_value_of_child, + c_type_of_child, + c_variable_editable, + c_value_of_variable} , /* C */ { - vlang_c, - c_number_of_children, - c_name_of_variable, - c_name_of_child, - c_value_of_root, - c_value_of_child, - c_type_of_child, - c_variable_editable, - c_value_of_variable} + vlang_c, + c_number_of_children, + c_name_of_variable, + c_name_of_child, + c_value_of_root, + c_value_of_child, + c_type_of_child, + c_variable_editable, + c_value_of_variable} , /* C++ */ { - vlang_cplus, - cplus_number_of_children, - cplus_name_of_variable, - cplus_name_of_child, - cplus_value_of_root, - cplus_value_of_child, - cplus_type_of_child, - cplus_variable_editable, - cplus_value_of_variable} + vlang_cplus, + cplus_number_of_children, + cplus_name_of_variable, + cplus_name_of_child, + cplus_value_of_root, + cplus_value_of_child, + cplus_type_of_child, + cplus_variable_editable, + cplus_value_of_variable} , /* Java */ { - vlang_java, - java_number_of_children, - java_name_of_variable, - java_name_of_child, - java_value_of_root, - java_value_of_child, - java_type_of_child, - java_variable_editable, - java_value_of_variable} + vlang_java, + java_number_of_children, + java_name_of_variable, + java_name_of_child, + java_value_of_root, + java_value_of_child, + java_type_of_child, + java_variable_editable, + java_value_of_variable} }; =20 /* A little convenience enum for dealing with C++/Java */ enum vsections -{ - v_public =3D 0, v_private, v_protected -}; + { + v_public =3D 0, v_private, v_protected + }; =20 /* Private data */ =20 @@ -456,7 +457,7 @@ Since select_frame is so benign, just call it for all cases. */ if (fi !=3D NULL) { - var->root->frame =3D FRAME_FP (fi); + get_frame_id (fi, &var->root->frame); old_fi =3D selected_frame; select_frame (fi); } @@ -514,13 +515,13 @@ varobj_gen_name (void) { static int id =3D 0; - char obj_name[31]; + char *obj_name; =20 /* generate a name for this object */ id++; - sprintf (obj_name, "var%d", id); - - return xstrdup (obj_name); + xasprintf (&obj_name, "var%d", id); +=20=20 + return obj_name; } =20 /* Given an "objname", returns the pointer to the corresponding varobj @@ -826,9 +827,9 @@ through its children, reconstructing them and noting if they've changed. Return value: - -1 if there was an error updating the varobj - -2 if the type changed - Otherwise it is the number of children + parent changed + -1 if there was an error updating the varobj + -2 if the type changed + Otherwise it is the number of children + parent changed =20 Only root variables can be updated...=20 =20 @@ -850,7 +851,8 @@ struct value *new; struct vstack *stack =3D NULL; struct vstack *result =3D NULL; - struct frame_info *old_fi; + struct frame_id old_fid; + struct frame *fi; =20 /* sanity check: have we been passed a pointer? */ if (changelist =3D=3D NULL) @@ -863,7 +865,7 @@ =20 /* Save the selected stack frame, since we will need to change it in order to evaluate expressions. */ - old_fi =3D selected_frame; + get_frame_id (selected_frame, &old_fid); =20 /* Update the root variable. value_of_root can return NULL if the variable is no longer around, i.e. we stepped out of @@ -983,8 +985,10 @@ } =20 /* Restore selected frame */ - select_frame (old_fi); - + fi =3D frame_find_by_id (old_fid); + if (fi) + select_frame (fi); +=20=20 if (type_changed) return -2; else @@ -1214,10 +1218,7 @@ child->error =3D 1; child->parent =3D parent; child->root =3D parent->root; - childs_name =3D - (char *) xmalloc ((strlen (parent->obj_name) + strlen (name) + 2) * - sizeof (char)); - sprintf (childs_name, "%s.%s", parent->obj_name, name); + xasprintf (&childs_name, "%s.%s", parent->obj_name, name); child->obj_name =3D childs_name; install_variable (child); =20 @@ -1306,7 +1307,8 @@ var->root->lang =3D NULL; var->root->exp =3D NULL; var->root->valid_block =3D NULL; - var->root->frame =3D (CORE_ADDR) -1; + var->root->frame.base =3D (CORE_ADDR) -1; + var->root->frame.pc =3D (CORE_ADDR) -1; var->root->use_selected_frame =3D 0; var->root->rootvar =3D NULL; =20 @@ -1794,14 +1796,7 @@ switch (TYPE_CODE (type)) { case TYPE_CODE_ARRAY: - { - /* We never get here unless parent->num_children is greater than 0... */ - int len =3D 1; - while ((int) pow ((double) 10, (double) len) < index) - len++; - name =3D (char *) xmalloc (1 + len * sizeof (char)); - sprintf (name, "%d", index); - } + xasprintf (&name, "%d", index); break; =20 case TYPE_CODE_STRUCT: @@ -1820,9 +1815,7 @@ break; =20 default: - name =3D - (char *) xmalloc ((strlen (parent->name) + 2) * sizeof (char)); - sprintf (name, "*%s", parent->name); + xasprintf (&name, "*%s", parent->name); break; } break; @@ -1855,10 +1848,7 @@ else { reinit_frame_cache (); - - - fi =3D find_frame_addr_in_frame_chain (var->root->frame); - + fi =3D frame_find_by_id (var->root->frame); within_scope =3D fi !=3D NULL; /* FIXME: select_frame could fail */ if (within_scope) @@ -2024,33 +2014,26 @@ static char * c_value_of_variable (struct varobj *var) { - struct type *type; - /* BOGUS: if val_print sees a struct/class, it will print out its children instead of "{...}" */ - type =3D get_type (var); - switch (TYPE_CODE (type)) + + switch (TYPE_CODE (get_type (var))) { case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: return xstrdup ("{...}"); /* break; */ - +=20=20=20=20=20=20 case TYPE_CODE_ARRAY: { - char number[18]; - sprintf (number, "[%d]", var->num_children); - return xstrdup (number); + char *number; + xasprintf (&number, "[%d]", var->num_children); + return (number); } /* break; */ =20 default: { - long dummy; - struct ui_file *stb =3D mem_fileopen (); - struct cleanup *old_chain =3D make_cleanup_ui_file_delete (stb); - char *thevalue; - if (var->value =3D=3D NULL) { /* This can happen if we attempt to get the value of a struct @@ -2060,6 +2043,11 @@ } else { + long dummy; + struct ui_file *stb =3D mem_fileopen (); + struct cleanup *old_chain =3D make_cleanup_ui_file_delete (stb); + char *thevalue; + if (VALUE_LAZY (var->value)) gdb_value_fetch_lazy (var->value); val_print (VALUE_TYPE (var->value), VALUE_CONTENTS_RAW (var->value), = 0, @@ -2067,11 +2055,9 @@ stb, format_code[(int) var->format], 1, 0, 0); thevalue =3D ui_file_xstrdup (stb, &dummy); do_cleanups (old_chain); + return thevalue; } - - return thevalue; } - /* break; */ } } =0C --------------Boundary-00=_GE2JGH0WT155LTJ0M0G0--