Skip to content

Commit

Permalink
[mypyc] Fix gen_is_coroutine on Python 3.12
Browse files Browse the repository at this point in the history
We've copied some code CPython, which was changed in 3.12.
  • Loading branch information
JukkaL committed Jun 19, 2023
1 parent 719e7e7 commit 059f3a0
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions mypyc/lib-rt/pythonsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
#include <assert.h>
#include "mypyc_util.h"

#if CPY_3_12_FEATURES
#include "internal/pycore_frame.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -389,6 +393,31 @@ _CPyObject_HasAttrId(PyObject *v, _Py_Identifier *name) {
_PyObject_CallMethodIdObjArgs((self), (name), (arg), NULL)
#endif

#if CPY_3_12_FEATURES

// These are copied from genobject.c in Python 3.12

/* Returns a borrowed reference */
static inline PyCodeObject *
_PyGen_GetCode(PyGenObject *gen) {
_PyInterpreterFrame *frame = (_PyInterpreterFrame *)(gen->gi_iframe);
return frame->f_code;
}

static int
gen_is_coroutine(PyObject *o)
{
if (PyGen_CheckExact(o)) {
PyCodeObject *code = _PyGen_GetCode((PyGenObject*)o);
if (code->co_flags & CO_ITERABLE_COROUTINE) {
return 1;
}
}
return 0;
}

#else

// Copied from genobject.c in Python 3.10
static int
gen_is_coroutine(PyObject *o)
Expand All @@ -402,6 +431,8 @@ gen_is_coroutine(PyObject *o)
return 0;
}

#endif

/*
* This helper function returns an awaitable for `o`:
* - `o` if `o` is a coroutine-object;
Expand Down

0 comments on commit 059f3a0

Please sign in to comment.