From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16685 invoked by alias); 6 Oct 2011 15:43:48 -0000 Received: (qmail 16488 invoked by uid 22791); 6 Oct 2011 15:43:44 -0000 X-SWARE-Spam-Status: No, hits=-6.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 06 Oct 2011 15:43:30 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p96FhTmb004293 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 6 Oct 2011 11:43:29 -0400 Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p96FhS83015097; Thu, 6 Oct 2011 11:43:28 -0400 From: Phil Muldoon To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: [python] [patch] PR 13624 References: Reply-to: pmuldoon@redhat.com X-URL: http://www.redhat.com Date: Thu, 06 Oct 2011 15:43:00 -0000 In-Reply-To: (Tom Tromey's message of "Thu, 06 Oct 2011 07:51:10 -0600") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2011-10/txt/msg00163.txt.bz2 Tom Tromey writes: >>>>>> "Phil" == Phil Muldoon writes: > > Phil> The patch address PR 13624 which noted that in some instances we were > Phil> not catching GDB exceptions. I checked every function and I found two > Phil> GDB cases, and one Python case. > > Phil> OK? > > Almost. Thanks. New patch attached: -- 2011-10-06 Phil Muldoon * python/py-value.c (valpy_call): Check that arguments are a tuple. (is_intlike): Remove call to CHECK_TYPEDEF. (valpy_nonzero): Catch GDB exceptions. (valpy_absolute): Ditto. (valpy_lazy_string): Ditto. (valpy_call): Ditto. (valpy_get_is_optimized_out): Ditto. (valpy_long): Ditto. (valpy_float): Ditto. (valpy_int): Call CHECK_TYPEDEF. Catch GDB exceptions. (valpy_richcompare): Ditto. -- diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 252d9b9..79de586 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -312,13 +312,18 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw) const char *user_encoding = NULL; static char *keywords[] = { "encoding", "length", NULL }; PyObject *str_obj; + volatile struct gdb_exception except; if (!PyArg_ParseTupleAndKeywords (args, kw, "|s" GDB_PY_LL_ARG, keywords, &user_encoding, &length)) return NULL; - if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR) - value = value_ind (value); + TRY_CATCH (except, RETURN_MASK_ALL) + { + if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR) + value = value_ind (value); + } + GDB_PY_HANDLE_EXCEPTION (except); str_obj = gdbpy_create_lazy_string_object (value_address (value), length, user_encoding, @@ -510,7 +515,13 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords) volatile struct gdb_exception except; struct value *function = ((value_object *) self)->value; struct value **vargs = NULL; - struct type *ftype = check_typedef (value_type (function)); + struct type *ftype; + + TRY_CATCH (except, RETURN_MASK_ALL) + { + ftype = check_typedef (value_type (function)); + } + GDB_PY_HANDLE_EXCEPTION (except); if (TYPE_CODE (ftype) != TYPE_CODE_FUNC) { @@ -519,6 +530,13 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords) return NULL; } + if (! PyTuple_Check (args)) + { + PyErr_SetString (PyExc_TypeError, + _("Inferior arguments must be provided in a tuple.")); + return NULL; + } + args_count = PyTuple_Size (args); if (args_count > 0) { @@ -584,8 +602,16 @@ static PyObject * valpy_get_is_optimized_out (PyObject *self, void *closure) { struct value *value = ((value_object *) self)->value; + int opt = 0; + volatile struct gdb_exception except; - if (value_optimized_out (value)) + TRY_CATCH (except, RETURN_MASK_ALL) + { + opt = value_optimized_out (value); + } + GDB_PY_HANDLE_EXCEPTION (except); + + if (opt) Py_RETURN_TRUE; Py_RETURN_FALSE; @@ -792,33 +818,53 @@ static PyObject * valpy_absolute (PyObject *self) { struct value *value = ((value_object *) self)->value; + volatile struct gdb_exception except; + int isabs = 1; - if (value_less (value, value_zero (value_type (value), not_lval))) - return valpy_negative (self); - else + TRY_CATCH (except, RETURN_MASK_ALL) + { + if (value_less (value, value_zero (value_type (value), not_lval))) + isabs = 0; + } + GDB_PY_HANDLE_EXCEPTION (except); + + if (isabs) return valpy_positive (self); + else + return valpy_negative (self); } /* Implements boolean evaluation of gdb.Value. */ static int valpy_nonzero (PyObject *self) { + volatile struct gdb_exception except; value_object *self_value = (value_object *) self; struct type *type; + int nonzero = 0; /* Appease GCC warning. */ type = check_typedef (value_type (self_value->value)); - if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR) - return !!value_as_long (self_value->value); - else if (TYPE_CODE (type) == TYPE_CODE_FLT) - return value_as_double (self_value->value) != 0; - else if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT) - return !decimal_is_zero (value_contents (self_value->value), - TYPE_LENGTH (type), - gdbarch_byte_order (get_type_arch (type))); - else - /* All other values are True. */ - return 1; + TRY_CATCH (except, RETURN_MASK_ALL) + { + if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR) + nonzero = !!value_as_long (self_value->value); + else if (TYPE_CODE (type) == TYPE_CODE_FLT) + nonzero = value_as_double (self_value->value) != 0; + else if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT) + nonzero = !decimal_is_zero (value_contents (self_value->value), + TYPE_LENGTH (type), + gdbarch_byte_order (get_type_arch (type))); + else + /* All other values are True. */ + nonzero = 1; + } + /* This is not documented in the Python documentation, but if this + function fails, return -1 as slot_nb_nonzero does (the default + Python nonzero function). */ + GDB_PY_SET_HANDLE_EXCEPTION (except); + + return nonzero; } /* Implements ~ for value objects. */ @@ -954,7 +1000,6 @@ valpy_richcompare (PyObject *self, PyObject *other, int op) static int is_intlike (struct type *type, int ptr_ok) { - CHECK_TYPEDEF (type); return (TYPE_CODE (type) == TYPE_CODE_INT || TYPE_CODE (type) == TYPE_CODE_ENUM || TYPE_CODE (type) == TYPE_CODE_BOOL @@ -971,16 +1016,12 @@ valpy_int (PyObject *self) LONGEST l = 0; volatile struct gdb_exception except; - CHECK_TYPEDEF (type); - if (!is_intlike (type, 0)) - { - PyErr_SetString (PyExc_RuntimeError, - _("Cannot convert value to int.")); - return NULL; - } - TRY_CATCH (except, RETURN_MASK_ALL) { + CHECK_TYPEDEF (type); + if (!is_intlike (type, 0)) + error( _("Cannot convert value to int.")); + l = value_as_long (value); } GDB_PY_HANDLE_EXCEPTION (except); @@ -997,15 +1038,13 @@ valpy_long (PyObject *self) LONGEST l = 0; volatile struct gdb_exception except; - if (!is_intlike (type, 1)) - { - PyErr_SetString (PyExc_RuntimeError, - _("Cannot convert value to long.")); - return NULL; - } - TRY_CATCH (except, RETURN_MASK_ALL) { + CHECK_TYPEDEF (type); + + if (!is_intlike (type, 1)) + error (_("Cannot convert value to long.")); + l = value_as_long (value); } GDB_PY_HANDLE_EXCEPTION (except); @@ -1022,16 +1061,13 @@ valpy_float (PyObject *self) double d = 0; volatile struct gdb_exception except; - CHECK_TYPEDEF (type); - if (TYPE_CODE (type) != TYPE_CODE_FLT) - { - PyErr_SetString (PyExc_RuntimeError, - _("Cannot convert value to float.")); - return NULL; - } - TRY_CATCH (except, RETURN_MASK_ALL) { + CHECK_TYPEDEF (type); + + if (TYPE_CODE (type) != TYPE_CODE_FLT) + error(_("Cannot convert value to float.")); + d = value_as_double (value); } GDB_PY_HANDLE_EXCEPTION (except);