From 9a27f2c60d760a95a27e336750f26f69f91dd156 Mon Sep 17 00:00:00 2001 From: Paul Koning Date: Wed, 12 Dec 2012 16:47:30 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 103 +++++++++++++++++++++++++ gdb/NEWS | 2 + gdb/doc/gdb.texinfo | 3 +- gdb/python/lib/gdb/__init__.py | 35 ++++----- gdb/python/lib/gdb/command/explore.py | 32 ++++---- gdb/python/lib/gdb/command/pretty_printers.py | 20 ++--- gdb/python/lib/gdb/command/type_printers.py | 14 ++-- gdb/python/lib/gdb/printing.py | 5 ++ gdb/python/lib/gdb/prompt.py | 3 +- gdb/python/py-block.c | 6 +- gdb/python/py-breakpoint.c | 3 +- gdb/python/py-cmd.c | 3 +- gdb/python/py-event.c | 5 +- gdb/python/py-event.h | 3 +- gdb/python/py-evtregistry.c | 5 +- gdb/python/py-evts.c | 21 +++++ gdb/python/py-finishbreakpoint.c | 3 +- gdb/python/py-frame.c | 3 +- gdb/python/py-function.c | 3 +- gdb/python/py-inferior.c | 107 +++++++++++++++++++++----- gdb/python/py-infthread.c | 5 +- gdb/python/py-lazy-string.c | 3 +- gdb/python/py-objfile.c | 5 +- gdb/python/py-param.c | 11 ++- gdb/python/py-prettyprint.c | 14 +++- gdb/python/py-progspace.c | 5 +- gdb/python/py-symbol.c | 3 +- gdb/python/py-symtab.c | 8 +- gdb/python/py-type.c | 22 ++++-- gdb/python/py-utils.c | 42 +++++++--- gdb/python/py-value.c | 35 ++++++++- gdb/python/python-config.py | 15 ++-- gdb/python/python-internal.h | 31 ++++++++ gdb/python/python.c | 82 +++++++++++++++++++- gdb/varobj.c | 10 +-- 35 files changed, 514 insertions(+), 156 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f9235b5..dc51975 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,106 @@ +2012-12-12 Paul Koning + + 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. + 2012-12-12 Tom Tromey * coffread.c (coff_objfile_data_key): New global. diff --git a/gdb/NEWS b/gdb/NEWS index 3b09e5f..ceb81a2 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -26,6 +26,8 @@ ** Types can be pretty-printed via a Python API. + ** Python 3 is now supported (in addition to Python 2.4 or later) + * New Python-based convenience functions: ** $_memeq(buf1, buf2, length) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ce8f002..9964cbf 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -24171,7 +24171,8 @@ return an empty tuple. Read @var{length} bytes of memory from the inferior, starting at @var{address}. Returns a buffer object, which behaves much like an array or a string. It can be modified and given to the -@code{Inferior.write_memory} function. +@code{Inferior.write_memory} function. In @code{Python} 3, the return +value is a @code{memoryview} object. @end defun @findex Inferior.write_memory diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py index 0671526..4790420 100644 --- a/gdb/python/lib/gdb/__init__.py +++ b/gdb/python/lib/gdb/__init__.py @@ -18,9 +18,17 @@ import os import sys import _gdb +if sys.version_info[0] > 2: + # Python 3 moved "reload" + from imp import reload + from _gdb import * -class GdbOutputFile: +class _GdbFile (object): + # These two are needed in Python 3 + encoding = "UTF-8" + errors = "strict" + def close(self): # Do nothing. return None @@ -28,9 +36,6 @@ class GdbOutputFile: def isatty(self): return False - def write(self, s): - write(s, stream=STDOUT) - def writelines(self, iterable): for line in iterable: self.write(line) @@ -38,26 +43,16 @@ class GdbOutputFile: def flush(self): flush() -sys.stdout = GdbOutputFile() - -class GdbOutputErrorFile: - def close(self): - # Do nothing. - return None +class GdbOutputFile (_GdbFile): + def write(self, s): + write(s, stream=STDOUT) - def isatty(self): - return False +sys.stdout = GdbOutputFile() +class GdbOutputErrorFile (_GdbFile): def write(self, s): write(s, stream=STDERR) - def writelines(self, iterable): - for line in iterable: - self.write(line) - - def flush(self): - flush() - sys.stderr = GdbOutputErrorFile() # Default prompt hook does nothing. @@ -107,7 +102,7 @@ def auto_load_packages(): else: __import__(modname) except: - print >> sys.stderr, traceback.format_exc() + sys.stderr.write (traceback.format_exc() + "\n") auto_load_packages() diff --git a/gdb/python/lib/gdb/command/explore.py b/gdb/python/lib/gdb/command/explore.py index aad3671..e6f762f 100644 --- a/gdb/python/lib/gdb/command/explore.py +++ b/gdb/python/lib/gdb/command/explore.py @@ -17,7 +17,12 @@ """Implementation of the GDB 'explore' command using the GDB Python API.""" import gdb +import sys +if sys.version_info[0] > 2: + # Python 3 renamed raw_input to input + raw_input = input + class Explorer(object): """Internal class which invokes other explorers.""" @@ -155,7 +160,7 @@ class Explorer(object): """A utility function which prints that the current exploration session is returning to the parent value. Useful when exploring values. """ - print "\nReturning to parent value...\n" + print ("\nReturning to parent value...\n") @staticmethod def return_to_parent_value_prompt(): @@ -170,7 +175,7 @@ class Explorer(object): """A utility function which prints that the current exploration session is returning to the enclosing type. Useful when exploring types. """ - print "\nReturning to enclosing type...\n" + print ("\nReturning to enclosing type...\n") @staticmethod def return_to_enclosing_type_prompt(): @@ -192,7 +197,7 @@ class ScalarExplorer(object): """ print ("'%s' is a scalar value of type '%s'." % (expr, value.type)) - print "%s = %s" % (expr, str(value)) + print ("%s = %s" % (expr, str(value))) if is_child: Explorer.return_to_parent_value_prompt() @@ -211,13 +216,13 @@ class ScalarExplorer(object): print ("%s is of an enumerated type '%s'." % (name, str(datatype))) else: - print "'%s' is an enumerated type." % name + print ("'%s' is an enumerated type." % name) else: if is_child: print ("%s is of a scalar type '%s'." % (name, str(datatype))) else: - print "'%s' is a scalar type." % name + print ("'%s' is a scalar type." % name) if is_child: Explorer.return_to_enclosing_type_prompt() @@ -268,7 +273,7 @@ class PointerExplorer(object): try: str(element) except gdb.MemoryError: - print "Cannot read value at index %d." % index + print ("Cannot read value at index %d." % index) continue Explorer.explore_expr(element_expr, element, True) return False @@ -338,7 +343,7 @@ class ArrayExplorer(object): element = value[index] str(element) except gdb.MemoryError: - print "Cannot read value at index %d." % index + print ("Cannot read value at index %d." % index) raw_input("Press enter to continue... ") return True @@ -352,7 +357,7 @@ class ArrayExplorer(object): See Explorer.explore_type for more information. """ target_type = datatype.target() - print "%s is an array of '%s'." % (name, str(target_type)) + print ("%s is an array of '%s'." % (name, str(target_type))) Explorer.explore_type("the array element of %s" % name, target_type, is_child) @@ -371,9 +376,8 @@ class CompoundExplorer(object): if max_field_name_length < len(pair[0]): max_field_name_length = len(pair[0]) - format_str = " {0:>%d} = {1}" % max_field_name_length for pair in print_list: - print format_str.format(pair[0], pair[1]) + print (" %*s = %s" % (max_field_name_length, pair[0], pair[1])) @staticmethod def _get_real_field_count(fields): @@ -447,7 +451,7 @@ class CompoundExplorer(object): print_list.append((field.name, literal_value)) CompoundExplorer._print_fields(print_list) - print "" + print ("") if has_explorable_fields: choice = raw_input("Enter the field number of choice: ") @@ -484,7 +488,7 @@ class CompoundExplorer(object): (name, type_desc, str(datatype))) Explorer.return_to_enclosing_type_prompt() else: - print "'%s' is a %s with no fields." % (name, type_desc) + print ("'%s' is a %s with no fields." % (name, type_desc)) return False if is_child: @@ -515,7 +519,7 @@ class CompoundExplorer(object): current_choice = current_choice + 1 CompoundExplorer._print_fields(print_list) - print "" + print ("") if len(choice_to_compound_field_map) > 0: choice = raw_input("Enter the field number of choice: ") @@ -741,7 +745,7 @@ class ExploreTypeCommand(gdb.Command): value = ExploreUtils.get_value_from_str(arg_str) if value is not None: - print "'%s' is of type '%s'." % (arg_str, str(value.type)) + print ("'%s' is of type '%s'." % (arg_str, str(value.type))) Explorer.explore_type(str(value.type), value.type, False) raise gdb.GdbError(("'%s' is not a type or value in the current " diff --git a/gdb/python/lib/gdb/command/pretty_printers.py b/gdb/python/lib/gdb/command/pretty_printers.py index 3ae3517..bd44f5d 100644 --- a/gdb/python/lib/gdb/command/pretty_printers.py +++ b/gdb/python/lib/gdb/command/pretty_printers.py @@ -124,21 +124,17 @@ class InfoPrettyPrinter(gdb.Command): """Print a list of pretty-printers.""" # A potential enhancement is to provide an option to list printers in # "lookup order" (i.e. unsorted). - sorted_pretty_printers = copy.copy(pretty_printers) - sorted_pretty_printers.sort(lambda x, y: - cmp(self.printer_name(x), - self.printer_name(y))) + sorted_pretty_printers = sorted (copy.copy(pretty_printers), + key = self.printer_name) for printer in sorted_pretty_printers: name = self.printer_name(printer) enabled = self.enabled_string(printer) if name_re.match(name): - print " %s%s" % (name, enabled) + print (" %s%s" % (name, enabled)) if (hasattr(printer, "subprinters") and printer.subprinters is not None): - sorted_subprinters = copy.copy(printer.subprinters) - sorted_subprinters.sort(lambda x, y: - cmp(self.printer_name(x), - self.printer_name(y))) + sorted_subprinters = sorted (copy.copy(printer.subprinters), + key = self.printer_name) for subprinter in sorted_subprinters: if (not subname_re or subname_re.match(subprinter.name)): @@ -150,7 +146,7 @@ class InfoPrettyPrinter(gdb.Command): obj_name_to_match, object_re, name_re, subname_re): """Subroutine of invoke to simplify it.""" if printer_list and object_re.match(obj_name_to_match): - print title + print (title) self.list_pretty_printers(printer_list, name_re, subname_re) def invoke(self, arg, from_tty): @@ -219,7 +215,7 @@ def show_pretty_printer_enabled_summary(): We count subprinters individually. """ (enabled_count, total_count) = count_all_enabled_printers() - print "%d of %d printers enabled" % (enabled_count, total_count) + print ("%d of %d printers enabled" % (enabled_count, total_count)) def do_enable_pretty_printer_1 (pretty_printers, name_re, subname_re, flag): @@ -301,7 +297,7 @@ def do_enable_pretty_printer (arg, flag): state = "enabled" else: state = "disabled" - print "%d %s %s" % (total, pluralize("printer", total), state) + print ("%d %s %s" % (total, pluralize("printer", total), state)) # Print the total list of printers currently enabled/disabled. # This is to further assist the user in determining whether the result diff --git a/gdb/python/lib/gdb/command/type_printers.py b/gdb/python/lib/gdb/command/type_printers.py index b7d6930..207e0a9 100644 --- a/gdb/python/lib/gdb/command/type_printers.py +++ b/gdb/python/lib/gdb/command/type_printers.py @@ -33,29 +33,29 @@ class InfoTypePrinter(gdb.Command): """Print a list of type printers.""" # A potential enhancement is to provide an option to list printers in # "lookup order" (i.e. unsorted). - sorted_type_printers = copy.copy(type_printers) - sorted_type_printers.sort(lambda x, y: cmp(x.name, y.name)) + sorted_type_printers = sorted (copy.copy(type_printers), + key = lambda x: x.name) for printer in sorted_type_printers: if printer.enabled: enabled = '' else: enabled = " [disabled]" - print " %s%s" % (printer.name, enabled) + print (" %s%s" % (printer.name, enabled)) def invoke(self, arg, from_tty): """GDB calls this to perform the command.""" sep = '' for objfile in gdb.objfiles(): if objfile.type_printers: - print "%sType printers for %s:" % (sep, objfile.name) + print ("%sType printers for %s:" % (sep, objfile.name)) self.list_type_printers(objfile.type_printers) sep = '\n' if gdb.current_progspace().type_printers: - print "%sType printers for program space:" % sep + print ("%sType printers for program space:" % sep) self.list_type_printers(gdb.current_progspace().type_printers) sep = '\n' if gdb.type_printers: - print "%sGlobal type printers:" % sep + print ("%sGlobal type printers:" % sep) self.list_type_printers(gdb.type_printers) class _EnableOrDisableCommand(gdb.Command): @@ -83,7 +83,7 @@ class _EnableOrDisableCommand(gdb.Command): if self.set_some(name, gdb.type_printers): ok = True if not ok: - print "No type printer named '%s'" % name + print ("No type printer named '%s'" % name) def add_some(self, result, word, printers): for p in printers: diff --git a/gdb/python/lib/gdb/printing.py b/gdb/python/lib/gdb/printing.py index b4e798d..13f9c42 100644 --- a/gdb/python/lib/gdb/printing.py +++ b/gdb/python/lib/gdb/printing.py @@ -19,7 +19,12 @@ import gdb import gdb.types import re +import sys +if sys.version_info[0] > 2: + # Python 3 removed basestring and long + basestring = str + long = int class PrettyPrinter(object): """A basic pretty-printer. diff --git a/gdb/python/lib/gdb/prompt.py b/gdb/python/lib/gdb/prompt.py index 1f49b54..be20131 100644 --- a/gdb/python/lib/gdb/prompt.py +++ b/gdb/python/lib/gdb/prompt.py @@ -98,8 +98,7 @@ def prompt_help(): functions.""" result = '' - keys = prompt_substitutions.keys() - keys.sort() + keys = sorted (prompt_substitutions.keys()) for key in keys: result += ' \\%s\t%s\n' % (key, prompt_substitutions[key].__doc__) result += """ diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index 68d0a15..adec581 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -475,8 +475,7 @@ static PyGetSetDef block_object_getset[] = { }; PyTypeObject block_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Block", /*tp_name*/ sizeof (block_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -516,8 +515,7 @@ Return true if this block iterator is valid, false if not." }, }; static PyTypeObject block_syms_iterator_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.BlockIterator", /*tp_name*/ sizeof (block_syms_iterator_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 89ace99..9d52351 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -981,8 +981,7 @@ static PyMethodDef breakpoint_object_methods[] = PyTypeObject breakpoint_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Breakpoint", /*tp_name*/ sizeof (breakpoint_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index d8e375c..649da43 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -607,8 +607,7 @@ static PyMethodDef cmdpy_object_methods[] = static PyTypeObject cmdpy_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Command", /*tp_name*/ sizeof (cmdpy_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-event.c b/gdb/python/py-event.c index 793f52c..057bb2b 100644 --- a/gdb/python/py-event.c +++ b/gdb/python/py-event.c @@ -24,7 +24,7 @@ void evpy_dealloc (PyObject *self) { Py_XDECREF (((event_object *) self)->dict); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } PyObject * @@ -143,8 +143,7 @@ static PyGetSetDef event_object_getset[] = PyTypeObject event_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /* ob_size */ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Event", /* tp_name */ sizeof (event_object), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index aea1b57..bd81b55 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -48,8 +48,7 @@ \ qual PyTypeObject name##_event_object_type = \ { \ - PyObject_HEAD_INIT (NULL) \ - 0, /* ob_size */ \ + PyVarObject_HEAD_INIT (NULL, 0) \ py_path, /* tp_name */ \ sizeof (event_object), /* tp_basicsize */ \ 0, /* tp_itemsize */ \ diff --git a/gdb/python/py-evtregistry.c b/gdb/python/py-evtregistry.c index 0a2c336..4a4b9e7 100644 --- a/gdb/python/py-evtregistry.c +++ b/gdb/python/py-evtregistry.c @@ -97,7 +97,7 @@ static void evregpy_dealloc (PyObject *self) { Py_XDECREF (((eventregistry_object *) self)->callbacks); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } /* Initialize the Python event registry code. */ @@ -131,8 +131,7 @@ static PyMethodDef eventregistry_object_methods[] = static PyTypeObject eventregistry_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /* ob_size */ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.EventRegistry", /* tp_name */ sizeof (eventregistry_object), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c index 644857d..1b78b82 100644 --- a/gdb/python/py-evts.c +++ b/gdb/python/py-evts.c @@ -20,6 +20,21 @@ #include "defs.h" #include "py-events.h" +#ifdef IS_PY3K +static struct PyModuleDef EventModuleDef = +{ + PyModuleDef_HEAD_INIT, + "gdb.events", + NULL, + -1, + NULL, + NULL, + NULL, + NULL, + NULL +}; +#endif + /* Initialize python events. */ static int @@ -45,7 +60,11 @@ add_new_registry (eventregistry_object **registryp, char *name) void gdbpy_initialize_py_events (void) { +#ifdef IS_PY3K + gdb_py_events.module = PyModule_Create (&EventModuleDef); +#else gdb_py_events.module = Py_InitModule ("events", NULL); +#endif if (!gdb_py_events.module) goto fail; @@ -62,7 +81,9 @@ gdbpy_initialize_py_events (void) if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0) goto fail; +#ifndef IS_PY3K Py_INCREF (gdb_py_events.module); +#endif if (PyModule_AddObject (gdb_module, "events", (PyObject *) gdb_py_events.module) < 0) diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c index 7b2d319..4c30418 100644 --- a/gdb/python/py-finishbreakpoint.c +++ b/gdb/python/py-finishbreakpoint.c @@ -425,8 +425,7 @@ None otherwise.", NULL }, static PyTypeObject finish_breakpoint_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.FinishBreakpoint", /*tp_name*/ sizeof (struct finish_breakpoint_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 12a54e8..8a31eae 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -662,8 +662,7 @@ Return the value of the variable in this frame." }, }; PyTypeObject frame_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /* ob_size */ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Frame", /* tp_name */ sizeof (frame_object), /* tp_basicsize */ 0, /* tp_itemsize */ diff --git a/gdb/python/py-function.c b/gdb/python/py-function.c index 59ff65c..8b2647c 100644 --- a/gdb/python/py-function.c +++ b/gdb/python/py-function.c @@ -208,8 +208,7 @@ gdbpy_initialize_functions (void) static PyTypeObject fnpy_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Function", /*tp_name*/ sizeof (PyObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 8acf87b..670c935 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -454,9 +454,14 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) membuf_obj->addr = addr; membuf_obj->length = length; +#ifdef IS_PY3K + result = PyMemoryView_FromObject ((PyObject *) membuf_obj); +#else result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0, Py_END_OF_BUFFER); +#endif Py_DECREF (membuf_obj); + return result; } @@ -476,12 +481,22 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) PyObject *addr_obj, *length_obj = NULL; volatile struct gdb_exception except; static char *keywords[] = { "address", "buffer", "length", NULL }; +#ifdef IS_PY3K + Py_buffer pybuf; + if (! PyArg_ParseTupleAndKeywords (args, kw, "Os*|O", keywords, + &addr_obj, &pybuf, + &length_obj)) + return NULL; + buffer = pybuf.buf; + buf_len = pybuf.len; +#else if (! PyArg_ParseTupleAndKeywords (args, kw, "Os#|O", keywords, &addr_obj, &buffer, &buf_len, &length_obj)) return NULL; +#endif TRY_CATCH (except, RETURN_MASK_ALL) { @@ -500,8 +515,12 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) } write_memory_with_notification (addr, buffer, length); } +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif GDB_PY_HANDLE_EXCEPTION (except); + if (error) return NULL; @@ -513,7 +532,7 @@ static void mbpy_dealloc (PyObject *self) { xfree (((membuf_object *) self)->buffer); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } /* Return a description of the Membuf object. */ @@ -528,6 +547,24 @@ which is %s bytes long."), pulongest (membuf_obj->length)); } +#ifdef IS_PY3K + +static int +get_buffer (PyObject *self, Py_buffer *buf, int flags) +{ + membuf_object *membuf_obj = (membuf_object *) self; + int ret; + + ret = PyBuffer_FillInfo (buf, self, membuf_obj->buffer, + membuf_obj->length, 0, + PyBUF_CONTIG); + buf->format = "c"; + + return ret; +} + +#else + static Py_ssize_t get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) { @@ -572,6 +609,8 @@ get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr) return ret; } +#endif /* IS_PY3K */ + /* Implementation of gdb.search_memory (address, length, pattern). ADDRESS is the address to start the search. LENGTH specifies the scope of the @@ -585,17 +624,41 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) { CORE_ADDR start_addr, length; static char *keywords[] = { "address", "length", "pattern", NULL }; - PyObject *pattern, *start_addr_obj, *length_obj; + PyObject *start_addr_obj, *length_obj; volatile struct gdb_exception except; Py_ssize_t pattern_size; const void *buffer; CORE_ADDR found_addr; int found = 0; +#ifdef IS_PY3K + Py_buffer pybuf; - if (! PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords, + if (! PyArg_ParseTupleAndKeywords (args, kw, "OOs*", keywords, &start_addr_obj, &length_obj, + &pybuf)) + return NULL; + + buffer = pybuf.buf; + pattern_size = pybuf.len; +#else + PyObject *pattern; + + if (! PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords, + &start_addr_obj, &length_obj, &pattern)) + return NULL; + + if (!PyObject_CheckReadBuffer (pattern)) + { + PyErr_SetString (PyExc_RuntimeError, + _("The pattern is not a Python buffer.")); + + return NULL; + } + + if (PyObject_AsReadBuffer (pattern, &buffer, &pattern_size) == -1) return NULL; +#endif if (get_addr_from_python (start_addr_obj, &start_addr) && get_addr_from_python (length_obj, &length)) @@ -604,6 +667,10 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) { PyErr_SetString (PyExc_ValueError, _("Search range is empty.")); + +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif return NULL; } /* Watch for overflows. */ @@ -613,23 +680,15 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) PyErr_SetString (PyExc_ValueError, _("The search range is too large.")); +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif return NULL; } } else return NULL; - if (!PyObject_CheckReadBuffer (pattern)) - { - PyErr_SetString (PyExc_RuntimeError, - _("The pattern is not a Python buffer.")); - - return NULL; - } - - if (PyObject_AsReadBuffer (pattern, &buffer, &pattern_size) == -1) - return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) { found = target_search_memory (start_addr, length, @@ -638,6 +697,10 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) } GDB_PY_HANDLE_EXCEPTION (except); +#ifdef IS_PY3K + PyBuffer_Release (&pybuf); +#endif + if (found) return PyLong_FromLong (found_addr); else @@ -777,8 +840,7 @@ Return a long with the address of a match, or None." }, static PyTypeObject inferior_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /* ob_size */ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Inferior", /* tp_name */ sizeof (inferior_object), /* tp_basicsize */ 0, /* tp_itemsize */ @@ -817,6 +879,15 @@ static PyTypeObject inferior_object_type = 0 /* tp_alloc */ }; +#ifdef IS_PY3K + +static PyBufferProcs buffer_procs = +{ + get_buffer +}; + +#else + /* Python doesn't provide a decent way to get compatibility here. */ #if HAVE_LIBPYTHON2_4 #define CHARBUFFERPROC_NAME getcharbufferproc @@ -832,10 +903,10 @@ static PyBufferProcs buffer_procs = { Python 2.5. */ (CHARBUFFERPROC_NAME) get_char_buffer }; +#endif /* IS_PY3K */ static PyTypeObject membuf_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Membuf", /*tp_name*/ sizeof (membuf_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c index 8821f20..2e4dea1 100644 --- a/gdb/python/py-infthread.c +++ b/gdb/python/py-infthread.c @@ -59,7 +59,7 @@ static void thpy_dealloc (PyObject *self) { Py_DECREF (((thread_object *) self)->inf_obj); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } static PyObject * @@ -301,8 +301,7 @@ Return whether the thread is exited." }, static PyTypeObject thread_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.InferiorThread", /*tp_name*/ sizeof (thread_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c index 3c90829..3a02a3b 100644 --- a/gdb/python/py-lazy-string.c +++ b/gdb/python/py-lazy-string.c @@ -216,8 +216,7 @@ static PyGetSetDef lazy_string_object_getset[] = { }; static PyTypeObject lazy_string_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.LazyString", /*tp_name*/ sizeof (lazy_string_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 5d2398f..d4110bc 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -62,7 +62,7 @@ objfpy_dealloc (PyObject *o) Py_XDECREF (self->printers); Py_XDECREF (self->type_printers); - self->ob_type->tp_free ((PyObject *) self); + Py_TYPE (self)->tp_free (self); } static PyObject * @@ -277,8 +277,7 @@ static PyGetSetDef objfile_getset[] = static PyTypeObject objfile_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Objfile", /*tp_name*/ sizeof (objfile_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index 963427e..b31daa4 100644 --- a/gdb/python/py-param.c +++ b/gdb/python/py-param.c @@ -102,7 +102,11 @@ static PyObject * get_attr (PyObject *obj, PyObject *attr_name) { if (PyString_Check (attr_name) +#ifdef IS_PY3K + && ! PyUnicode_CompareWithASCIIString (attr_name, "value")) +#else && ! strcmp (PyString_AsString (attr_name), "value")) +#endif { parmpy_object *self = (parmpy_object *) obj; @@ -276,7 +280,11 @@ static int set_attr (PyObject *obj, PyObject *attr_name, PyObject *val) { if (PyString_Check (attr_name) +#ifdef IS_PY3K + && ! PyUnicode_CompareWithASCIIString (attr_name, "value")) +#else && ! strcmp (PyString_AsString (attr_name), "value")) +#endif { if (!val) { @@ -773,8 +781,7 @@ gdbpy_initialize_parameters (void) static PyTypeObject parmpy_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Parameter", /*tp_name*/ sizeof (parmpy_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index 00fe7a9..dea1319 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -348,8 +348,13 @@ print_string_repr (PyObject *printer, const char *hint, struct type *type; make_cleanup_py_decref (string); +#ifdef IS_PY3K + output = (gdb_byte *) PyBytes_AS_STRING (string); + length = PyBytes_GET_SIZE (string); +#else output = PyString_AsString (string); length = PyString_Size (string); +#endif type = builtin_type (gdbarch)->builtin_char; if (hint && !strcmp (hint, "string")) @@ -383,6 +388,7 @@ print_string_repr (PyObject *printer, const char *hint, return result; } +#ifndef IS_PY3K static void py_restore_tstate (void *p) { @@ -458,6 +464,7 @@ push_dummy_python_frame (void) make_cleanup (py_restore_tstate, frame->f_back); return (PyObject *) frame; } +#endif /* Helper for apply_val_pretty_printer that formats children of the printer, if any exist. If is_py_none is true, then nothing has @@ -471,7 +478,10 @@ print_children (PyObject *printer, const char *hint, { int is_map, is_array, done_flag, pretty; unsigned int i; - PyObject *children, *iter, *frame; + PyObject *children, *iter; +#ifndef IS_PY3K + PyObject *frame; +#endif struct cleanup *cleanups; if (! PyObject_HasAttr (printer, gdbpy_children_cst)) @@ -515,6 +525,7 @@ print_children (PyObject *printer, const char *hint, /* Manufacture a dummy Python frame to work around Python 2.4 bug, where it insists on having a non-NULL tstate->frame when a generator is called. */ +#ifndef IS_PY3K frame = push_dummy_python_frame (); if (!frame) { @@ -522,6 +533,7 @@ print_children (PyObject *printer, const char *hint, goto done; } make_cleanup_py_decref (frame); +#endif done_flag = 0; for (i = 0; i < options->print_max; ++i) diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index c1b1cac..572e88d 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -70,7 +70,7 @@ pspy_dealloc (PyObject *self) Py_XDECREF (ps_self->printers); Py_XDECREF (ps_self->type_printers); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } static PyObject * @@ -264,8 +264,7 @@ static PyGetSetDef pspace_getset[] = static PyTypeObject pspace_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Progspace", /*tp_name*/ sizeof (pspace_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index 83d272e..5cfd3ab 100644 --- a/gdb/python/py-symbol.c +++ b/gdb/python/py-symbol.c @@ -561,8 +561,7 @@ Return the value of the symbol." }, }; PyTypeObject symbol_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Symbol", /*tp_name*/ sizeof (symbol_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index c023ad5..d3e95db 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -307,7 +307,7 @@ salpy_dealloc (PyObject *self) Py_DECREF (self_sal->symtab); xfree (self_sal->sal); - self_sal->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } /* Given a sal, and a sal_object that has previously been allocated @@ -539,8 +539,7 @@ Return the static block of the symbol table." }, }; static PyTypeObject symtab_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Symtab", /*tp_name*/ sizeof (symtab_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -590,8 +589,7 @@ Return true if this symbol table and line is valid, false if not." }, }; static PyTypeObject sal_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Symtab_and_line", /*tp_name*/ sizeof (sal_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 1f4e72c..22d58d0 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -123,7 +123,7 @@ field_dealloc (PyObject *obj) field_object *f = (field_object *) obj; Py_XDECREF (f->dict); - f->ob_type->tp_free (obj); + Py_TYPE (obj)->tp_free (obj); } static PyObject * @@ -1262,7 +1262,7 @@ typy_dealloc (PyObject *obj) if (type->next) type->next->prev = type->prev; - type->ob_type->tp_free (type); + Py_TYPE (type)->tp_free (type); } /* Return number of fields ("length" of the field dictionary). */ @@ -1657,7 +1657,9 @@ static PyNumberMethods type_object_as_number = { NULL, /* nb_add */ NULL, /* nb_subtract */ NULL, /* nb_multiply */ +#ifndef IS_PY3K NULL, /* nb_divide */ +#endif NULL, /* nb_remainder */ NULL, /* nb_divmod */ NULL, /* nb_power */ @@ -1671,12 +1673,19 @@ static PyNumberMethods type_object_as_number = { NULL, /* nb_and */ NULL, /* nb_xor */ NULL, /* nb_or */ +#ifdef IS_PY3K + NULL, /* nb_int */ + NULL, /* reserved */ +#else NULL, /* nb_coerce */ NULL, /* nb_int */ NULL, /* nb_long */ +#endif NULL, /* nb_float */ +#ifndef IS_PY3K NULL, /* nb_oct */ NULL /* nb_hex */ +#endif }; static PyMappingMethods typy_mapping = { @@ -1687,8 +1696,7 @@ static PyMappingMethods typy_mapping = { static PyTypeObject type_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Type", /*tp_name*/ sizeof (type_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -1737,8 +1745,7 @@ static PyGetSetDef field_object_getset[] = static PyTypeObject field_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Field", /*tp_name*/ sizeof (field_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -1779,8 +1786,7 @@ static PyTypeObject field_object_type = }; static PyTypeObject type_iterator_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.TypeIterator", /*tp_name*/ sizeof (typy_iterator_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ 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 diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 6f67bdb..fd9d673 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -106,7 +106,7 @@ valpy_dealloc (PyObject *obj) Py_XDECREF (self->dynamic_type); - self->ob_type->tp_free (self); + Py_TYPE (self)->tp_free (self); } /* Helper to push a Value object on the global list. */ @@ -1140,6 +1140,7 @@ is_intlike (struct type *type, int ptr_ok) || (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR)); } +#ifndef IS_PY3K /* Implements conversion to int. */ static PyObject * valpy_int (PyObject *self) @@ -1161,6 +1162,7 @@ valpy_int (PyObject *self) return gdb_py_object_from_longest (l); } +#endif /* Implements conversion to long. */ static PyObject * @@ -1335,9 +1337,14 @@ convert_value_from_python (PyObject *obj) value = value_copy (((value_object *) result)->value); } else +#ifdef IS_PY3K + PyErr_Format (PyExc_TypeError, + _("Could not convert Python object: %S."), obj); +#else PyErr_Format (PyExc_TypeError, _("Could not convert Python object: %s."), PyString_AsString (PyObject_Str (obj))); +#endif } if (except.reason < 0) { @@ -1439,7 +1446,9 @@ static PyNumberMethods value_object_as_number = { valpy_add, valpy_subtract, valpy_multiply, +#ifndef IS_PY3K valpy_divide, +#endif valpy_remainder, NULL, /* nb_divmod */ valpy_power, /* nb_power */ @@ -1453,12 +1462,31 @@ static PyNumberMethods value_object_as_number = { valpy_and, /* nb_and */ valpy_xor, /* nb_xor */ valpy_or, /* nb_or */ +#ifdef IS_PY3K + valpy_long, /* nb_int */ + NULL, /* reserved */ +#else NULL, /* nb_coerce */ valpy_int, /* nb_int */ valpy_long, /* nb_long */ +#endif valpy_float, /* nb_float */ +#ifndef IS_PY3K NULL, /* nb_oct */ - NULL /* nb_hex */ + NULL, /* nb_hex */ +#endif + NULL, /* nb_inplace_add */ + NULL, /* nb_inplace_subtract */ + NULL, /* nb_inplace_multiply */ + NULL, /* nb_inplace_remainder */ + NULL, /* nb_inplace_power */ + NULL, /* nb_inplace_lshift */ + NULL, /* nb_inplace_rshift */ + NULL, /* nb_inplace_and */ + NULL, /* nb_inplace_xor */ + NULL, /* nb_inplace_or */ + NULL, /* nb_floor_divide */ + valpy_divide /* nb_true_divide */ }; static PyMappingMethods value_object_as_mapping = { @@ -1468,8 +1496,7 @@ static PyMappingMethods value_object_as_mapping = { }; PyTypeObject value_object_type = { - PyObject_HEAD_INIT (NULL) - 0, /*ob_size*/ + PyVarObject_HEAD_INIT (NULL, 0) "gdb.Value", /*tp_name*/ sizeof (value_object), /*tp_basicsize*/ 0, /*tp_itemsize*/ diff --git a/gdb/python/python-config.py b/gdb/python/python-config.py index 75ed2d2..c2b2969 100644 --- a/gdb/python/python-config.py +++ b/gdb/python/python-config.py @@ -10,8 +10,8 @@ valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', 'ldflags', 'help'] def exit_with_usage(code=1): - print >>sys.stderr, "Usage: %s [%s]" % (sys.argv[0], - '|'.join('--'+opt for opt in valid_opts)) + sys.stderr.write ("Usage: %s [%s]\n" % (sys.argv[0], + '|'.join('--'+opt for opt in valid_opts))) sys.exit(code) try: @@ -24,6 +24,7 @@ if not opts: pyver = sysconfig.get_config_var('VERSION') getvar = sysconfig.get_config_var +abiflags = getattr (sys, "abiflags", "") opt_flags = [flag for (flag, val) in opts] @@ -44,17 +45,17 @@ def to_unix_path(path): for opt in opt_flags: if opt == '--prefix': - print to_unix_path(sysconfig.PREFIX) + print (to_unix_path(sysconfig.PREFIX)) elif opt == '--exec-prefix': - print to_unix_path(sysconfig.EXEC_PREFIX) + print (to_unix_path(sysconfig.EXEC_PREFIX)) elif opt in ('--includes', '--cflags'): flags = ['-I' + sysconfig.get_python_inc(), '-I' + sysconfig.get_python_inc(plat_specific=True)] if opt == '--cflags': flags.extend(getvar('CFLAGS').split()) - print to_unix_path(' '.join(flags)) + print (to_unix_path(' '.join(flags))) elif opt in ('--libs', '--ldflags'): libs = [] @@ -62,7 +63,7 @@ for opt in opt_flags: libs.extend(getvar('LIBS').split()) if getvar('SYSLIBS') is not None: libs.extend(getvar('SYSLIBS').split()) - libs.append('-lpython'+pyver) + libs.append('-lpython'+pyver + abiflags) # add the prefix/lib/pythonX.Y/config dir, but only if there is no # shared library in prefix/lib/. if opt == '--ldflags': @@ -73,5 +74,5 @@ for opt in opt_flags: libs.insert(0, '-L' + sysconfig.PREFIX + '/libs') if getvar('LINKFORSHARED') is not None: libs.extend(getvar('LINKFORSHARED').split()) - print to_unix_path(' '.join(libs)) + print (to_unix_path(' '.join(libs))) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index ee04860..cb8d97b 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -49,6 +49,25 @@ from including our python/python.h header file. */ #include #include + +#if PY_MAJOR_VERSION >= 3 +#define IS_PY3K 1 +#endif + +#ifdef IS_PY3K +#define Py_TPFLAGS_HAVE_ITER 0 +#define Py_TPFLAGS_CHECKTYPES 0 + +#define PyInt_Check PyLong_Check +#define PyInt_FromLong PyLong_FromLong +#define PyInt_AsLong PyLong_AsLong + +#define PyString_FromString PyUnicode_FromString +#define PyString_Decode PyUnicode_Decode +#define PyString_FromFormat PyUnicode_FromFormat +#define PyString_Check PyUnicode_Check +#endif + #if HAVE_LIBPYTHON2_4 /* Py_ssize_t is not defined until 2.5. Logical type for Py_ssize_t is Py_intptr_t, but that fails in 64-bit @@ -57,6 +76,18 @@ typedef int Py_ssize_t; #endif +#ifndef PyVarObject_HEAD_INIT +/* Python 2.4 does not define PyVarObject_HEAD_INIT. */ +#define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + +#endif + +#ifndef Py_TYPE +/* Python 2.4 does not define Py_TYPE. */ +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#endif + /* If Python.h does not define WITH_THREAD, then the various GIL-related functions will not be defined. However, PyGILState_STATE will be. */ diff --git a/gdb/python/python.c b/gdb/python/python.c index 43677d5..21895a8 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -70,9 +70,14 @@ static const char *gdbpy_should_print_stack = python_excp_message; #include "gdbthread.h" #include "observer.h" #include "interps.h" +#include "event-top.h" static PyMethodDef GdbMethods[]; +#ifdef IS_PY3K +static struct PyModuleDef GdbModuleDef; +#endif + PyObject *gdb_module; PyObject *gdb_python_module; @@ -198,8 +203,10 @@ eval_python_command (const char *command) return -1; Py_DECREF (v); +#ifndef IS_PY3K if (Py_FlushLine ()) PyErr_Clear (); +#endif return 0; } @@ -1431,6 +1438,13 @@ _initialize_python (void) { char *cmd_name; struct cmd_list_element *cmd; + char *progname; +#ifdef IS_PY3K + int i; + size_t progsize, count; + char *oldloc; + wchar_t *progname_copy; +#endif add_com ("python-interactive", class_obscure, python_interactive_command, @@ -1510,14 +1524,50 @@ message == an error message without a stack will be printed."), /foo/bin/python /foo/lib/pythonX.Y/... This must be done before calling Py_Initialize. */ - Py_SetProgramName (concat (ldirname (python_libdir), SLASH_STRING, "bin", - SLASH_STRING, "python", NULL)); + progname = concat (ldirname (python_libdir), SLASH_STRING, "bin", + SLASH_STRING, "python", NULL); +#ifdef IS_PY3K + oldloc = setlocale (LC_ALL, NULL); + setlocale (LC_ALL, ""); + progsize = strlen (progname); + if (progsize == (size_t) -1) + { + fprintf (stderr, "Could not convert python path to string\n"); + return; + } + progname_copy = PyMem_Malloc ((progsize + 1) * sizeof (wchar_t)); + if (!progname_copy) + { + fprintf (stderr, "out of memory\n"); + return; + } + count = mbstowcs (progname_copy, progname, progsize + 1); + if (count == (size_t) -1) + { + fprintf (stderr, "Could not convert python path to string\n"); + return; + } + setlocale (LC_ALL, oldloc); + + /* Note that Py_SetProgramName expects the string it is passed to + remain alive for the duration of the program's execution, so + it is not freed after this call. */ + Py_SetProgramName (progname_copy); +#else + Py_SetProgramName (progname); +#endif #endif Py_Initialize (); PyEval_InitThreads (); +#ifdef IS_PY3K + gdb_module = PyModule_Create (&GdbModuleDef); + /* Add _gdb module to the list of known built-in modules. */ + _PyImport_FixupBuiltin (gdb_module, "_gdb"); +#else gdb_module = Py_InitModule ("_gdb", GdbMethods); +#endif /* The casts to (char*) are for python 2.4. */ PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version); @@ -1612,7 +1662,17 @@ finish_python_initialization (void) sys_path = PySys_GetObject ("path"); - if (sys_path && PyList_Check (sys_path)) + /* If sys.path is not defined yet, define it first. */ + if (!(sys_path && PyList_Check (sys_path))) + { +#ifdef IS_PY3K + PySys_SetPath (L""); +#else + PySys_SetPath (""); +#endif + sys_path = PySys_GetObject ("path"); + } + if (sys_path && PyList_Check (sys_path)) { PyObject *pythondir; int err; @@ -1628,7 +1688,7 @@ finish_python_initialization (void) Py_DECREF (pythondir); } else - PySys_SetPath (gdb_pythondir); + goto fail; /* Import the gdb module to finish the initialization, and add it to __main__ for convenience. */ @@ -1768,4 +1828,18 @@ Return a tuple containing all inferiors." }, {NULL, NULL, 0, NULL} }; +#ifdef IS_PY3K +static struct PyModuleDef GdbModuleDef = +{ + PyModuleDef_HEAD_INIT, + "_gdb", + NULL, + -1, + GdbMethods, + NULL, + NULL, + NULL, + NULL +}; +#endif #endif /* HAVE_PYTHON */ diff --git a/gdb/varobj.c b/gdb/varobj.c index 130f438..81b2f28 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -2910,12 +2910,10 @@ value_get_print_value (struct value *value, enum varobj_display_formats format, string_print. Otherwise just return the extracted string as a value. */ - PyObject *py_str - = python_string_to_target_python_string (output); + char *s = python_string_to_target_string (output); - if (py_str) + if (s) { - char *s = PyString_AsString (py_str); char *hint; hint = gdbpy_get_display_hint (value_formatter); @@ -2926,10 +2924,10 @@ value_get_print_value (struct value *value, enum varobj_display_formats format, xfree (hint); } - len = PyString_Size (py_str); + len = strlen (s); thevalue = xmemdup (s, len + 1, len + 1); type = builtin_type (gdbarch)->builtin_char; - Py_DECREF (py_str); + xfree (s); if (!string_print) { -- 2.7.4