Add support for Python 3.

* NEWS: Mention Python 3 support.
* varobj.c (value_get_print_value): Use
python_string_to_target_string.
* python/py-block.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
* python/py-breakpoint.c: Ditto.
* python/py-cmd.c:  Ditto.
* python/py-event.c: Ditto.
* python/py-event.h: Ditto.
* python/py-evtregistry.c: Ditto.
* python/py-finishbreakpoint.c: Ditto.
* python/py-frame.c: Ditto.
* python/py-function.c: Ditto.
* python/py-infthread.c: Ditto.
* python/py-lazy-string.c: Ditto.
* python/py-progspace.c: Ditto.
* /python/py-symbol.c: Ditto.
* python/py-evts.c:  (gdbpy_initialize_py_events): Add module
initialization for Python 3.
* python/py-inferior.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(infpy_read_memory): Return memoryview object if Python 3.
(infpy_write_memory): Use "s*" operand parsing code for Python 3.
(infpy_search_memory): Ditto.
(get_buffer): New function for Python 3.
* python/py-objfile.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(objfpy_dealloc): Use Py_TYPE to call tp_free.
* python/py-param.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(get_attr): Use PyUnicode_CompareWithASCIIString if Python 3.
(set_attr): Ditto.
* python/py-prettyprint.c (print_string_repr): use PyBytes methods
instead of PyString methods if Python 3.
(print_children): Skip push_dummy_python_frame call if Python 3.
* python/py-symtab.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(salpy_dealloc): Use Py_TYPE to call tp_free.
* python/py-type.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(field_dealloc): Use Py_TYPE to call tp_free.
(typy_dealloc): Ditto.
(type_object_as_number): Adjust struct initializations for
differences in layout for Python 2 vs. Python 3.
* python/py-utils.c (python_string_to_unicode): Omit non-Unicode
string case for Python 3.
(unicode_to_encoded_python_string): Shorten code (no functional
change).
(python_string_to_target_python_string): Comment that in Python 3
returned value is a Python "bytes" type.
(gdbpy_is_string): Omit non-Unicode string check in Python 3.
(gdb_py_object_from_longest): Omit non-long integer case in Python
3.
(gdb_py_object_from_ulongest): Ditto.
* python/py-value.c: Use PyVarObject_HEAD_INIT in initialization
of type objects.
(valpy_dealloc): Use Py_TYPE to call tp_free.
(valpy_int): Omit function if Python 3.
(convert_value_from_python): Use "%S" format (Python object as a
string) if Python 3.
(value_object_as_number): Adjust struct initializations for
differences in layout for Python 2 vs. Python 3.
* python/python-config.py: Adjust syntax for Python 3
compatibility.
Include "sys.abiflags" string as part of python library name, if
that attribute exists (Python 3).
* python/python-internal.h (IS_PY3): Define if Python 3.
(Py_TPFLAGS_HAVE_ITER, Py_TPFLAGS_CHECKTYPES): Define with
placeholder value if Python 3.
(PyInt_Check, PyInt_FromLong, PyInt_AsLong, PyString_FromString,
PyString_Decode, PyString_FromFormat, PyString_Check): Define as
analogous Python 3 API function if Python 3.
(PyVarObject_HEAD_INIT): Define if not already defined.
(Py_TYPE): Ditto.
* python/python.c (eval_python_command): Omit Py_FlushLine call if
Python 3.
Check return values of all Python API calls for error.
Supply dummy "python" and "python-interactive" commands if Python
initialization failed.
(_initialize_python): Convert argc to wchar_t** if Python 3.
Add module initialization for Python 3.
(finish_python_initialization): Pass wchar_t * argument to
PySys_SetPath if Python 3.
* python/lib/gdb/__init__.py: Define "reload" if Python 3.
(_GdbFile): New class for common output file behavior.
(GdbOutFile): Subclass from _GdbFile.
(GdbOutputErrorFile): Ditto.
(auto_load_packages): Adjust syntax for Python 3 compatibility.
* python/lib/gdb/printing.py: Define basestr and int if Python 3.
* python/lib/gdb/prompt.py: Use sorted() function rather than
sort() method.
* python/lib/gdb/command/explore.py: Define raw_input if Python 3.
Adjust syntax for Python 3 compatibility.
* python/lib/gdb/command/pretty_printers.py: Use sorted() function
rather than sort() method.
Adjust syntax for Python 3 compatibility.
* python/lib/gdb/command/type_printers.py: Ditto.
* doc/gdb.texinfo (Inferior.read_memory): Mention that the return
value is a memoryview object if Python 3.
This commit is contained in:
Paul Koning 2012-12-12 16:47:30 +00:00
parent b8b98ad1fc
commit 9a27f2c60d
35 changed files with 530 additions and 172 deletions

View file

@ -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