diff options
Diffstat (limited to 'gdb/python/py-utils.c')
-rw-r--r-- | gdb/python/py-utils.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index d5d0e43..4a118c7 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -54,7 +54,8 @@ make_cleanup_py_decref (PyObject *py) 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 +71,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 +101,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 +119,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 +167,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) { @@ -221,7 +223,11 @@ target_string_to_unicode (const gdb_byte *str, int length) 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 +241,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; @@ -335,6 +345,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 +358,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 +367,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 +383,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 |