From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13910 invoked by alias); 27 Nov 2007 10:33:27 -0000 Received: (qmail 13900 invoked by uid 22791); 27 Nov 2007 10:33:26 -0000 X-Spam-Check-By: sourceware.org Received: from viper.snap.net.nz (HELO viper.snap.net.nz) (202.37.101.8) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 27 Nov 2007 10:33:18 +0000 Received: from kahikatea.snap.net.nz (183.63.255.123.dynamic.snap.net.nz [123.255.63.183]) by viper.snap.net.nz (Postfix) with ESMTP id 9706A3DA0F2; Tue, 27 Nov 2007 23:33:10 +1300 (NZDT) Received: by kahikatea.snap.net.nz (Postfix, from userid 1000) id 7721C8FC6D; Tue, 27 Nov 2007 23:32:55 +1300 (NZDT) From: Nick Roberts MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <18251.62038.407960.47103@kahikatea.snap.net.nz> Date: Tue, 27 Nov 2007 10:33:00 -0000 To: Vladimir Prus Cc: gdb-patches@sources.redhat.com Subject: Re: [ob] unbreak MI In-Reply-To: <200711271000.06151.ghost@cs.msu.su> References: <200708312244.58216.ghost@cs.msu.su> <18251.47321.156923.358334@kahikatea.snap.net.nz> <200711271000.06151.ghost@cs.msu.su> X-Mailer: VM 7.19 under Emacs 23.0.50.3 X-IsSubscribed: yes 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 X-SW-Source: 2007-11/txt/msg00506.txt.bz2 > > > Probably: > > > > > > if (!gdb_type) > > > ui_out_field_string (uiout, "value", ""); > > > else if (mi_print_value_p (gdb_type, print_values)) > > > ui_out_field_string (uiout, "value", varobj_get_value (var)); > > > > > > is the right logic? > > > > It's probably the right logic, but it seems to cure the symptom rather > > than the cause. Looking again, I see it's not the right logic. GDB will print a value="" field even for "--no-values" when gdb_type is NULL. >... > The original code, in fact, was in error too, because of this: > > return (TYPE_CODE (type) != TYPE_CODE_ARRAY > && TYPE_CODE (type) != TYPE_CODE_STRUCT > && TYPE_CODE (type) != TYPE_CODE_UNION); > > This will crash if 'type' is NULL. Testsuite fails to detect this because > presently type is NULL only for C++ pseudo-fields ('public'/'private') and > the code above is only executed for --simple-values. I never use, and never wanted, "-var-list-children --simple-values". > Does this clarify things? Yes, thanks. I think the patch below should cover all cases. -- Nick http://www.inet.net.nz/~nickrob 2007-11-27 Nick Roberts * mi/mi-cmd-var.c (print_varobj): Revert change on 2007-08-31. (mi_print_value_p): Guard against type = NULL. *** mi-cmd-var.c.~1.41.~ 2007-11-21 08:19:11.000000000 +1300 --- mi-cmd-var.c 2007-11-27 23:23:38.000000000 +1300 *************** print_varobj (struct varobj *var, enum p *** 55,62 **** ui_out_field_string (uiout, "exp", varobj_get_expression (var)); ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); ! gdb_type = varobj_get_gdb_type (var); ! if (gdb_type && mi_print_value_p (gdb_type, print_values)) ui_out_field_string (uiout, "value", varobj_get_value (var)); type = varobj_get_type (var); --- 55,61 ---- ui_out_field_string (uiout, "exp", varobj_get_expression (var)); ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); ! if (mi_print_value_p (varobj_get_gdb_type (var), print_values)) ui_out_field_string (uiout, "value", varobj_get_value (var)); type = varobj_get_type (var); *************** Must be: 0 or \"%s\", 1 or \"%s\", 2 or *** 327,333 **** static int mi_print_value_p (struct type *type, enum print_values print_values) { - type = check_typedef (type); if (print_values == PRINT_NO_VALUES) return 0; --- 326,331 ---- *************** mi_print_value_p (struct type *type, enu *** 335,346 **** if (print_values == PRINT_ALL_VALUES) return 1; ! /* For PRINT_SIMPLE_VALUES, only print the value if it has a type ! and that type is not a compound type. */ ! return (TYPE_CODE (type) != TYPE_CODE_ARRAY ! && TYPE_CODE (type) != TYPE_CODE_STRUCT ! && TYPE_CODE (type) != TYPE_CODE_UNION); } enum mi_cmd_result --- 333,350 ---- if (print_values == PRINT_ALL_VALUES) return 1; ! if (type == NULL) ! return 1; ! else ! { ! type = check_typedef (type); ! /* For PRINT_SIMPLE_VALUES, only print the value if it has a type ! and that type is not a compound type. */ ! return (TYPE_CODE (type) != TYPE_CODE_ARRAY ! && TYPE_CODE (type) != TYPE_CODE_STRUCT ! && TYPE_CODE (type) != TYPE_CODE_UNION); ! } } enum mi_cmd_result