From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFC] Python's gdb.FRAME_UNWIND_NULL_ID is no longer used. What to do with it?
Date: Thu, 12 Dec 2013 17:25:00 -0000 [thread overview]
Message-ID: <52A9F173.2010304@redhat.com> (raw)
In-Reply-To: <871u1vw7wt.fsf@fleche.redhat.com>
On 12/02/2013 04:10 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
>
> Pedro> I'd assume scripts just check the result of Frame.unwind_stop_reason,
> Pedro> and compare it to gdb.FRAME_UNWIND_NO_REASON. That at most, they'll
> Pedro> pass the result of Frame.unwind_stop_reason to
> Pedro> gdb.frame_stop_reason_string. I'd prefer to just get rid of it, but
> Pedro> it may be best to keep this around for compatibility, in case a script
> Pedro> does refer to gdb.FRAME_UNWIND_NULL_ID directly.
>
> Pedro> In general, what's the policy for exposed constants like this in
> Pedro> Python?
>
> My view is that we should provide compatibility with what we document.
>
> That is, if it is in the docs, we should not remove it.
>
> However, there is still some leeway for change.
> E.g., in this case, we don't document the value or type of the constant.
> This is intentional as it gives us some freedom to change the details --
> we don't generally want Python API promises to leak through to the C
> code.
>
> Pedro> +/* This is no longer used anywhere, but it's kept because it's exposed
> Pedro> + to Python. This is how GDB used to indicate end of stack. We've
> Pedro> + now migrated to a model where frames always have a valid ID. */
> Pedro> SET (UNWIND_NULL_ID, "unwinder did not report frame ID")
>
> For example you could remove this, and arrange to keep the Python
> constant around with some suitably chosen value. I think it just has to
> be something that will never compare equal to any of the other
> constants, so just None would work.
I tried that, and then I remembered to try frame_stop_reason_string
on it:
(top-gdb) python print gdb.FRAME_UNWIND_NULL_ID
None
(top-gdb) python print gdb.FRAME_UNWIND_OUTERMOST
1
(top-gdb) python print gdb.frame_stop_reason_string(gdb.FRAME_UNWIND_OUTERMOST)
outermost
(top-gdb) python print gdb.frame_stop_reason_string(gdb.FRAME_UNWIND_NULL_ID)
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: an integer is required
Error while executing Python code.
GDB itself won't ever generate FRAME_UNWIND_NULL_ID. Do think
that's a problem? I guess we could set it to UNWIND_LAST+1
instead, and make gdbpy_frame_stop_reason_string handle it,
but at that point, I get to consider just leaving things
alone...
Hmm, or perhaps, we could implement this another way. Leave
UNWIND_NULL_ID in unwind_stop_reasons.def, but define it
with a DEPRECATED_SET macro instead. I guess that might
actually be better considering multiple extension languages
going forward, as then we have a single place to do this,
instead of having to repeat the "create deprecated constant"
exercise for all extension languages whenever something like
this happens.
--------------------
gdb.FRAME_UNWIND_NULL_ID is documented, so we need to keep it around.
However, we can just set it to None.
2013-12-12 Pedro Alves <palves@redhat.com>
Tom Tromey <tromey@redhat.com>
* python/py-frame.c (gdbpy_initialize_frames): Add
gdb.FRAME_UNWIND_NULL_ID as a deprecated constant.
* python/py-utils.c (gdb_pymodule_add_deprecated_constant): New
function.
* python/python-internal.h (gdb_pymodule_add_deprecated_constant):
Declare.
* unwind_stop_reasons.def (UNWIND_NULL_ID): Delete.
---
gdb/python/py-frame.c | 6 ++++++
gdb/python/py-utils.c | 8 ++++++++
gdb/python/python-internal.h | 14 ++++++++++++++
gdb/unwind_stop_reasons.def | 5 -----
4 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 0f189f0..325b81b 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -649,6 +649,12 @@ gdbpy_initialize_frames (void)
#include "unwind_stop_reasons.def"
#undef SET
+ /* GDB core doesn't use this anymore, but since it was exposed to
+ Python before and documented, we can't remove it. */
+ if (gdb_pymodule_add_deprecated_constant (gdb_module,
+ "FRAME_UNWIND_NULL_ID") < 0)
+ return -1;
+
return gdb_pymodule_addobject (gdb_module, "Frame",
(PyObject *) &frame_object_type);
}
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
index 4dcd168..32340bf 100644
--- a/gdb/python/py-utils.c
+++ b/gdb/python/py-utils.c
@@ -442,3 +442,11 @@ gdb_pymodule_addobject (PyObject *module, const char *name, PyObject *object)
Py_DECREF (object);
return result;
}
+
+/* See python-internal.h. */
+
+int
+gdb_pymodule_add_deprecated_constant (PyObject *module, const char *name)
+{
+ return gdb_pymodule_addobject (gdb_module, name, Py_None);
+}
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 125670e..2fb0c8d 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -494,4 +494,18 @@ int gdb_pymodule_addobject (PyObject *module, const char *name,
PyObject *object)
CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
+/* Adds a deprecated constant to MODULE as NAME. Return -1 on error,
+ 0 on success. The constant is set to None.
+
+ Rationale: We don't generally want Python API promises to leak
+ through to GDB's core C code. We intentionaly usually don't
+ document the value or type of Python constants, as it gives us some
+ freedom to change the details. When a core constant that was
+ exposed to Python is removed from the core, we arrange to keep the
+ Python constant around with a value that never compares equal to
+ any of the non-deprecated constants. */
+int gdb_pymodule_add_deprecated_constant (PyObject *module,
+ const char *name)
+ CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
+
#endif /* GDB_PYTHON_INTERNAL_H */
diff --git a/gdb/unwind_stop_reasons.def b/gdb/unwind_stop_reasons.def
index 2c3d341..da67f21 100644
--- a/gdb/unwind_stop_reasons.def
+++ b/gdb/unwind_stop_reasons.def
@@ -31,11 +31,6 @@
or we didn't fail. */
SET (UNWIND_NO_REASON, "no reason")
-/* This is no longer used anywhere, but it's kept because it's exposed
- to Python. This is how GDB used to indicate end of stack. We've
- now migrated to a model where frames always have a valid ID. */
-SET (UNWIND_NULL_ID, "unwinder did not report frame ID")
-
/* This frame is the outermost. */
SET (UNWIND_OUTERMOST, "outermost")
--
1.7.11.7
next prev parent reply other threads:[~2013-12-12 17:25 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-28 20:13 Pedro Alves
2013-11-28 21:16 ` Eli Zaretskii
2013-11-28 23:01 ` Phil Muldoon
2013-11-29 17:22 ` Pedro Alves
2013-12-02 16:10 ` Tom Tromey
2013-12-12 17:25 ` Pedro Alves [this message]
2013-12-12 17:37 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52A9F173.2010304@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox