]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-124872: Change PyContext_WatchCallback to take PyObject (#124737)
authorRichard Hansen <rhansen@rhansen.org>
Sat, 12 Oct 2024 20:57:27 +0000 (16:57 -0400)
committerGitHub <noreply@github.com>
Sat, 12 Oct 2024 20:57:27 +0000 (13:57 -0700)
The PyContext struct is not intended to be public, and users of the
API don't need anything more specific than PyObject.  Also see
gh-78943.

Doc/c-api/contextvars.rst
Include/cpython/context.h
Modules/_testcapi/watchers.c
Python/context.c

index 59e74ba1ac70226f966256241235f1d74954b119..8eba54a80dc80d47614a9bfa65430963374b3e90 100644 (file)
@@ -136,7 +136,7 @@ Context object management functions:
 
    .. versionadded:: 3.14
 
-.. c:type:: int (*PyContext_WatchCallback)(PyContextEvent event, PyContext* ctx)
+.. c:type:: int (*PyContext_WatchCallback)(PyContextEvent event, PyObject *obj)
 
    Context object watcher callback function.  The object passed to the callback
    is event-specific; see :c:type:`PyContextEvent` for details.
index d722b4d93134f70e76087dbfad41ec1f5c6c908e..3c9be7873b939900119d1be5310fd9c64456f4d6 100644 (file)
@@ -52,7 +52,7 @@ typedef enum {
  * if the callback returns with an exception set, it must return -1. Otherwise
  * it should return 0
  */
-typedef int (*PyContext_WatchCallback)(PyContextEvent, PyContext *);
+typedef int (*PyContext_WatchCallback)(PyContextEvent, PyObject *);
 
 /*
  * Register a per-interpreter callback that will be invoked for context object
index 689863d098ad8a5ea5cd6f003eae108445120d87..b4233d07134aea846b8878787c0c80d2cbddba73 100644 (file)
@@ -630,7 +630,7 @@ static int num_context_object_enter_events[NUM_CONTEXT_WATCHERS] = {0, 0};
 static int num_context_object_exit_events[NUM_CONTEXT_WATCHERS] = {0, 0};
 
 static int
-handle_context_watcher_event(int which_watcher, PyContextEvent event, PyContext *ctx) {
+handle_context_watcher_event(int which_watcher, PyContextEvent event, PyObject *ctx) {
     if (event == Py_CONTEXT_EVENT_ENTER) {
         num_context_object_enter_events[which_watcher]++;
     }
@@ -644,22 +644,22 @@ handle_context_watcher_event(int which_watcher, PyContextEvent event, PyContext
 }
 
 static int
-first_context_watcher_callback(PyContextEvent event, PyContext *ctx) {
+first_context_watcher_callback(PyContextEvent event, PyObject *ctx) {
     return handle_context_watcher_event(0, event, ctx);
 }
 
 static int
-second_context_watcher_callback(PyContextEvent event, PyContext *ctx) {
+second_context_watcher_callback(PyContextEvent event, PyObject *ctx) {
     return handle_context_watcher_event(1, event, ctx);
 }
 
 static int
-noop_context_event_handler(PyContextEvent event, PyContext *ctx) {
+noop_context_event_handler(PyContextEvent event, PyObject *ctx) {
     return 0;
 }
 
 static int
-error_context_event_handler(PyContextEvent event, PyContext *ctx) {
+error_context_event_handler(PyContextEvent event, PyObject *ctx) {
     PyErr_SetString(PyExc_RuntimeError, "boom!");
     return -1;
 }
index 9b742136b0726d87c562cd1ebe4188c7c2159ae7..8bc487a33c890bfd305635e86c36148d736d3399 100644 (file)
@@ -113,7 +113,7 @@ context_event_name(PyContextEvent event) {
 }
 
 static void
-notify_context_watchers(PyThreadState *ts, PyContextEvent event, PyContext *ctx)
+notify_context_watchers(PyThreadState *ts, PyContextEvent event, PyObject *ctx)
 {
     assert(Py_REFCNT(ctx) > 0);
     PyInterpreterState *interp = ts->interp;
@@ -193,7 +193,7 @@ _PyContext_Enter(PyThreadState *ts, PyObject *octx)
     ts->context = Py_NewRef(ctx);
     ts->context_ver++;
 
-    notify_context_watchers(ts, Py_CONTEXT_EVENT_ENTER, ctx);
+    notify_context_watchers(ts, Py_CONTEXT_EVENT_ENTER, octx);
     return 0;
 }
 
@@ -227,7 +227,7 @@ _PyContext_Exit(PyThreadState *ts, PyObject *octx)
         return -1;
     }
 
-    notify_context_watchers(ts, Py_CONTEXT_EVENT_EXIT, ctx);
+    notify_context_watchers(ts, Py_CONTEXT_EVENT_EXIT, octx);
     Py_SETREF(ts->context, (PyObject *)ctx->ctx_prev);
     ts->context_ver++;