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

@ -1,3 +1,106 @@
2012-12-12 Paul Koning <paul_koning@dell.com>
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 <tromey@redhat.com>
* coffread.c (coff_objfile_data_key): New global.

View file

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

View file

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

View file

@ -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,36 +36,23 @@ class GdbOutputFile:
def isatty(self):
return False
def writelines(self, iterable):
for line in iterable:
self.write(line)
def flush(self):
flush()
class GdbOutputFile (_GdbFile):
def write(self, s):
write(s, stream=STDOUT)
def writelines(self, iterable):
for line in iterable:
self.write(line)
def flush(self):
flush()
sys.stdout = GdbOutputFile()
class GdbOutputErrorFile:
def close(self):
# Do nothing.
return None
def isatty(self):
return False
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()

View file

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

View file

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

View file

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

View file

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

View file

@ -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 += """

View file

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

View file

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

View file

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

View file

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

View file

@ -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 */ \

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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,39 +624,29 @@ 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 (get_addr_from_python (start_addr_obj, &start_addr)
&& get_addr_from_python (length_obj, &length))
{
if (!length)
{
PyErr_SetString (PyExc_ValueError,
_("Search range is empty."));
return NULL;
}
/* Watch for overflows. */
else if (length > CORE_ADDR_MAX
|| (start_addr + length - 1) < start_addr)
{
PyErr_SetString (PyExc_ValueError,
_("The search range is too large."));
return NULL;
}
}
else
return NULL;
return NULL;
if (!PyObject_CheckReadBuffer (pattern))
{
@ -629,6 +658,36 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
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))
{
if (!length)
{
PyErr_SetString (PyExc_ValueError,
_("Search range is empty."));
#ifdef IS_PY3K
PyBuffer_Release (&pybuf);
#endif
return NULL;
}
/* Watch for overflows. */
else if (length > CORE_ADDR_MAX
|| (start_addr + length - 1) < start_addr)
{
PyErr_SetString (PyExc_ValueError,
_("The search range is too large."));
#ifdef IS_PY3K
PyBuffer_Release (&pybuf);
#endif
return NULL;
}
}
else
return NULL;
TRY_CATCH (except, RETURN_MASK_ALL)
{
@ -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*/

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

@ -49,6 +49,25 @@
from including our python/python.h header file. */
#include <Python.h>
#include <frameobject.h>
#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. */

View file

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

View file

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