From 7ea63e2985e8d8a1791e7e0687d3cd93851734f2 Mon Sep 17 00:00:00 2001 From: Mark Florisson Date: Thu, 18 Nov 2010 20:54:28 +0100 Subject: [PATCH] Attempt to merge back Cython locals -- failed! gdb.Value is too broken --- Cython/Debugger/libcython.py | 39 +++++++++++++++++++++++++++++++++++- Cython/Debugger/libpython.py | 2 +- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Cython/Debugger/libcython.py b/Cython/Debugger/libcython.py index 32f26b76..fe5f463a 100644 --- a/Cython/Debugger/libcython.py +++ b/Cython/Debugger/libcython.py @@ -1080,7 +1080,8 @@ class CyLocals(CythonCommand): def _print_if_initialized(self, cyvar, max_name_length, prefix=''): if self.is_initialized(self.get_cython_function(), cyvar.name): value = gdb.parse_and_eval(cyvar.cname) - self.print_gdb_value(cyvar.name, value, max_name_length, prefix) + if not value.is_optimized_out: + self.print_gdb_value(cyvar.name, value, max_name_length, prefix) @dispatch_on_frame(c_command='info locals', python_command='py-locals') def invoke(self, args, from_tty): @@ -1191,11 +1192,47 @@ class CyExec(CythonCommand, libpython.PyExec): '(PyObject *) PyModule_GetDict(__pyx_m)') local_dict = gdb.parse_and_eval('(PyObject *) PyDict_New()') + cython_function = self.get_cython_function() + try: self._fill_locals_dict(executor, libpython.pointervalue(local_dict)) executor.evalcode(expr, input_type, global_dict, local_dict) finally: + + # try: + # tp, val, tb = sys.exc_info() + # sys.exc_clear() + # + # try: + # long(gdb.parse_and_eval("(void *) 0")) == 0 + # except RuntimeError: + # # At this point gdb is broken, just exit this shite, it + # # ain't getting better. + # +# # /home/mark/source/code/cython/Cython/Debugger/libcython.py:1206: +# # RuntimeWarning: tp_compare didn't return -1 or -2 for exception +# # long(gdb.parse_and_eval("(void *) 0")) == 0 +# # Traceback (most recent call last): +# # File "/home/mark/source/code/cython/Cython/Debugger/libcython.py", line 1206, +# # in invoke +# # long(gdb.parse_and_eval("(void *) 0")) == 0 +# # RuntimeError: Cannot convert value to int. +# # Error occurred in Python command: Cannot convert value to int. + # if sys.exc_info()[0] is None and val is not None: + # raise val, tb + # + # for name, value in libpython.PyDictObjectPtr(local_dict).iteritems(): + # name = name.proxyval(set()) + # cyvar = cython_function.locals.get(name) + # if cyvar is not None and cyvar.type == PythonObject: + # gdb.parse_and_eval('set %s = (PyObject *) %d' % (cyvar.cname, + # pointervalue(value._gdbval))) + # finally: executor.decref(libpython.pointervalue(local_dict)) + + # if sys.exc_info()[0] is None and val is not None: + # raise val, tb + # Functions diff --git a/Cython/Debugger/libpython.py b/Cython/Debugger/libpython.py index 64f2eb2f..3c7c76ca 100644 --- a/Cython/Debugger/libpython.py +++ b/Cython/Debugger/libpython.py @@ -636,7 +636,7 @@ class PyDictObjectPtr(PyObjectPtr): if not pyop_value.is_null(): pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key']) yield (pyop_key, pyop_value) - + def proxyval(self, visited): # Guard against infinite loops: if self.as_address() in visited: -- 2.26.2