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:
parent
b8b98ad1fc
commit
9a27f2c60d
35 changed files with 530 additions and 172 deletions
103
gdb/ChangeLog
103
gdb/ChangeLog
|
@ -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>
|
2012-12-12 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* coffread.c (coff_objfile_data_key): New global.
|
* coffread.c (coff_objfile_data_key): New global.
|
||||||
|
|
2
gdb/NEWS
2
gdb/NEWS
|
@ -26,6 +26,8 @@
|
||||||
|
|
||||||
** Types can be pretty-printed via a Python API.
|
** 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:
|
* New Python-based convenience functions:
|
||||||
|
|
||||||
** $_memeq(buf1, buf2, length)
|
** $_memeq(buf1, buf2, length)
|
||||||
|
|
|
@ -24171,7 +24171,8 @@ return an empty tuple.
|
||||||
Read @var{length} bytes of memory from the inferior, starting at
|
Read @var{length} bytes of memory from the inferior, starting at
|
||||||
@var{address}. Returns a buffer object, which behaves much like an array
|
@var{address}. Returns a buffer object, which behaves much like an array
|
||||||
or a string. It can be modified and given to the
|
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
|
@end defun
|
||||||
|
|
||||||
@findex Inferior.write_memory
|
@findex Inferior.write_memory
|
||||||
|
|
|
@ -18,9 +18,17 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import _gdb
|
import _gdb
|
||||||
|
|
||||||
|
if sys.version_info[0] > 2:
|
||||||
|
# Python 3 moved "reload"
|
||||||
|
from imp import reload
|
||||||
|
|
||||||
from _gdb import *
|
from _gdb import *
|
||||||
|
|
||||||
class GdbOutputFile:
|
class _GdbFile (object):
|
||||||
|
# These two are needed in Python 3
|
||||||
|
encoding = "UTF-8"
|
||||||
|
errors = "strict"
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
# Do nothing.
|
# Do nothing.
|
||||||
return None
|
return None
|
||||||
|
@ -28,36 +36,23 @@ class GdbOutputFile:
|
||||||
def isatty(self):
|
def isatty(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def writelines(self, iterable):
|
||||||
|
for line in iterable:
|
||||||
|
self.write(line)
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
flush()
|
||||||
|
|
||||||
|
class GdbOutputFile (_GdbFile):
|
||||||
def write(self, s):
|
def write(self, s):
|
||||||
write(s, stream=STDOUT)
|
write(s, stream=STDOUT)
|
||||||
|
|
||||||
def writelines(self, iterable):
|
|
||||||
for line in iterable:
|
|
||||||
self.write(line)
|
|
||||||
|
|
||||||
def flush(self):
|
|
||||||
flush()
|
|
||||||
|
|
||||||
sys.stdout = GdbOutputFile()
|
sys.stdout = GdbOutputFile()
|
||||||
|
|
||||||
class GdbOutputErrorFile:
|
class GdbOutputErrorFile (_GdbFile):
|
||||||
def close(self):
|
|
||||||
# Do nothing.
|
|
||||||
return None
|
|
||||||
|
|
||||||
def isatty(self):
|
|
||||||
return False
|
|
||||||
|
|
||||||
def write(self, s):
|
def write(self, s):
|
||||||
write(s, stream=STDERR)
|
write(s, stream=STDERR)
|
||||||
|
|
||||||
def writelines(self, iterable):
|
|
||||||
for line in iterable:
|
|
||||||
self.write(line)
|
|
||||||
|
|
||||||
def flush(self):
|
|
||||||
flush()
|
|
||||||
|
|
||||||
sys.stderr = GdbOutputErrorFile()
|
sys.stderr = GdbOutputErrorFile()
|
||||||
|
|
||||||
# Default prompt hook does nothing.
|
# Default prompt hook does nothing.
|
||||||
|
@ -107,7 +102,7 @@ def auto_load_packages():
|
||||||
else:
|
else:
|
||||||
__import__(modname)
|
__import__(modname)
|
||||||
except:
|
except:
|
||||||
print >> sys.stderr, traceback.format_exc()
|
sys.stderr.write (traceback.format_exc() + "\n")
|
||||||
|
|
||||||
auto_load_packages()
|
auto_load_packages()
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,12 @@
|
||||||
"""Implementation of the GDB 'explore' command using the GDB Python API."""
|
"""Implementation of the GDB 'explore' command using the GDB Python API."""
|
||||||
|
|
||||||
import gdb
|
import gdb
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info[0] > 2:
|
||||||
|
# Python 3 renamed raw_input to input
|
||||||
|
raw_input = input
|
||||||
|
|
||||||
class Explorer(object):
|
class Explorer(object):
|
||||||
"""Internal class which invokes other explorers."""
|
"""Internal class which invokes other explorers."""
|
||||||
|
|
||||||
|
@ -155,7 +160,7 @@ class Explorer(object):
|
||||||
"""A utility function which prints that the current exploration session
|
"""A utility function which prints that the current exploration session
|
||||||
is returning to the parent value. Useful when exploring values.
|
is returning to the parent value. Useful when exploring values.
|
||||||
"""
|
"""
|
||||||
print "\nReturning to parent value...\n"
|
print ("\nReturning to parent value...\n")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def return_to_parent_value_prompt():
|
def return_to_parent_value_prompt():
|
||||||
|
@ -170,7 +175,7 @@ class Explorer(object):
|
||||||
"""A utility function which prints that the current exploration session
|
"""A utility function which prints that the current exploration session
|
||||||
is returning to the enclosing type. Useful when exploring types.
|
is returning to the enclosing type. Useful when exploring types.
|
||||||
"""
|
"""
|
||||||
print "\nReturning to enclosing type...\n"
|
print ("\nReturning to enclosing type...\n")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def return_to_enclosing_type_prompt():
|
def return_to_enclosing_type_prompt():
|
||||||
|
@ -192,7 +197,7 @@ class ScalarExplorer(object):
|
||||||
"""
|
"""
|
||||||
print ("'%s' is a scalar value of type '%s'." %
|
print ("'%s' is a scalar value of type '%s'." %
|
||||||
(expr, value.type))
|
(expr, value.type))
|
||||||
print "%s = %s" % (expr, str(value))
|
print ("%s = %s" % (expr, str(value)))
|
||||||
|
|
||||||
if is_child:
|
if is_child:
|
||||||
Explorer.return_to_parent_value_prompt()
|
Explorer.return_to_parent_value_prompt()
|
||||||
|
@ -211,13 +216,13 @@ class ScalarExplorer(object):
|
||||||
print ("%s is of an enumerated type '%s'." %
|
print ("%s is of an enumerated type '%s'." %
|
||||||
(name, str(datatype)))
|
(name, str(datatype)))
|
||||||
else:
|
else:
|
||||||
print "'%s' is an enumerated type." % name
|
print ("'%s' is an enumerated type." % name)
|
||||||
else:
|
else:
|
||||||
if is_child:
|
if is_child:
|
||||||
print ("%s is of a scalar type '%s'." %
|
print ("%s is of a scalar type '%s'." %
|
||||||
(name, str(datatype)))
|
(name, str(datatype)))
|
||||||
else:
|
else:
|
||||||
print "'%s' is a scalar type." % name
|
print ("'%s' is a scalar type." % name)
|
||||||
|
|
||||||
if is_child:
|
if is_child:
|
||||||
Explorer.return_to_enclosing_type_prompt()
|
Explorer.return_to_enclosing_type_prompt()
|
||||||
|
@ -268,7 +273,7 @@ class PointerExplorer(object):
|
||||||
try:
|
try:
|
||||||
str(element)
|
str(element)
|
||||||
except gdb.MemoryError:
|
except gdb.MemoryError:
|
||||||
print "Cannot read value at index %d." % index
|
print ("Cannot read value at index %d." % index)
|
||||||
continue
|
continue
|
||||||
Explorer.explore_expr(element_expr, element, True)
|
Explorer.explore_expr(element_expr, element, True)
|
||||||
return False
|
return False
|
||||||
|
@ -338,7 +343,7 @@ class ArrayExplorer(object):
|
||||||
element = value[index]
|
element = value[index]
|
||||||
str(element)
|
str(element)
|
||||||
except gdb.MemoryError:
|
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... ")
|
raw_input("Press enter to continue... ")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -352,7 +357,7 @@ class ArrayExplorer(object):
|
||||||
See Explorer.explore_type for more information.
|
See Explorer.explore_type for more information.
|
||||||
"""
|
"""
|
||||||
target_type = datatype.target()
|
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,
|
Explorer.explore_type("the array element of %s" % name, target_type,
|
||||||
is_child)
|
is_child)
|
||||||
|
@ -371,9 +376,8 @@ class CompoundExplorer(object):
|
||||||
if max_field_name_length < len(pair[0]):
|
if max_field_name_length < len(pair[0]):
|
||||||
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:
|
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
|
@staticmethod
|
||||||
def _get_real_field_count(fields):
|
def _get_real_field_count(fields):
|
||||||
|
@ -447,7 +451,7 @@ class CompoundExplorer(object):
|
||||||
print_list.append((field.name, literal_value))
|
print_list.append((field.name, literal_value))
|
||||||
|
|
||||||
CompoundExplorer._print_fields(print_list)
|
CompoundExplorer._print_fields(print_list)
|
||||||
print ""
|
print ("")
|
||||||
|
|
||||||
if has_explorable_fields:
|
if has_explorable_fields:
|
||||||
choice = raw_input("Enter the field number of choice: ")
|
choice = raw_input("Enter the field number of choice: ")
|
||||||
|
@ -484,7 +488,7 @@ class CompoundExplorer(object):
|
||||||
(name, type_desc, str(datatype)))
|
(name, type_desc, str(datatype)))
|
||||||
Explorer.return_to_enclosing_type_prompt()
|
Explorer.return_to_enclosing_type_prompt()
|
||||||
else:
|
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
|
return False
|
||||||
|
|
||||||
if is_child:
|
if is_child:
|
||||||
|
@ -515,7 +519,7 @@ class CompoundExplorer(object):
|
||||||
current_choice = current_choice + 1
|
current_choice = current_choice + 1
|
||||||
|
|
||||||
CompoundExplorer._print_fields(print_list)
|
CompoundExplorer._print_fields(print_list)
|
||||||
print ""
|
print ("")
|
||||||
|
|
||||||
if len(choice_to_compound_field_map) > 0:
|
if len(choice_to_compound_field_map) > 0:
|
||||||
choice = raw_input("Enter the field number of choice: ")
|
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)
|
value = ExploreUtils.get_value_from_str(arg_str)
|
||||||
if value is not None:
|
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)
|
Explorer.explore_type(str(value.type), value.type, False)
|
||||||
|
|
||||||
raise gdb.GdbError(("'%s' is not a type or value in the current "
|
raise gdb.GdbError(("'%s' is not a type or value in the current "
|
||||||
|
|
|
@ -124,21 +124,17 @@ class InfoPrettyPrinter(gdb.Command):
|
||||||
"""Print a list of pretty-printers."""
|
"""Print a list of pretty-printers."""
|
||||||
# A potential enhancement is to provide an option to list printers in
|
# A potential enhancement is to provide an option to list printers in
|
||||||
# "lookup order" (i.e. unsorted).
|
# "lookup order" (i.e. unsorted).
|
||||||
sorted_pretty_printers = copy.copy(pretty_printers)
|
sorted_pretty_printers = sorted (copy.copy(pretty_printers),
|
||||||
sorted_pretty_printers.sort(lambda x, y:
|
key = self.printer_name)
|
||||||
cmp(self.printer_name(x),
|
|
||||||
self.printer_name(y)))
|
|
||||||
for printer in sorted_pretty_printers:
|
for printer in sorted_pretty_printers:
|
||||||
name = self.printer_name(printer)
|
name = self.printer_name(printer)
|
||||||
enabled = self.enabled_string(printer)
|
enabled = self.enabled_string(printer)
|
||||||
if name_re.match(name):
|
if name_re.match(name):
|
||||||
print " %s%s" % (name, enabled)
|
print (" %s%s" % (name, enabled))
|
||||||
if (hasattr(printer, "subprinters") and
|
if (hasattr(printer, "subprinters") and
|
||||||
printer.subprinters is not None):
|
printer.subprinters is not None):
|
||||||
sorted_subprinters = copy.copy(printer.subprinters)
|
sorted_subprinters = sorted (copy.copy(printer.subprinters),
|
||||||
sorted_subprinters.sort(lambda x, y:
|
key = self.printer_name)
|
||||||
cmp(self.printer_name(x),
|
|
||||||
self.printer_name(y)))
|
|
||||||
for subprinter in sorted_subprinters:
|
for subprinter in sorted_subprinters:
|
||||||
if (not subname_re or
|
if (not subname_re or
|
||||||
subname_re.match(subprinter.name)):
|
subname_re.match(subprinter.name)):
|
||||||
|
@ -150,7 +146,7 @@ class InfoPrettyPrinter(gdb.Command):
|
||||||
obj_name_to_match, object_re, name_re, subname_re):
|
obj_name_to_match, object_re, name_re, subname_re):
|
||||||
"""Subroutine of invoke to simplify it."""
|
"""Subroutine of invoke to simplify it."""
|
||||||
if printer_list and object_re.match(obj_name_to_match):
|
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)
|
self.list_pretty_printers(printer_list, name_re, subname_re)
|
||||||
|
|
||||||
def invoke(self, arg, from_tty):
|
def invoke(self, arg, from_tty):
|
||||||
|
@ -219,7 +215,7 @@ def show_pretty_printer_enabled_summary():
|
||||||
We count subprinters individually.
|
We count subprinters individually.
|
||||||
"""
|
"""
|
||||||
(enabled_count, total_count) = count_all_enabled_printers()
|
(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):
|
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"
|
state = "enabled"
|
||||||
else:
|
else:
|
||||||
state = "disabled"
|
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.
|
# Print the total list of printers currently enabled/disabled.
|
||||||
# This is to further assist the user in determining whether the result
|
# This is to further assist the user in determining whether the result
|
||||||
|
|
|
@ -33,29 +33,29 @@ class InfoTypePrinter(gdb.Command):
|
||||||
"""Print a list of type printers."""
|
"""Print a list of type printers."""
|
||||||
# A potential enhancement is to provide an option to list printers in
|
# A potential enhancement is to provide an option to list printers in
|
||||||
# "lookup order" (i.e. unsorted).
|
# "lookup order" (i.e. unsorted).
|
||||||
sorted_type_printers = copy.copy(type_printers)
|
sorted_type_printers = sorted (copy.copy(type_printers),
|
||||||
sorted_type_printers.sort(lambda x, y: cmp(x.name, y.name))
|
key = lambda x: x.name)
|
||||||
for printer in sorted_type_printers:
|
for printer in sorted_type_printers:
|
||||||
if printer.enabled:
|
if printer.enabled:
|
||||||
enabled = ''
|
enabled = ''
|
||||||
else:
|
else:
|
||||||
enabled = " [disabled]"
|
enabled = " [disabled]"
|
||||||
print " %s%s" % (printer.name, enabled)
|
print (" %s%s" % (printer.name, enabled))
|
||||||
|
|
||||||
def invoke(self, arg, from_tty):
|
def invoke(self, arg, from_tty):
|
||||||
"""GDB calls this to perform the command."""
|
"""GDB calls this to perform the command."""
|
||||||
sep = ''
|
sep = ''
|
||||||
for objfile in gdb.objfiles():
|
for objfile in gdb.objfiles():
|
||||||
if objfile.type_printers:
|
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)
|
self.list_type_printers(objfile.type_printers)
|
||||||
sep = '\n'
|
sep = '\n'
|
||||||
if gdb.current_progspace().type_printers:
|
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)
|
self.list_type_printers(gdb.current_progspace().type_printers)
|
||||||
sep = '\n'
|
sep = '\n'
|
||||||
if gdb.type_printers:
|
if gdb.type_printers:
|
||||||
print "%sGlobal type printers:" % sep
|
print ("%sGlobal type printers:" % sep)
|
||||||
self.list_type_printers(gdb.type_printers)
|
self.list_type_printers(gdb.type_printers)
|
||||||
|
|
||||||
class _EnableOrDisableCommand(gdb.Command):
|
class _EnableOrDisableCommand(gdb.Command):
|
||||||
|
@ -83,7 +83,7 @@ class _EnableOrDisableCommand(gdb.Command):
|
||||||
if self.set_some(name, gdb.type_printers):
|
if self.set_some(name, gdb.type_printers):
|
||||||
ok = True
|
ok = True
|
||||||
if not ok:
|
if not ok:
|
||||||
print "No type printer named '%s'" % name
|
print ("No type printer named '%s'" % name)
|
||||||
|
|
||||||
def add_some(self, result, word, printers):
|
def add_some(self, result, word, printers):
|
||||||
for p in printers:
|
for p in printers:
|
||||||
|
|
|
@ -19,7 +19,12 @@
|
||||||
import gdb
|
import gdb
|
||||||
import gdb.types
|
import gdb.types
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info[0] > 2:
|
||||||
|
# Python 3 removed basestring and long
|
||||||
|
basestring = str
|
||||||
|
long = int
|
||||||
|
|
||||||
class PrettyPrinter(object):
|
class PrettyPrinter(object):
|
||||||
"""A basic pretty-printer.
|
"""A basic pretty-printer.
|
||||||
|
|
|
@ -98,8 +98,7 @@ def prompt_help():
|
||||||
functions."""
|
functions."""
|
||||||
|
|
||||||
result = ''
|
result = ''
|
||||||
keys = prompt_substitutions.keys()
|
keys = sorted (prompt_substitutions.keys())
|
||||||
keys.sort()
|
|
||||||
for key in keys:
|
for key in keys:
|
||||||
result += ' \\%s\t%s\n' % (key, prompt_substitutions[key].__doc__)
|
result += ' \\%s\t%s\n' % (key, prompt_substitutions[key].__doc__)
|
||||||
result += """
|
result += """
|
||||||
|
|
|
@ -475,8 +475,7 @@ static PyGetSetDef block_object_getset[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject block_object_type = {
|
PyTypeObject block_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Block", /*tp_name*/
|
"gdb.Block", /*tp_name*/
|
||||||
sizeof (block_object), /*tp_basicsize*/
|
sizeof (block_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
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 = {
|
static PyTypeObject block_syms_iterator_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.BlockIterator", /*tp_name*/
|
"gdb.BlockIterator", /*tp_name*/
|
||||||
sizeof (block_syms_iterator_object), /*tp_basicsize*/
|
sizeof (block_syms_iterator_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -981,8 +981,7 @@ static PyMethodDef breakpoint_object_methods[] =
|
||||||
|
|
||||||
PyTypeObject breakpoint_object_type =
|
PyTypeObject breakpoint_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Breakpoint", /*tp_name*/
|
"gdb.Breakpoint", /*tp_name*/
|
||||||
sizeof (breakpoint_object), /*tp_basicsize*/
|
sizeof (breakpoint_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -607,8 +607,7 @@ static PyMethodDef cmdpy_object_methods[] =
|
||||||
|
|
||||||
static PyTypeObject cmdpy_object_type =
|
static PyTypeObject cmdpy_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Command", /*tp_name*/
|
"gdb.Command", /*tp_name*/
|
||||||
sizeof (cmdpy_object), /*tp_basicsize*/
|
sizeof (cmdpy_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -24,7 +24,7 @@ void
|
||||||
evpy_dealloc (PyObject *self)
|
evpy_dealloc (PyObject *self)
|
||||||
{
|
{
|
||||||
Py_XDECREF (((event_object *) self)->dict);
|
Py_XDECREF (((event_object *) self)->dict);
|
||||||
self->ob_type->tp_free (self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
|
@ -143,8 +143,7 @@ static PyGetSetDef event_object_getset[] =
|
||||||
|
|
||||||
PyTypeObject event_object_type =
|
PyTypeObject event_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /* ob_size */
|
|
||||||
"gdb.Event", /* tp_name */
|
"gdb.Event", /* tp_name */
|
||||||
sizeof (event_object), /* tp_basicsize */
|
sizeof (event_object), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
|
|
|
@ -48,8 +48,7 @@
|
||||||
\
|
\
|
||||||
qual PyTypeObject name##_event_object_type = \
|
qual PyTypeObject name##_event_object_type = \
|
||||||
{ \
|
{ \
|
||||||
PyObject_HEAD_INIT (NULL) \
|
PyVarObject_HEAD_INIT (NULL, 0) \
|
||||||
0, /* ob_size */ \
|
|
||||||
py_path, /* tp_name */ \
|
py_path, /* tp_name */ \
|
||||||
sizeof (event_object), /* tp_basicsize */ \
|
sizeof (event_object), /* tp_basicsize */ \
|
||||||
0, /* tp_itemsize */ \
|
0, /* tp_itemsize */ \
|
||||||
|
|
|
@ -97,7 +97,7 @@ static void
|
||||||
evregpy_dealloc (PyObject *self)
|
evregpy_dealloc (PyObject *self)
|
||||||
{
|
{
|
||||||
Py_XDECREF (((eventregistry_object *) self)->callbacks);
|
Py_XDECREF (((eventregistry_object *) self)->callbacks);
|
||||||
self->ob_type->tp_free (self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the Python event registry code. */
|
/* Initialize the Python event registry code. */
|
||||||
|
@ -131,8 +131,7 @@ static PyMethodDef eventregistry_object_methods[] =
|
||||||
|
|
||||||
static PyTypeObject eventregistry_object_type =
|
static PyTypeObject eventregistry_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /* ob_size */
|
|
||||||
"gdb.EventRegistry", /* tp_name */
|
"gdb.EventRegistry", /* tp_name */
|
||||||
sizeof (eventregistry_object), /* tp_basicsize */
|
sizeof (eventregistry_object), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
|
|
|
@ -20,6 +20,21 @@
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "py-events.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. */
|
/* Initialize python events. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -45,7 +60,11 @@ add_new_registry (eventregistry_object **registryp, char *name)
|
||||||
void
|
void
|
||||||
gdbpy_initialize_py_events (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);
|
gdb_py_events.module = Py_InitModule ("events", NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!gdb_py_events.module)
|
if (!gdb_py_events.module)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -62,7 +81,9 @@ gdbpy_initialize_py_events (void)
|
||||||
if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0)
|
if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
#ifndef IS_PY3K
|
||||||
Py_INCREF (gdb_py_events.module);
|
Py_INCREF (gdb_py_events.module);
|
||||||
|
#endif
|
||||||
if (PyModule_AddObject (gdb_module,
|
if (PyModule_AddObject (gdb_module,
|
||||||
"events",
|
"events",
|
||||||
(PyObject *) gdb_py_events.module) < 0)
|
(PyObject *) gdb_py_events.module) < 0)
|
||||||
|
|
|
@ -425,8 +425,7 @@ None otherwise.", NULL },
|
||||||
|
|
||||||
static PyTypeObject finish_breakpoint_object_type =
|
static PyTypeObject finish_breakpoint_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.FinishBreakpoint", /*tp_name*/
|
"gdb.FinishBreakpoint", /*tp_name*/
|
||||||
sizeof (struct finish_breakpoint_object), /*tp_basicsize*/
|
sizeof (struct finish_breakpoint_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -662,8 +662,7 @@ Return the value of the variable in this frame." },
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject frame_object_type = {
|
PyTypeObject frame_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /* ob_size */
|
|
||||||
"gdb.Frame", /* tp_name */
|
"gdb.Frame", /* tp_name */
|
||||||
sizeof (frame_object), /* tp_basicsize */
|
sizeof (frame_object), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
|
|
|
@ -208,8 +208,7 @@ gdbpy_initialize_functions (void)
|
||||||
|
|
||||||
static PyTypeObject fnpy_object_type =
|
static PyTypeObject fnpy_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Function", /*tp_name*/
|
"gdb.Function", /*tp_name*/
|
||||||
sizeof (PyObject), /*tp_basicsize*/
|
sizeof (PyObject), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -454,9 +454,14 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw)
|
||||||
membuf_obj->addr = addr;
|
membuf_obj->addr = addr;
|
||||||
membuf_obj->length = length;
|
membuf_obj->length = length;
|
||||||
|
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
result = PyMemoryView_FromObject ((PyObject *) membuf_obj);
|
||||||
|
#else
|
||||||
result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0,
|
result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj, 0,
|
||||||
Py_END_OF_BUFFER);
|
Py_END_OF_BUFFER);
|
||||||
|
#endif
|
||||||
Py_DECREF (membuf_obj);
|
Py_DECREF (membuf_obj);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,12 +481,22 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw)
|
||||||
PyObject *addr_obj, *length_obj = NULL;
|
PyObject *addr_obj, *length_obj = NULL;
|
||||||
volatile struct gdb_exception except;
|
volatile struct gdb_exception except;
|
||||||
static char *keywords[] = { "address", "buffer", "length", NULL };
|
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,
|
if (! PyArg_ParseTupleAndKeywords (args, kw, "Os#|O", keywords,
|
||||||
&addr_obj, &buffer, &buf_len,
|
&addr_obj, &buffer, &buf_len,
|
||||||
&length_obj))
|
&length_obj))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
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);
|
write_memory_with_notification (addr, buffer, length);
|
||||||
}
|
}
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
PyBuffer_Release (&pybuf);
|
||||||
|
#endif
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -513,7 +532,7 @@ static void
|
||||||
mbpy_dealloc (PyObject *self)
|
mbpy_dealloc (PyObject *self)
|
||||||
{
|
{
|
||||||
xfree (((membuf_object *) self)->buffer);
|
xfree (((membuf_object *) self)->buffer);
|
||||||
self->ob_type->tp_free (self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a description of the Membuf object. */
|
/* Return a description of the Membuf object. */
|
||||||
|
@ -528,6 +547,24 @@ which is %s bytes long."),
|
||||||
pulongest (membuf_obj->length));
|
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
|
static Py_ssize_t
|
||||||
get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr)
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* IS_PY3K */
|
||||||
|
|
||||||
/* Implementation of
|
/* Implementation of
|
||||||
gdb.search_memory (address, length, pattern). ADDRESS is the
|
gdb.search_memory (address, length, pattern). ADDRESS is the
|
||||||
address to start the search. LENGTH specifies the scope of 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;
|
CORE_ADDR start_addr, length;
|
||||||
static char *keywords[] = { "address", "length", "pattern", NULL };
|
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;
|
volatile struct gdb_exception except;
|
||||||
Py_ssize_t pattern_size;
|
Py_ssize_t pattern_size;
|
||||||
const void *buffer;
|
const void *buffer;
|
||||||
CORE_ADDR found_addr;
|
CORE_ADDR found_addr;
|
||||||
int found = 0;
|
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,
|
&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))
|
&pattern))
|
||||||
return NULL;
|
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;
|
|
||||||
|
|
||||||
if (!PyObject_CheckReadBuffer (pattern))
|
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)
|
if (PyObject_AsReadBuffer (pattern, &buffer, &pattern_size) == -1)
|
||||||
return NULL;
|
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)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
@ -638,6 +697,10 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw)
|
||||||
}
|
}
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
PyBuffer_Release (&pybuf);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
return PyLong_FromLong (found_addr);
|
return PyLong_FromLong (found_addr);
|
||||||
else
|
else
|
||||||
|
@ -777,8 +840,7 @@ Return a long with the address of a match, or None." },
|
||||||
|
|
||||||
static PyTypeObject inferior_object_type =
|
static PyTypeObject inferior_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /* ob_size */
|
|
||||||
"gdb.Inferior", /* tp_name */
|
"gdb.Inferior", /* tp_name */
|
||||||
sizeof (inferior_object), /* tp_basicsize */
|
sizeof (inferior_object), /* tp_basicsize */
|
||||||
0, /* tp_itemsize */
|
0, /* tp_itemsize */
|
||||||
|
@ -817,6 +879,15 @@ static PyTypeObject inferior_object_type =
|
||||||
0 /* tp_alloc */
|
0 /* tp_alloc */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
|
||||||
|
static PyBufferProcs buffer_procs =
|
||||||
|
{
|
||||||
|
get_buffer
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* Python doesn't provide a decent way to get compatibility here. */
|
/* Python doesn't provide a decent way to get compatibility here. */
|
||||||
#if HAVE_LIBPYTHON2_4
|
#if HAVE_LIBPYTHON2_4
|
||||||
#define CHARBUFFERPROC_NAME getcharbufferproc
|
#define CHARBUFFERPROC_NAME getcharbufferproc
|
||||||
|
@ -832,10 +903,10 @@ static PyBufferProcs buffer_procs = {
|
||||||
Python 2.5. */
|
Python 2.5. */
|
||||||
(CHARBUFFERPROC_NAME) get_char_buffer
|
(CHARBUFFERPROC_NAME) get_char_buffer
|
||||||
};
|
};
|
||||||
|
#endif /* IS_PY3K */
|
||||||
|
|
||||||
static PyTypeObject membuf_object_type = {
|
static PyTypeObject membuf_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Membuf", /*tp_name*/
|
"gdb.Membuf", /*tp_name*/
|
||||||
sizeof (membuf_object), /*tp_basicsize*/
|
sizeof (membuf_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -59,7 +59,7 @@ static void
|
||||||
thpy_dealloc (PyObject *self)
|
thpy_dealloc (PyObject *self)
|
||||||
{
|
{
|
||||||
Py_DECREF (((thread_object *) self)->inf_obj);
|
Py_DECREF (((thread_object *) self)->inf_obj);
|
||||||
self->ob_type->tp_free (self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -301,8 +301,7 @@ Return whether the thread is exited." },
|
||||||
|
|
||||||
static PyTypeObject thread_object_type =
|
static PyTypeObject thread_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.InferiorThread", /*tp_name*/
|
"gdb.InferiorThread", /*tp_name*/
|
||||||
sizeof (thread_object), /*tp_basicsize*/
|
sizeof (thread_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -216,8 +216,7 @@ static PyGetSetDef lazy_string_object_getset[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyTypeObject lazy_string_object_type = {
|
static PyTypeObject lazy_string_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.LazyString", /*tp_name*/
|
"gdb.LazyString", /*tp_name*/
|
||||||
sizeof (lazy_string_object), /*tp_basicsize*/
|
sizeof (lazy_string_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -62,7 +62,7 @@ objfpy_dealloc (PyObject *o)
|
||||||
|
|
||||||
Py_XDECREF (self->printers);
|
Py_XDECREF (self->printers);
|
||||||
Py_XDECREF (self->type_printers);
|
Py_XDECREF (self->type_printers);
|
||||||
self->ob_type->tp_free ((PyObject *) self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -277,8 +277,7 @@ static PyGetSetDef objfile_getset[] =
|
||||||
|
|
||||||
static PyTypeObject objfile_object_type =
|
static PyTypeObject objfile_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Objfile", /*tp_name*/
|
"gdb.Objfile", /*tp_name*/
|
||||||
sizeof (objfile_object), /*tp_basicsize*/
|
sizeof (objfile_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -102,7 +102,11 @@ static PyObject *
|
||||||
get_attr (PyObject *obj, PyObject *attr_name)
|
get_attr (PyObject *obj, PyObject *attr_name)
|
||||||
{
|
{
|
||||||
if (PyString_Check (attr_name)
|
if (PyString_Check (attr_name)
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
&& ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
|
||||||
|
#else
|
||||||
&& ! strcmp (PyString_AsString (attr_name), "value"))
|
&& ! strcmp (PyString_AsString (attr_name), "value"))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
parmpy_object *self = (parmpy_object *) obj;
|
parmpy_object *self = (parmpy_object *) obj;
|
||||||
|
|
||||||
|
@ -276,7 +280,11 @@ static int
|
||||||
set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
|
set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
|
||||||
{
|
{
|
||||||
if (PyString_Check (attr_name)
|
if (PyString_Check (attr_name)
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
&& ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
|
||||||
|
#else
|
||||||
&& ! strcmp (PyString_AsString (attr_name), "value"))
|
&& ! strcmp (PyString_AsString (attr_name), "value"))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (!val)
|
if (!val)
|
||||||
{
|
{
|
||||||
|
@ -773,8 +781,7 @@ gdbpy_initialize_parameters (void)
|
||||||
|
|
||||||
static PyTypeObject parmpy_object_type =
|
static PyTypeObject parmpy_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Parameter", /*tp_name*/
|
"gdb.Parameter", /*tp_name*/
|
||||||
sizeof (parmpy_object), /*tp_basicsize*/
|
sizeof (parmpy_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -348,8 +348,13 @@ print_string_repr (PyObject *printer, const char *hint,
|
||||||
struct type *type;
|
struct type *type;
|
||||||
|
|
||||||
make_cleanup_py_decref (string);
|
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);
|
output = PyString_AsString (string);
|
||||||
length = PyString_Size (string);
|
length = PyString_Size (string);
|
||||||
|
#endif
|
||||||
type = builtin_type (gdbarch)->builtin_char;
|
type = builtin_type (gdbarch)->builtin_char;
|
||||||
|
|
||||||
if (hint && !strcmp (hint, "string"))
|
if (hint && !strcmp (hint, "string"))
|
||||||
|
@ -383,6 +388,7 @@ print_string_repr (PyObject *printer, const char *hint,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef IS_PY3K
|
||||||
static void
|
static void
|
||||||
py_restore_tstate (void *p)
|
py_restore_tstate (void *p)
|
||||||
{
|
{
|
||||||
|
@ -458,6 +464,7 @@ push_dummy_python_frame (void)
|
||||||
make_cleanup (py_restore_tstate, frame->f_back);
|
make_cleanup (py_restore_tstate, frame->f_back);
|
||||||
return (PyObject *) frame;
|
return (PyObject *) frame;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Helper for apply_val_pretty_printer that formats children of the
|
/* Helper for apply_val_pretty_printer that formats children of the
|
||||||
printer, if any exist. If is_py_none is true, then nothing has
|
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;
|
int is_map, is_array, done_flag, pretty;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
PyObject *children, *iter, *frame;
|
PyObject *children, *iter;
|
||||||
|
#ifndef IS_PY3K
|
||||||
|
PyObject *frame;
|
||||||
|
#endif
|
||||||
struct cleanup *cleanups;
|
struct cleanup *cleanups;
|
||||||
|
|
||||||
if (! PyObject_HasAttr (printer, gdbpy_children_cst))
|
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,
|
/* Manufacture a dummy Python frame to work around Python 2.4 bug,
|
||||||
where it insists on having a non-NULL tstate->frame when
|
where it insists on having a non-NULL tstate->frame when
|
||||||
a generator is called. */
|
a generator is called. */
|
||||||
|
#ifndef IS_PY3K
|
||||||
frame = push_dummy_python_frame ();
|
frame = push_dummy_python_frame ();
|
||||||
if (!frame)
|
if (!frame)
|
||||||
{
|
{
|
||||||
|
@ -522,6 +533,7 @@ print_children (PyObject *printer, const char *hint,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
make_cleanup_py_decref (frame);
|
make_cleanup_py_decref (frame);
|
||||||
|
#endif
|
||||||
|
|
||||||
done_flag = 0;
|
done_flag = 0;
|
||||||
for (i = 0; i < options->print_max; ++i)
|
for (i = 0; i < options->print_max; ++i)
|
||||||
|
|
|
@ -70,7 +70,7 @@ pspy_dealloc (PyObject *self)
|
||||||
|
|
||||||
Py_XDECREF (ps_self->printers);
|
Py_XDECREF (ps_self->printers);
|
||||||
Py_XDECREF (ps_self->type_printers);
|
Py_XDECREF (ps_self->type_printers);
|
||||||
self->ob_type->tp_free (self);
|
Py_TYPE (self)->tp_free (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -264,8 +264,7 @@ static PyGetSetDef pspace_getset[] =
|
||||||
|
|
||||||
static PyTypeObject pspace_object_type =
|
static PyTypeObject pspace_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Progspace", /*tp_name*/
|
"gdb.Progspace", /*tp_name*/
|
||||||
sizeof (pspace_object), /*tp_basicsize*/
|
sizeof (pspace_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -561,8 +561,7 @@ Return the value of the symbol." },
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject symbol_object_type = {
|
PyTypeObject symbol_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Symbol", /*tp_name*/
|
"gdb.Symbol", /*tp_name*/
|
||||||
sizeof (symbol_object), /*tp_basicsize*/
|
sizeof (symbol_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -307,7 +307,7 @@ salpy_dealloc (PyObject *self)
|
||||||
|
|
||||||
Py_DECREF (self_sal->symtab);
|
Py_DECREF (self_sal->symtab);
|
||||||
xfree (self_sal->sal);
|
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
|
/* 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 = {
|
static PyTypeObject symtab_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Symtab", /*tp_name*/
|
"gdb.Symtab", /*tp_name*/
|
||||||
sizeof (symtab_object), /*tp_basicsize*/
|
sizeof (symtab_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
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 = {
|
static PyTypeObject sal_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Symtab_and_line", /*tp_name*/
|
"gdb.Symtab_and_line", /*tp_name*/
|
||||||
sizeof (sal_object), /*tp_basicsize*/
|
sizeof (sal_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -123,7 +123,7 @@ field_dealloc (PyObject *obj)
|
||||||
field_object *f = (field_object *) obj;
|
field_object *f = (field_object *) obj;
|
||||||
|
|
||||||
Py_XDECREF (f->dict);
|
Py_XDECREF (f->dict);
|
||||||
f->ob_type->tp_free (obj);
|
Py_TYPE (obj)->tp_free (obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -1262,7 +1262,7 @@ typy_dealloc (PyObject *obj)
|
||||||
if (type->next)
|
if (type->next)
|
||||||
type->next->prev = type->prev;
|
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). */
|
/* Return number of fields ("length" of the field dictionary). */
|
||||||
|
@ -1657,7 +1657,9 @@ static PyNumberMethods type_object_as_number = {
|
||||||
NULL, /* nb_add */
|
NULL, /* nb_add */
|
||||||
NULL, /* nb_subtract */
|
NULL, /* nb_subtract */
|
||||||
NULL, /* nb_multiply */
|
NULL, /* nb_multiply */
|
||||||
|
#ifndef IS_PY3K
|
||||||
NULL, /* nb_divide */
|
NULL, /* nb_divide */
|
||||||
|
#endif
|
||||||
NULL, /* nb_remainder */
|
NULL, /* nb_remainder */
|
||||||
NULL, /* nb_divmod */
|
NULL, /* nb_divmod */
|
||||||
NULL, /* nb_power */
|
NULL, /* nb_power */
|
||||||
|
@ -1671,12 +1673,19 @@ static PyNumberMethods type_object_as_number = {
|
||||||
NULL, /* nb_and */
|
NULL, /* nb_and */
|
||||||
NULL, /* nb_xor */
|
NULL, /* nb_xor */
|
||||||
NULL, /* nb_or */
|
NULL, /* nb_or */
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
NULL, /* nb_int */
|
||||||
|
NULL, /* reserved */
|
||||||
|
#else
|
||||||
NULL, /* nb_coerce */
|
NULL, /* nb_coerce */
|
||||||
NULL, /* nb_int */
|
NULL, /* nb_int */
|
||||||
NULL, /* nb_long */
|
NULL, /* nb_long */
|
||||||
|
#endif
|
||||||
NULL, /* nb_float */
|
NULL, /* nb_float */
|
||||||
|
#ifndef IS_PY3K
|
||||||
NULL, /* nb_oct */
|
NULL, /* nb_oct */
|
||||||
NULL /* nb_hex */
|
NULL /* nb_hex */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyMappingMethods typy_mapping = {
|
static PyMappingMethods typy_mapping = {
|
||||||
|
@ -1687,8 +1696,7 @@ static PyMappingMethods typy_mapping = {
|
||||||
|
|
||||||
static PyTypeObject type_object_type =
|
static PyTypeObject type_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Type", /*tp_name*/
|
"gdb.Type", /*tp_name*/
|
||||||
sizeof (type_object), /*tp_basicsize*/
|
sizeof (type_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
@ -1737,8 +1745,7 @@ static PyGetSetDef field_object_getset[] =
|
||||||
|
|
||||||
static PyTypeObject field_object_type =
|
static PyTypeObject field_object_type =
|
||||||
{
|
{
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Field", /*tp_name*/
|
"gdb.Field", /*tp_name*/
|
||||||
sizeof (field_object), /*tp_basicsize*/
|
sizeof (field_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
@ -1779,8 +1786,7 @@ static PyTypeObject field_object_type =
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyTypeObject type_iterator_object_type = {
|
static PyTypeObject type_iterator_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.TypeIterator", /*tp_name*/
|
"gdb.TypeIterator", /*tp_name*/
|
||||||
sizeof (typy_iterator_object), /*tp_basicsize*/
|
sizeof (typy_iterator_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -54,7 +54,8 @@ make_cleanup_py_decref (PyObject *py)
|
||||||
|
|
||||||
As an added bonus, the functions accepts a unicode string and returns it
|
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
|
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
|
If the given object is not one of the mentioned string types, NULL is
|
||||||
returned, with the TypeError python exception set. */
|
returned, with the TypeError python exception set. */
|
||||||
|
@ -70,9 +71,10 @@ python_string_to_unicode (PyObject *obj)
|
||||||
unicode_str = obj;
|
unicode_str = obj;
|
||||||
Py_INCREF (obj);
|
Py_INCREF (obj);
|
||||||
}
|
}
|
||||||
|
#ifndef IS_PY3K
|
||||||
else if (PyString_Check (obj))
|
else if (PyString_Check (obj))
|
||||||
unicode_str = PyUnicode_FromEncodedObject (obj, host_charset (), NULL);
|
unicode_str = PyUnicode_FromEncodedObject (obj, host_charset (), NULL);
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PyErr_SetString (PyExc_TypeError,
|
PyErr_SetString (PyExc_TypeError,
|
||||||
|
@ -99,7 +101,11 @@ unicode_to_encoded_string (PyObject *unicode_str, const char *charset)
|
||||||
if (string == NULL)
|
if (string == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
result = xstrdup (PyBytes_AsString (string));
|
||||||
|
#else
|
||||||
result = xstrdup (PyString_AsString (string));
|
result = xstrdup (PyString_AsString (string));
|
||||||
|
#endif
|
||||||
|
|
||||||
Py_DECREF (string);
|
Py_DECREF (string);
|
||||||
|
|
||||||
|
@ -113,14 +119,8 @@ unicode_to_encoded_string (PyObject *unicode_str, const char *charset)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
unicode_to_encoded_python_string (PyObject *unicode_str, const char *charset)
|
unicode_to_encoded_python_string (PyObject *unicode_str, const char *charset)
|
||||||
{
|
{
|
||||||
PyObject *string;
|
|
||||||
|
|
||||||
/* Translate string to named charset. */
|
/* Translate string to named charset. */
|
||||||
string = PyUnicode_AsEncodedString (unicode_str, charset, NULL);
|
return PyUnicode_AsEncodedString (unicode_str, charset, NULL);
|
||||||
if (string == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a newly allocated string with the contents of the given unicode
|
/* 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
|
/* 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
|
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 *
|
PyObject *
|
||||||
python_string_to_target_python_string (PyObject *obj)
|
python_string_to_target_python_string (PyObject *obj)
|
||||||
{
|
{
|
||||||
|
@ -221,7 +223,11 @@ target_string_to_unicode (const gdb_byte *str, int length)
|
||||||
int
|
int
|
||||||
gdbpy_is_string (PyObject *obj)
|
gdbpy_is_string (PyObject *obj)
|
||||||
{
|
{
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
return PyUnicode_Check (obj);
|
||||||
|
#else
|
||||||
return PyString_Check (obj) || PyUnicode_Check (obj);
|
return PyString_Check (obj) || PyUnicode_Check (obj);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the string representation of OBJ, i.e., str (obj).
|
/* Return the string representation of OBJ, i.e., str (obj).
|
||||||
|
@ -235,7 +241,11 @@ gdbpy_obj_to_string (PyObject *obj)
|
||||||
|
|
||||||
if (str_obj != NULL)
|
if (str_obj != NULL)
|
||||||
{
|
{
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
char *msg = python_string_to_host_string (str_obj);
|
||||||
|
#else
|
||||||
char *msg = xstrdup (PyString_AsString (str_obj));
|
char *msg = xstrdup (PyString_AsString (str_obj));
|
||||||
|
#endif
|
||||||
|
|
||||||
Py_DECREF (str_obj);
|
Py_DECREF (str_obj);
|
||||||
return msg;
|
return msg;
|
||||||
|
@ -335,6 +345,11 @@ get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
|
||||||
PyObject *
|
PyObject *
|
||||||
gdb_py_object_from_longest (LONGEST l)
|
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. */
|
#ifdef HAVE_LONG_LONG /* Defined by Python. */
|
||||||
/* If we have 'long long', and the value overflows a 'long', use a
|
/* If we have 'long long', and the value overflows a 'long', use a
|
||||||
Python Long; otherwise use a Python Int. */
|
Python Long; otherwise use a Python Int. */
|
||||||
|
@ -343,6 +358,7 @@ gdb_py_object_from_longest (LONGEST l)
|
||||||
return PyLong_FromLongLong (l);
|
return PyLong_FromLongLong (l);
|
||||||
#endif
|
#endif
|
||||||
return PyInt_FromLong (l);
|
return PyInt_FromLong (l);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert a ULONGEST to the appropriate Python object -- either an
|
/* Convert a ULONGEST to the appropriate Python object -- either an
|
||||||
|
@ -351,6 +367,11 @@ gdb_py_object_from_longest (LONGEST l)
|
||||||
PyObject *
|
PyObject *
|
||||||
gdb_py_object_from_ulongest (ULONGEST l)
|
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. */
|
#ifdef HAVE_LONG_LONG /* Defined by Python. */
|
||||||
/* If we have 'long long', and the value overflows a 'long', use a
|
/* If we have 'long long', and the value overflows a 'long', use a
|
||||||
Python Long; otherwise use a Python Int. */
|
Python Long; otherwise use a Python Int. */
|
||||||
|
@ -362,6 +383,7 @@ gdb_py_object_from_ulongest (ULONGEST l)
|
||||||
return PyLong_FromUnsignedLong (l);
|
return PyLong_FromUnsignedLong (l);
|
||||||
|
|
||||||
return PyInt_FromLong (l);
|
return PyInt_FromLong (l);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like PyInt_AsLong, but returns 0 on failure, 1 on success, and puts
|
/* Like PyInt_AsLong, but returns 0 on failure, 1 on success, and puts
|
||||||
|
|
|
@ -106,7 +106,7 @@ valpy_dealloc (PyObject *obj)
|
||||||
|
|
||||||
Py_XDECREF (self->dynamic_type);
|
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. */
|
/* 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));
|
|| (ptr_ok && TYPE_CODE (type) == TYPE_CODE_PTR));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef IS_PY3K
|
||||||
/* Implements conversion to int. */
|
/* Implements conversion to int. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
valpy_int (PyObject *self)
|
valpy_int (PyObject *self)
|
||||||
|
@ -1161,6 +1162,7 @@ valpy_int (PyObject *self)
|
||||||
|
|
||||||
return gdb_py_object_from_longest (l);
|
return gdb_py_object_from_longest (l);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Implements conversion to long. */
|
/* Implements conversion to long. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -1335,9 +1337,14 @@ convert_value_from_python (PyObject *obj)
|
||||||
value = value_copy (((value_object *) result)->value);
|
value = value_copy (((value_object *) result)->value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
PyErr_Format (PyExc_TypeError,
|
||||||
|
_("Could not convert Python object: %S."), obj);
|
||||||
|
#else
|
||||||
PyErr_Format (PyExc_TypeError,
|
PyErr_Format (PyExc_TypeError,
|
||||||
_("Could not convert Python object: %s."),
|
_("Could not convert Python object: %s."),
|
||||||
PyString_AsString (PyObject_Str (obj)));
|
PyString_AsString (PyObject_Str (obj)));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (except.reason < 0)
|
if (except.reason < 0)
|
||||||
{
|
{
|
||||||
|
@ -1439,7 +1446,9 @@ static PyNumberMethods value_object_as_number = {
|
||||||
valpy_add,
|
valpy_add,
|
||||||
valpy_subtract,
|
valpy_subtract,
|
||||||
valpy_multiply,
|
valpy_multiply,
|
||||||
|
#ifndef IS_PY3K
|
||||||
valpy_divide,
|
valpy_divide,
|
||||||
|
#endif
|
||||||
valpy_remainder,
|
valpy_remainder,
|
||||||
NULL, /* nb_divmod */
|
NULL, /* nb_divmod */
|
||||||
valpy_power, /* nb_power */
|
valpy_power, /* nb_power */
|
||||||
|
@ -1453,12 +1462,31 @@ static PyNumberMethods value_object_as_number = {
|
||||||
valpy_and, /* nb_and */
|
valpy_and, /* nb_and */
|
||||||
valpy_xor, /* nb_xor */
|
valpy_xor, /* nb_xor */
|
||||||
valpy_or, /* nb_or */
|
valpy_or, /* nb_or */
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
valpy_long, /* nb_int */
|
||||||
|
NULL, /* reserved */
|
||||||
|
#else
|
||||||
NULL, /* nb_coerce */
|
NULL, /* nb_coerce */
|
||||||
valpy_int, /* nb_int */
|
valpy_int, /* nb_int */
|
||||||
valpy_long, /* nb_long */
|
valpy_long, /* nb_long */
|
||||||
|
#endif
|
||||||
valpy_float, /* nb_float */
|
valpy_float, /* nb_float */
|
||||||
|
#ifndef IS_PY3K
|
||||||
NULL, /* nb_oct */
|
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 = {
|
static PyMappingMethods value_object_as_mapping = {
|
||||||
|
@ -1468,8 +1496,7 @@ static PyMappingMethods value_object_as_mapping = {
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject value_object_type = {
|
PyTypeObject value_object_type = {
|
||||||
PyObject_HEAD_INIT (NULL)
|
PyVarObject_HEAD_INIT (NULL, 0)
|
||||||
0, /*ob_size*/
|
|
||||||
"gdb.Value", /*tp_name*/
|
"gdb.Value", /*tp_name*/
|
||||||
sizeof (value_object), /*tp_basicsize*/
|
sizeof (value_object), /*tp_basicsize*/
|
||||||
0, /*tp_itemsize*/
|
0, /*tp_itemsize*/
|
||||||
|
|
|
@ -10,8 +10,8 @@ valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
|
||||||
'ldflags', 'help']
|
'ldflags', 'help']
|
||||||
|
|
||||||
def exit_with_usage(code=1):
|
def exit_with_usage(code=1):
|
||||||
print >>sys.stderr, "Usage: %s [%s]" % (sys.argv[0],
|
sys.stderr.write ("Usage: %s [%s]\n" % (sys.argv[0],
|
||||||
'|'.join('--'+opt for opt in valid_opts))
|
'|'.join('--'+opt for opt in valid_opts)))
|
||||||
sys.exit(code)
|
sys.exit(code)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -24,6 +24,7 @@ if not opts:
|
||||||
|
|
||||||
pyver = sysconfig.get_config_var('VERSION')
|
pyver = sysconfig.get_config_var('VERSION')
|
||||||
getvar = sysconfig.get_config_var
|
getvar = sysconfig.get_config_var
|
||||||
|
abiflags = getattr (sys, "abiflags", "")
|
||||||
|
|
||||||
opt_flags = [flag for (flag, val) in opts]
|
opt_flags = [flag for (flag, val) in opts]
|
||||||
|
|
||||||
|
@ -44,17 +45,17 @@ def to_unix_path(path):
|
||||||
|
|
||||||
for opt in opt_flags:
|
for opt in opt_flags:
|
||||||
if opt == '--prefix':
|
if opt == '--prefix':
|
||||||
print to_unix_path(sysconfig.PREFIX)
|
print (to_unix_path(sysconfig.PREFIX))
|
||||||
|
|
||||||
elif opt == '--exec-prefix':
|
elif opt == '--exec-prefix':
|
||||||
print to_unix_path(sysconfig.EXEC_PREFIX)
|
print (to_unix_path(sysconfig.EXEC_PREFIX))
|
||||||
|
|
||||||
elif opt in ('--includes', '--cflags'):
|
elif opt in ('--includes', '--cflags'):
|
||||||
flags = ['-I' + sysconfig.get_python_inc(),
|
flags = ['-I' + sysconfig.get_python_inc(),
|
||||||
'-I' + sysconfig.get_python_inc(plat_specific=True)]
|
'-I' + sysconfig.get_python_inc(plat_specific=True)]
|
||||||
if opt == '--cflags':
|
if opt == '--cflags':
|
||||||
flags.extend(getvar('CFLAGS').split())
|
flags.extend(getvar('CFLAGS').split())
|
||||||
print to_unix_path(' '.join(flags))
|
print (to_unix_path(' '.join(flags)))
|
||||||
|
|
||||||
elif opt in ('--libs', '--ldflags'):
|
elif opt in ('--libs', '--ldflags'):
|
||||||
libs = []
|
libs = []
|
||||||
|
@ -62,7 +63,7 @@ for opt in opt_flags:
|
||||||
libs.extend(getvar('LIBS').split())
|
libs.extend(getvar('LIBS').split())
|
||||||
if getvar('SYSLIBS') is not None:
|
if getvar('SYSLIBS') is not None:
|
||||||
libs.extend(getvar('SYSLIBS').split())
|
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
|
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
|
||||||
# shared library in prefix/lib/.
|
# shared library in prefix/lib/.
|
||||||
if opt == '--ldflags':
|
if opt == '--ldflags':
|
||||||
|
@ -73,5 +74,5 @@ for opt in opt_flags:
|
||||||
libs.insert(0, '-L' + sysconfig.PREFIX + '/libs')
|
libs.insert(0, '-L' + sysconfig.PREFIX + '/libs')
|
||||||
if getvar('LINKFORSHARED') is not None:
|
if getvar('LINKFORSHARED') is not None:
|
||||||
libs.extend(getvar('LINKFORSHARED').split())
|
libs.extend(getvar('LINKFORSHARED').split())
|
||||||
print to_unix_path(' '.join(libs))
|
print (to_unix_path(' '.join(libs)))
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,25 @@
|
||||||
from including our python/python.h header file. */
|
from including our python/python.h header file. */
|
||||||
#include <Python.h>
|
#include <Python.h>
|
||||||
#include <frameobject.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
|
#if HAVE_LIBPYTHON2_4
|
||||||
/* Py_ssize_t is not defined until 2.5.
|
/* 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
|
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;
|
typedef int Py_ssize_t;
|
||||||
#endif
|
#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
|
/* If Python.h does not define WITH_THREAD, then the various
|
||||||
GIL-related functions will not be defined. However,
|
GIL-related functions will not be defined. However,
|
||||||
PyGILState_STATE will be. */
|
PyGILState_STATE will be. */
|
||||||
|
|
|
@ -70,9 +70,14 @@ static const char *gdbpy_should_print_stack = python_excp_message;
|
||||||
#include "gdbthread.h"
|
#include "gdbthread.h"
|
||||||
#include "observer.h"
|
#include "observer.h"
|
||||||
#include "interps.h"
|
#include "interps.h"
|
||||||
|
#include "event-top.h"
|
||||||
|
|
||||||
static PyMethodDef GdbMethods[];
|
static PyMethodDef GdbMethods[];
|
||||||
|
|
||||||
|
#ifdef IS_PY3K
|
||||||
|
static struct PyModuleDef GdbModuleDef;
|
||||||
|
#endif
|
||||||
|
|
||||||
PyObject *gdb_module;
|
PyObject *gdb_module;
|
||||||
PyObject *gdb_python_module;
|
PyObject *gdb_python_module;
|
||||||
|
|
||||||
|
@ -198,8 +203,10 @@ eval_python_command (const char *command)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
Py_DECREF (v);
|
Py_DECREF (v);
|
||||||
|
#ifndef IS_PY3K
|
||||||
if (Py_FlushLine ())
|
if (Py_FlushLine ())
|
||||||
PyErr_Clear ();
|
PyErr_Clear ();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1431,6 +1438,13 @@ _initialize_python (void)
|
||||||
{
|
{
|
||||||
char *cmd_name;
|
char *cmd_name;
|
||||||
struct cmd_list_element *cmd;
|
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,
|
add_com ("python-interactive", class_obscure,
|
||||||
python_interactive_command,
|
python_interactive_command,
|
||||||
|
@ -1510,14 +1524,50 @@ message == an error message without a stack will be printed."),
|
||||||
/foo/bin/python
|
/foo/bin/python
|
||||||
/foo/lib/pythonX.Y/...
|
/foo/lib/pythonX.Y/...
|
||||||
This must be done before calling Py_Initialize. */
|
This must be done before calling Py_Initialize. */
|
||||||
Py_SetProgramName (concat (ldirname (python_libdir), SLASH_STRING, "bin",
|
progname = concat (ldirname (python_libdir), SLASH_STRING, "bin",
|
||||||
SLASH_STRING, "python", NULL));
|
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
|
#endif
|
||||||
|
|
||||||
Py_Initialize ();
|
Py_Initialize ();
|
||||||
PyEval_InitThreads ();
|
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);
|
gdb_module = Py_InitModule ("_gdb", GdbMethods);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The casts to (char*) are for python 2.4. */
|
/* The casts to (char*) are for python 2.4. */
|
||||||
PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
|
PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version);
|
||||||
|
@ -1612,7 +1662,17 @@ finish_python_initialization (void)
|
||||||
|
|
||||||
sys_path = PySys_GetObject ("path");
|
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;
|
PyObject *pythondir;
|
||||||
int err;
|
int err;
|
||||||
|
@ -1628,7 +1688,7 @@ finish_python_initialization (void)
|
||||||
Py_DECREF (pythondir);
|
Py_DECREF (pythondir);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
PySys_SetPath (gdb_pythondir);
|
goto fail;
|
||||||
|
|
||||||
/* Import the gdb module to finish the initialization, and
|
/* Import the gdb module to finish the initialization, and
|
||||||
add it to __main__ for convenience. */
|
add it to __main__ for convenience. */
|
||||||
|
@ -1768,4 +1828,18 @@ Return a tuple containing all inferiors." },
|
||||||
{NULL, NULL, 0, NULL}
|
{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 */
|
#endif /* HAVE_PYTHON */
|
||||||
|
|
10
gdb/varobj.c
10
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_print. Otherwise just return the extracted
|
||||||
string as a value. */
|
string as a value. */
|
||||||
|
|
||||||
PyObject *py_str
|
char *s = python_string_to_target_string (output);
|
||||||
= python_string_to_target_python_string (output);
|
|
||||||
|
|
||||||
if (py_str)
|
if (s)
|
||||||
{
|
{
|
||||||
char *s = PyString_AsString (py_str);
|
|
||||||
char *hint;
|
char *hint;
|
||||||
|
|
||||||
hint = gdbpy_get_display_hint (value_formatter);
|
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);
|
xfree (hint);
|
||||||
}
|
}
|
||||||
|
|
||||||
len = PyString_Size (py_str);
|
len = strlen (s);
|
||||||
thevalue = xmemdup (s, len + 1, len + 1);
|
thevalue = xmemdup (s, len + 1, len + 1);
|
||||||
type = builtin_type (gdbarch)->builtin_char;
|
type = builtin_type (gdbarch)->builtin_char;
|
||||||
Py_DECREF (py_str);
|
xfree (s);
|
||||||
|
|
||||||
if (!string_print)
|
if (!string_print)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue