| Index: gdb/python/py-utils.c
|
| diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
|
| index d5d0e431b55c545e9ef2c4a4394f685366c61b98..4dcd168d2bb6e7fe09e793175bd647283759efb3 100644
|
| --- a/gdb/python/py-utils.c
|
| +++ b/gdb/python/py-utils.c
|
| @@ -1,6 +1,6 @@
|
| /* General utility routines for GDB/Python.
|
|
|
| - Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -31,12 +31,7 @@ py_decref (void *p)
|
| {
|
| PyObject *py = p;
|
|
|
| - /* Note that we need the extra braces in this 'if' to avoid a
|
| - warning from gcc. */
|
| - if (py)
|
| - {
|
| - Py_DECREF (py);
|
| - }
|
| + Py_DECREF (py);
|
| }
|
|
|
| /* Return a new cleanup which will decrement the Python object's
|
| @@ -48,13 +43,36 @@ make_cleanup_py_decref (PyObject *py)
|
| return make_cleanup (py_decref, (void *) py);
|
| }
|
|
|
| +/* This is a cleanup function which decrements the refcount on a
|
| + Python object. This function accounts appropriately for NULL
|
| + references. */
|
| +
|
| +static void
|
| +py_xdecref (void *p)
|
| +{
|
| + PyObject *py = p;
|
| +
|
| + Py_XDECREF (py);
|
| +}
|
| +
|
| +/* Return a new cleanup which will decrement the Python object's
|
| + refcount when run. Account for and operate on NULL references
|
| + correctly. */
|
| +
|
| +struct cleanup *
|
| +make_cleanup_py_xdecref (PyObject *py)
|
| +{
|
| + return make_cleanup (py_xdecref, py);
|
| +}
|
| +
|
| /* Converts a Python 8-bit string to a unicode string object. Assumes the
|
| 8-bit string is in the host charset. If an error occurs during conversion,
|
| returns NULL with a python exception set.
|
|
|
| As an added bonus, the functions accepts a unicode string and returns it
|
| right away, so callers don't need to check which kind of string they've
|
| - got.
|
| + got. In Python 3, all strings are Unicode so this case is always the
|
| + one that applies.
|
|
|
| If the given object is not one of the mentioned string types, NULL is
|
| returned, with the TypeError python exception set. */
|
| @@ -70,9 +88,10 @@ python_string_to_unicode (PyObject *obj)
|
| unicode_str = obj;
|
| Py_INCREF (obj);
|
| }
|
| -
|
| +#ifndef IS_PY3K
|
| else if (PyString_Check (obj))
|
| unicode_str = PyUnicode_FromEncodedObject (obj, host_charset (), NULL);
|
| +#endif
|
| else
|
| {
|
| PyErr_SetString (PyExc_TypeError,
|
| @@ -99,7 +118,11 @@ unicode_to_encoded_string (PyObject *unicode_str, const char *charset)
|
| if (string == NULL)
|
| return NULL;
|
|
|
| +#ifdef IS_PY3K
|
| + result = xstrdup (PyBytes_AsString (string));
|
| +#else
|
| result = xstrdup (PyString_AsString (string));
|
| +#endif
|
|
|
| Py_DECREF (string);
|
|
|
| @@ -113,14 +136,8 @@ unicode_to_encoded_string (PyObject *unicode_str, const char *charset)
|
| static PyObject *
|
| unicode_to_encoded_python_string (PyObject *unicode_str, const char *charset)
|
| {
|
| - PyObject *string;
|
| -
|
| /* Translate string to named charset. */
|
| - string = PyUnicode_AsEncodedString (unicode_str, charset, NULL);
|
| - if (string == NULL)
|
| - return NULL;
|
| -
|
| - return string;
|
| + return PyUnicode_AsEncodedString (unicode_str, charset, NULL);
|
| }
|
|
|
| /* Returns a newly allocated string with the contents of the given unicode
|
| @@ -167,7 +184,9 @@ python_string_to_target_string (PyObject *obj)
|
|
|
| /* Converts a python string (8-bit or unicode) to a target string in the
|
| target's charset. Returns NULL on error, with a python exception
|
| - set. */
|
| + set.
|
| +
|
| + In Python 3, the returned object is a "bytes" object (not a string). */
|
| PyObject *
|
| python_string_to_target_python_string (PyObject *obj)
|
| {
|
| @@ -197,31 +216,22 @@ python_string_to_host_string (PyObject *obj)
|
| if (str == NULL)
|
| return NULL;
|
|
|
| - result = unicode_to_encoded_string (str, host_charset ());
|
| + result = unicode_to_encoded_string (str, host_charset ());
|
| Py_DECREF (str);
|
| return result;
|
| }
|
|
|
| -/* Converts a target string of LENGTH bytes in the target's charset to a
|
| - Python Unicode string. If LENGTH is -1, convert until a null byte is found.
|
| -
|
| - Returns NULL on error, with a python exception set. */
|
| -PyObject *
|
| -target_string_to_unicode (const gdb_byte *str, int length)
|
| -{
|
| - if (length == -1)
|
| - length = strlen (str);
|
| -
|
| - return PyUnicode_Decode (str, length, target_charset (python_gdbarch), NULL);
|
| -}
|
| -
|
| /* Return true if OBJ is a Python string or unicode object, false
|
| otherwise. */
|
|
|
| int
|
| gdbpy_is_string (PyObject *obj)
|
| {
|
| +#ifdef IS_PY3K
|
| + return PyUnicode_Check (obj);
|
| +#else
|
| return PyString_Check (obj) || PyUnicode_Check (obj);
|
| +#endif
|
| }
|
|
|
| /* Return the string representation of OBJ, i.e., str (obj).
|
| @@ -235,7 +245,11 @@ gdbpy_obj_to_string (PyObject *obj)
|
|
|
| if (str_obj != NULL)
|
| {
|
| +#ifdef IS_PY3K
|
| + char *msg = python_string_to_host_string (str_obj);
|
| +#else
|
| char *msg = xstrdup (PyString_AsString (str_obj));
|
| +#endif
|
|
|
| Py_DECREF (str_obj);
|
| return msg;
|
| @@ -274,10 +288,10 @@ gdbpy_exception_to_string (PyObject *ptype, PyObject *pvalue)
|
| }
|
|
|
| /* Convert a GDB exception to the appropriate Python exception.
|
| -
|
| - This sets the Python error indicator, and returns NULL. */
|
|
|
| -PyObject *
|
| + This sets the Python error indicator. */
|
| +
|
| +void
|
| gdbpy_convert_exception (struct gdb_exception exception)
|
| {
|
| PyObject *exc_class;
|
| @@ -289,44 +303,51 @@ gdbpy_convert_exception (struct gdb_exception exception)
|
| else
|
| exc_class = gdbpy_gdb_error;
|
|
|
| - return PyErr_Format (exc_class, "%s", exception.message);
|
| + PyErr_Format (exc_class, "%s", exception.message);
|
| }
|
|
|
| /* Converts OBJ to a CORE_ADDR value.
|
|
|
| - Returns 1 on success or 0 on failure, with a Python exception set. This
|
| - function can also throw GDB exceptions.
|
| + Returns 0 on success or -1 on failure, with a Python exception set.
|
| */
|
|
|
| int
|
| get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
|
| {
|
| if (gdbpy_is_value_object (obj))
|
| - *addr = value_as_address (value_object_to_value (obj));
|
| + {
|
| + volatile struct gdb_exception except;
|
| +
|
| + TRY_CATCH (except, RETURN_MASK_ALL)
|
| + {
|
| + *addr = value_as_address (value_object_to_value (obj));
|
| + }
|
| + GDB_PY_SET_HANDLE_EXCEPTION (except);
|
| + }
|
| else
|
| {
|
| PyObject *num = PyNumber_Long (obj);
|
| gdb_py_ulongest val;
|
|
|
| if (num == NULL)
|
| - return 0;
|
| + return -1;
|
|
|
| val = gdb_py_long_as_ulongest (num);
|
| Py_XDECREF (num);
|
| if (PyErr_Occurred ())
|
| - return 0;
|
| + return -1;
|
|
|
| if (sizeof (val) > sizeof (CORE_ADDR) && ((CORE_ADDR) val) != val)
|
| {
|
| PyErr_SetString (PyExc_ValueError,
|
| _("Overflow converting to address."));
|
| - return 0;
|
| + return -1;
|
| }
|
|
|
| *addr = val;
|
| }
|
|
|
| - return 1;
|
| + return 0;
|
| }
|
|
|
| /* Convert a LONGEST to the appropriate Python object -- either an
|
| @@ -335,6 +356,11 @@ get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
|
| PyObject *
|
| gdb_py_object_from_longest (LONGEST l)
|
| {
|
| +#ifdef IS_PY3K
|
| + if (sizeof (l) > sizeof (long))
|
| + return PyLong_FromLongLong (l);
|
| + return PyLong_FromLong (l);
|
| +#else
|
| #ifdef HAVE_LONG_LONG /* Defined by Python. */
|
| /* If we have 'long long', and the value overflows a 'long', use a
|
| Python Long; otherwise use a Python Int. */
|
| @@ -343,6 +369,7 @@ gdb_py_object_from_longest (LONGEST l)
|
| return PyLong_FromLongLong (l);
|
| #endif
|
| return PyInt_FromLong (l);
|
| +#endif
|
| }
|
|
|
| /* Convert a ULONGEST to the appropriate Python object -- either an
|
| @@ -351,6 +378,11 @@ gdb_py_object_from_longest (LONGEST l)
|
| PyObject *
|
| gdb_py_object_from_ulongest (ULONGEST l)
|
| {
|
| +#ifdef IS_PY3K
|
| + if (sizeof (l) > sizeof (unsigned long))
|
| + return PyLong_FromUnsignedLongLong (l);
|
| + return PyLong_FromUnsignedLong (l);
|
| +#else
|
| #ifdef HAVE_LONG_LONG /* Defined by Python. */
|
| /* If we have 'long long', and the value overflows a 'long', use a
|
| Python Long; otherwise use a Python Int. */
|
| @@ -362,6 +394,7 @@ gdb_py_object_from_ulongest (ULONGEST l)
|
| return PyLong_FromUnsignedLong (l);
|
|
|
| return PyInt_FromLong (l);
|
| +#endif
|
| }
|
|
|
| /* Like PyInt_AsLong, but returns 0 on failure, 1 on success, and puts
|
| @@ -393,3 +426,19 @@ gdb_py_generic_dict (PyObject *self, void *closure)
|
| Py_INCREF (result);
|
| return result;
|
| }
|
| +
|
| +/* Like PyModule_AddObject, but does not steal a reference to
|
| + OBJECT. */
|
| +
|
| +int
|
| +gdb_pymodule_addobject (PyObject *module, const char *name, PyObject *object)
|
| +{
|
| + int result;
|
| +
|
| + Py_INCREF (object);
|
| + /* Python 2.4 did not have a 'const' here. */
|
| + result = PyModule_AddObject (module, (char *) name, object);
|
| + if (result < 0)
|
| + Py_DECREF (object);
|
| + return result;
|
| +}
|
|
|