public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-python-backtrace: Fix some reference counting bugs. Remove FrameIterator and frame.locals, frame.args test (not longer provided in gdb.Frame)
@ 2012-07-25 14:09 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-07-25 14:09 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-python-backtrace has been updated
via 69d61b34b067f3be63fe01f99c6904d1b2e38200 (commit)
from ba8c5e70fec3ee279735a4552039d044b36e000e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 69d61b34b067f3be63fe01f99c6904d1b2e38200
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Wed Jul 25 15:08:27 2012 +0100
Fix some reference counting bugs. Remove FrameIterator and
frame.locals, frame.args test (not longer provided in gdb.Frame)
-----------------------------------------------------------------------
Summary of changes:
gdb/python/py-framefilter.c | 90 +++++++++++++++++---------------
gdb/testsuite/gdb.python/py-frame.exp | 66 +-----------------------
2 files changed, 50 insertions(+), 106 deletions(-)
First 500 lines of diff:
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index f6143bf..7dd7aaa 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -41,6 +41,7 @@ extract_sym_and_value (PyObject *obj, char **name,
if (PyObject_HasAttrString (obj, "symbol"))
{
PyObject *result = PyObject_CallMethod (obj, "symbol", NULL);
+
if (! result)
return 0;
@@ -51,8 +52,8 @@ extract_sym_and_value (PyObject *obj, char **name,
*name = python_string_to_host_string (result);
Py_DECREF (result);
- if (! name)
- return 0;
+ if (! *name)
+ return 0;
*language = current_language;
}
else
@@ -146,6 +147,7 @@ py_print_locals (PyObject *filter,
if (! iterator)
goto locals_error;
+ make_cleanup_py_decref (iterator);
while ((item = PyIter_Next (iterator)))
{
const struct language_defn *language;
@@ -157,17 +159,14 @@ py_print_locals (PyObject *filter,
if (! item)
goto locals_error;
-
value_success = extract_sym_and_value (item, &sym_name,
&val,
&language);
Py_DECREF (item);
+ item = NULL;
if (! value_success)
- {
- Py_DECREF (iterator);
- goto locals_error;
- }
+ goto locals_error;
fprintf_filtered (gdb_stdout, "%s%s = ",
n_spaces (2 * indent),
@@ -186,12 +185,14 @@ py_print_locals (PyObject *filter,
{
PyErr_SetString (PyExc_RuntimeError,
except.message);
- Py_DECREF (iterator);
goto locals_error;
}
fprintf_filtered (gdb_stdout, "\n");
gdb_flush (gdb_stdout);
}
+
+ if (! item && PyErr_Occurred())
+ goto locals_error;
}
}
}
@@ -215,7 +216,6 @@ py_print_args (PyObject *filter,
{
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
PyObject *result = NULL;
- struct ui_file *stb;
/* Frame arguments. */
annotate_frame_args ();
@@ -231,8 +231,6 @@ py_print_args (PyObject *filter,
if (result)
{
make_cleanup_py_decref (result);
- stb = mem_fileopen ();
- make_cleanup_ui_file_delete (stb);
if (result != Py_None)
{
@@ -248,9 +246,12 @@ py_print_args (PyObject *filter,
PyObject *iterator = PyObject_GetIter (result);
PyObject *item;
int first = 0;
+
if (! iterator)
goto args_error;
+ make_cleanup_py_decref (iterator);
+
item = PyIter_Next (iterator);
if (! item && PyErr_Occurred ())
goto args_error;
@@ -262,18 +263,17 @@ py_print_args (PyObject *filter,
struct value *val;
int value_success = 0;
volatile struct gdb_exception except;
+ struct ui_file *stb;
value_success = extract_sym_and_value (item,
&sym_name,
&val,
&language);
Py_DECREF (item);
+ item = NULL;
if (! value_success)
- {
- Py_DECREF (iterator);
- goto args_error;
- }
+ goto args_error;
annotate_arg_begin ();
ui_out_field_string (out, "name", sym_name);
@@ -284,6 +284,9 @@ py_print_args (PyObject *filter,
/* True in "summary" mode, false otherwise. */
opts.summary = !strcmp (print_args_type, "scalars");
+ stb = mem_fileopen ();
+ make_cleanup_ui_file_delete (stb);
+
TRY_CATCH (except, RETURN_MASK_ALL)
{
common_val_print (val, stb, 2, &opts, language);
@@ -292,7 +295,6 @@ py_print_args (PyObject *filter,
{
PyErr_SetString (PyExc_RuntimeError,
except.message);
- Py_DECREF (iterator);
goto args_error;
}
@@ -306,10 +308,7 @@ py_print_args (PyObject *filter,
ui_out_text (out, ", ");
else
if (PyErr_Occurred ())
- {
- Py_DECREF (iterator);
- goto args_error;
- }
+ goto args_error;
annotate_arg_end ();
}
@@ -407,8 +406,8 @@ py_print_frame (PyObject *filter,
{
if (paddr != Py_None)
{
- has_addr = 1;
address = PyLong_AsLong (paddr);
+ has_addr = 1;
}
Py_DECREF (paddr);
}
@@ -447,9 +446,9 @@ py_print_frame (PyObject *filter,
}
}
- /* Print address to the address field. If no is provided address,
- printing nothing. */
- if (opts.addressprint && has_addr)
+ /* Print address to the address field. If an address is not provided,
+ print nothing. */
+ if (opts.addressprint && has_addr)
{
annotate_frame_address ();
ui_out_field_core_addr (out, "addr", gdbarch, address);
@@ -548,12 +547,11 @@ py_print_frame (PyObject *filter,
goto error;
}
- /* For MI we need to deal with the children population of elided
- frames, so if MI output detected do not send newline. */
+ /* For MI we need to deal with the "children" list population of
+ elided frames, so if MI output detected do not send newline. */
if (! ui_out_is_mi_like_p (out))
{
- if (has_addr)
- annotate_frame_end ();
+ annotate_frame_end ();
ui_out_text (out, "\n");
}
@@ -586,6 +584,8 @@ py_print_frame (PyObject *filter,
PyObject *item;
struct cleanup *cleanup_stack;
+ Py_DECREF (result);
+
if (iterator == NULL)
goto error;
@@ -607,16 +607,28 @@ py_print_frame (PyObject *filter,
opts, indent, levels_printed);
if (success == 0 && PyErr_Occurred ())
{
+ Py_DECREF (iterator);
+ Py_DECREF (item);
do_cleanups (cleanup_stack);
goto error;
}
+
+ Py_DECREF (item);
}
+ Py_DECREF (iterator);
do_cleanups (cleanup_stack);
}
}
}
+ /* In MI now we can signal the end. */
+ if (ui_out_is_mi_like_p (out))
+ {
+ annotate_frame_end ();
+ ui_out_text (out, "\n");
+ }
+
return PY_BT_COMPLETED;
error:
@@ -666,16 +678,14 @@ apply_frame_filter (struct frame_info *frame, int print_level,
if (!iterable)
goto done;
+ make_cleanup_py_decref (iterable);
if (iterable == Py_None)
{
- Py_DECREF (iterable);
- return 2;
+ do_cleanups (cleanups);
+ return PY_BT_NO_FILTERS;
}
-
get_user_print_options (&opts);
- make_cleanup_py_decref (iterable);
-
/* Is it an iterator */
if PyIter_Check (iterable)
{
@@ -683,9 +693,10 @@ apply_frame_filter (struct frame_info *frame, int print_level,
PyObject *item;
htab_t levels_printed;
- if (iterator == NULL)
+ if (! iterator)
goto done;
+ make_cleanup_py_decref (iterator);
levels_printed = htab_create (20,
hash_printed_frame_entry,
eq_printed_frame_entry,
@@ -698,17 +709,12 @@ apply_frame_filter (struct frame_info *frame, int print_level,
print_locals, out, opts, 0,
levels_printed);
if (success == PY_BT_ERROR && PyErr_Occurred ())
- {
- gdbpy_print_stack ();
- /* FIXME: Should we try to continue to print other
- frames when we encounter an error? */
- break;
- }
+ gdbpy_print_stack ();
+
Py_DECREF (item);
}
htab_delete (levels_printed);
- Py_DECREF (iterator);
}
else
{
@@ -731,7 +737,7 @@ apply_frame_filter (struct frame_info *frame, int print_level,
struct ui_out *out, int print_frame,
int print_locals)
{
- return 2;
+ return 2; /* PY_BT_NO_FILTERS */
}
#endif /* HAVE_PYTHON */
diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py-frame.exp
index 20761e9..83ff8fe 100644
--- a/gdb/testsuite/gdb.python/py-frame.exp
+++ b/gdb/testsuite/gdb.python/py-frame.exp
@@ -18,8 +18,8 @@
load_lib gdb-python.exp
-standard_testfile
-
+set testfile "py-frame"
+set srcfile ${testfile}.c
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
return -1
}
@@ -58,29 +58,6 @@ gdb_py_test_silent_cmd "python sb = sb.superblock" "get superblock" 0
gdb_test "python print bf1.read_var(\"i\", sb)" "99" "test i = 99"
gdb_test "python print bf1.read_var(\"i\", sb).type" "int" "test int i"
-# Test frame.locals and frame.arg
-gdb_py_test_multiple "simple frame print" \
- "python" "" \
- "def print_var (iterator, frame):" "" \
- " for i in iterator:" "" \
- " print str(i),\"=\", frame.read_var (i)" "" \
- "end" ""
-gdb_py_test_silent_cmd "python fframe = gdb.selected_frame ()" "get frame" 0
-gdb_py_test_silent_cmd "python flocals = fframe.locals()" "get locals" 0
-gdb_test "python print_var(flocals,fframe)" \
- "i =.*\"stuff\".*f =.*\"foo\".*b =.*\"bar\".*i = 1.1.*f = 2.2.*i = 99.*" \
- "test locals output"
-gdb_py_test_silent_cmd "python fargs = fframe.arguments()" "get arguments" 0
-gdb_test "python print fargs" "None" "Test arguments, with no arguments"
-gdb_test "up" ".*" ""
-gdb_py_test_silent_cmd "python fframe = gdb.selected_frame ()" "get frame" 0
-gdb_py_test_silent_cmd "python flocals = fframe.locals()" "get locals" 0
-gdb_test "python print flocals" "None" "Test locals(), with mo locals"
-gdb_py_test_silent_cmd "python fargs = fframe.arguments()" "get arguments" 0
-gdb_test "python print_var(fargs,fframe)" \
- "argc = .*argv = .*" \
- "test arguments() output"
-
gdb_breakpoint "f2"
gdb_continue_to_breakpoint "breakpoint at f2"
gdb_py_test_silent_cmd "python bframe = gdb.selected_frame()" \
@@ -113,42 +90,3 @@ gdb_test "python print 'result =', f0.read_var ('variable_which_surely_doesnt_ex
gdb_test "python print 'result =', f0.read_var ('a')" " = 1" "test Frame.read_var - success"
gdb_test "python print 'result =', gdb.selected_frame () == f1" " = True" "test gdb.selected_frame"
-
-# Test FrameIterator. This tests both the inbuilt iterator, and the
-# seperate class.
-gdb_breakpoint "f3"
-gdb_continue_to_breakpoint "breakpoint at f3"
-gdb_py_test_silent_cmd "python it = gdb.FrameIterator (gdb.newest_frame())" \
- "get iterator from newest frame" 0
-gdb_py_test_multiple "simple frame print" \
- "python" "" \
- "def print_function (iterator):" "" \
- " for i in iterator:" "" \
- " print str(i.function())" "" \
- "end" ""
-gdb_test "python print_function(it)" \
- "f3.*f2.*f1.*main.*" "test vanilla frame iterator"
-gdb_test "python print_function(gdb.newest_frame())" \
- "f3.*f2.*f1.*main.*" "test vanilla inbuilt frame iterator"
-gdb_test "select 3" ".*" ""
-gdb_py_test_silent_cmd "python it = gdb.FrameIterator (gdb.selected_frame(), reverse=True)" \
- "get iterator from selected frame" 0
-gdb_test "python print_function(it)" \
- "main.*f1.*f2.*f3.*" "test reverse traversal vanilla frame iterator"
-gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.newest_frame(), regex=\"f\[0-9\]\")" \
- "get iterator from newest frame" 0
-gdb_test "python print_function(it)" \
- "f3.*f2.*f1.*" "test traversal with a regex filtered iterator"
-gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.selected_frame(), regex=\"f\[0-9\]\", reverse=True)" \
- "get iterator from newest frame" 0
-gdb_test "python print_function(it)" \
- "f1.*f2.*f3.*" "test reverse traversal with a regex filtered iterator"
-gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.selected_frame(), regex=\"nothing\")" \
- "get iterator from newest frame" 0
-gdb_test "python print_function(it)" \
- "" "test regex iterator that returns nothing"
-gdb_test "python ite = gdb.FrameIterator(gdb.selected_frame(), regex=\"\[\")" \
- "Traceback.*Invalid regex.*Invalid regular expression.*" "test invalid regex"
-gdb_test "python print ite" \
- ".*NameError.*name.*ite.*is not defined.*" \
- "test invalid iterator did not return an iterator"
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-07-25 14:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-25 14:09 [SCM] archer-pmuldoon-python-backtrace: Fix some reference counting bugs. Remove FrameIterator and frame.locals, frame.args test (not longer provided in gdb.Frame) pmuldoon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).