17db96d56Sopenharmony_ci
27db96d56Sopenharmony_ci/* Testing module for multi-phase initialization of extension modules (PEP 489)
37db96d56Sopenharmony_ci */
47db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE_BUILTIN
57db96d56Sopenharmony_ci#  define Py_BUILD_CORE_MODULE 1
67db96d56Sopenharmony_ci#endif
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci#include "Python.h"
97db96d56Sopenharmony_ci#include "pycore_namespace.h"     // _PyNamespace_New()
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci/* State for testing module state access from methods */
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_citypedef struct {
147db96d56Sopenharmony_ci    int counter;
157db96d56Sopenharmony_ci} meth_state;
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci/*[clinic input]
187db96d56Sopenharmony_cimodule _testmultiphase
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciclass _testmultiphase.StateAccessType "StateAccessTypeObject *" "!StateAccessType"
217db96d56Sopenharmony_ci[clinic start generated code]*/
227db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bab9f2fe3bd312ff]*/
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci/* Example objects */
257db96d56Sopenharmony_citypedef struct {
267db96d56Sopenharmony_ci    PyObject_HEAD
277db96d56Sopenharmony_ci    PyObject            *x_attr;        /* Attributes dictionary */
287db96d56Sopenharmony_ci} ExampleObject;
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_citypedef struct {
317db96d56Sopenharmony_ci    PyObject *integer;
327db96d56Sopenharmony_ci} testmultiphase_state;
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_citypedef struct {
357db96d56Sopenharmony_ci    PyObject_HEAD
367db96d56Sopenharmony_ci} StateAccessTypeObject;
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci/* Example methods */
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_cistatic int
417db96d56Sopenharmony_ciExample_traverse(ExampleObject *self, visitproc visit, void *arg)
427db96d56Sopenharmony_ci{
437db96d56Sopenharmony_ci    Py_VISIT(self->x_attr);
447db96d56Sopenharmony_ci    return 0;
457db96d56Sopenharmony_ci}
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_cistatic void
487db96d56Sopenharmony_ciExample_finalize(ExampleObject *self)
497db96d56Sopenharmony_ci{
507db96d56Sopenharmony_ci    Py_CLEAR(self->x_attr);
517db96d56Sopenharmony_ci}
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_cistatic PyObject *
547db96d56Sopenharmony_ciExample_demo(ExampleObject *self, PyObject *args)
557db96d56Sopenharmony_ci{
567db96d56Sopenharmony_ci    PyObject *o = NULL;
577db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "|O:demo", &o))
587db96d56Sopenharmony_ci        return NULL;
597db96d56Sopenharmony_ci    if (o != NULL && PyUnicode_Check(o)) {
607db96d56Sopenharmony_ci        Py_INCREF(o);
617db96d56Sopenharmony_ci        return o;
627db96d56Sopenharmony_ci    }
637db96d56Sopenharmony_ci    Py_RETURN_NONE;
647db96d56Sopenharmony_ci}
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci#include "clinic/_testmultiphase.c.h"
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_cistatic PyMethodDef Example_methods[] = {
697db96d56Sopenharmony_ci    {"demo",            (PyCFunction)Example_demo,  METH_VARARGS,
707db96d56Sopenharmony_ci        PyDoc_STR("demo() -> None")},
717db96d56Sopenharmony_ci    {NULL,              NULL}           /* sentinel */
727db96d56Sopenharmony_ci};
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_cistatic PyObject *
757db96d56Sopenharmony_ciExample_getattro(ExampleObject *self, PyObject *name)
767db96d56Sopenharmony_ci{
777db96d56Sopenharmony_ci    if (self->x_attr != NULL) {
787db96d56Sopenharmony_ci        PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
797db96d56Sopenharmony_ci        if (v != NULL) {
807db96d56Sopenharmony_ci            Py_INCREF(v);
817db96d56Sopenharmony_ci            return v;
827db96d56Sopenharmony_ci        }
837db96d56Sopenharmony_ci        else if (PyErr_Occurred()) {
847db96d56Sopenharmony_ci            return NULL;
857db96d56Sopenharmony_ci        }
867db96d56Sopenharmony_ci    }
877db96d56Sopenharmony_ci    return PyObject_GenericGetAttr((PyObject *)self, name);
887db96d56Sopenharmony_ci}
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_cistatic int
917db96d56Sopenharmony_ciExample_setattr(ExampleObject *self, const char *name, PyObject *v)
927db96d56Sopenharmony_ci{
937db96d56Sopenharmony_ci    if (self->x_attr == NULL) {
947db96d56Sopenharmony_ci        self->x_attr = PyDict_New();
957db96d56Sopenharmony_ci        if (self->x_attr == NULL)
967db96d56Sopenharmony_ci            return -1;
977db96d56Sopenharmony_ci    }
987db96d56Sopenharmony_ci    if (v == NULL) {
997db96d56Sopenharmony_ci        int rv = PyDict_DelItemString(self->x_attr, name);
1007db96d56Sopenharmony_ci        if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
1017db96d56Sopenharmony_ci            PyErr_SetString(PyExc_AttributeError,
1027db96d56Sopenharmony_ci                "delete non-existing Example attribute");
1037db96d56Sopenharmony_ci        return rv;
1047db96d56Sopenharmony_ci    }
1057db96d56Sopenharmony_ci    else
1067db96d56Sopenharmony_ci        return PyDict_SetItemString(self->x_attr, name, v);
1077db96d56Sopenharmony_ci}
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_cistatic PyType_Slot Example_Type_slots[] = {
1107db96d56Sopenharmony_ci    {Py_tp_doc, "The Example type"},
1117db96d56Sopenharmony_ci    {Py_tp_finalize, Example_finalize},
1127db96d56Sopenharmony_ci    {Py_tp_traverse, Example_traverse},
1137db96d56Sopenharmony_ci    {Py_tp_getattro, Example_getattro},
1147db96d56Sopenharmony_ci    {Py_tp_setattr, Example_setattr},
1157db96d56Sopenharmony_ci    {Py_tp_methods, Example_methods},
1167db96d56Sopenharmony_ci    {0, 0},
1177db96d56Sopenharmony_ci};
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_cistatic PyType_Spec Example_Type_spec = {
1207db96d56Sopenharmony_ci    "_testimportexec.Example",
1217db96d56Sopenharmony_ci    sizeof(ExampleObject),
1227db96d56Sopenharmony_ci    0,
1237db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
1247db96d56Sopenharmony_ci    Example_Type_slots
1257db96d56Sopenharmony_ci};
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_cistatic PyModuleDef def_meth_state_access;
1297db96d56Sopenharmony_cistatic PyModuleDef def_nonmodule;
1307db96d56Sopenharmony_cistatic PyModuleDef def_nonmodule_with_methods;
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci/*[clinic input]
1337db96d56Sopenharmony_ci_testmultiphase.StateAccessType.get_defining_module
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci    cls: defining_class
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ciReturn the module of the defining class.
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ciAlso tests that result of PyType_GetModuleByDef matches defining_class's
1407db96d56Sopenharmony_cimodule.
1417db96d56Sopenharmony_ci[clinic start generated code]*/
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_cistatic PyObject *
1447db96d56Sopenharmony_ci_testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self,
1457db96d56Sopenharmony_ci                                                         PyTypeObject *cls)
1467db96d56Sopenharmony_ci/*[clinic end generated code: output=ba2a14284a5d0921 input=d2c7245c8a9d06f8]*/
1477db96d56Sopenharmony_ci{
1487db96d56Sopenharmony_ci    PyObject *retval;
1497db96d56Sopenharmony_ci    retval = PyType_GetModule(cls);
1507db96d56Sopenharmony_ci    if (retval == NULL) {
1517db96d56Sopenharmony_ci        return NULL;
1527db96d56Sopenharmony_ci    }
1537db96d56Sopenharmony_ci    assert(PyType_GetModuleByDef(Py_TYPE(self), &def_meth_state_access) == retval);
1547db96d56Sopenharmony_ci    Py_INCREF(retval);
1557db96d56Sopenharmony_ci    return retval;
1567db96d56Sopenharmony_ci}
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci/*[clinic input]
1597db96d56Sopenharmony_ci_testmultiphase.StateAccessType.getmodulebydef_bad_def
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci    cls: defining_class
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ciTest that result of PyType_GetModuleByDef with a bad def is NULL.
1647db96d56Sopenharmony_ci[clinic start generated code]*/
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_cistatic PyObject *
1677db96d56Sopenharmony_ci_testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(StateAccessTypeObject *self,
1687db96d56Sopenharmony_ci                                                            PyTypeObject *cls)
1697db96d56Sopenharmony_ci/*[clinic end generated code: output=64509074dfcdbd31 input=edaff09aa4788204]*/
1707db96d56Sopenharmony_ci{
1717db96d56Sopenharmony_ci    PyType_GetModuleByDef(Py_TYPE(self), &def_nonmodule);  // should raise
1727db96d56Sopenharmony_ci    assert(PyErr_Occurred());
1737db96d56Sopenharmony_ci    return NULL;
1747db96d56Sopenharmony_ci}
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci/*[clinic input]
1777db96d56Sopenharmony_ci_testmultiphase.StateAccessType.increment_count_clinic
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci    cls: defining_class
1807db96d56Sopenharmony_ci    /
1817db96d56Sopenharmony_ci    n: int = 1
1827db96d56Sopenharmony_ci    *
1837db96d56Sopenharmony_ci    twice: bool = False
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ciAdd 'n' from the module-state counter.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ciPass 'twice' to double that amount.
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ciThis tests Argument Clinic support for defining_class.
1907db96d56Sopenharmony_ci[clinic start generated code]*/
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_cistatic PyObject *
1937db96d56Sopenharmony_ci_testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self,
1947db96d56Sopenharmony_ci                                                            PyTypeObject *cls,
1957db96d56Sopenharmony_ci                                                            int n, int twice)
1967db96d56Sopenharmony_ci/*[clinic end generated code: output=3b34f86bc5473204 input=551d482e1fe0b8f5]*/
1977db96d56Sopenharmony_ci{
1987db96d56Sopenharmony_ci    meth_state *m_state = PyType_GetModuleState(cls);
1997db96d56Sopenharmony_ci    if (twice) {
2007db96d56Sopenharmony_ci        n *= 2;
2017db96d56Sopenharmony_ci    }
2027db96d56Sopenharmony_ci    m_state->counter += n;
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    Py_RETURN_NONE;
2057db96d56Sopenharmony_ci}
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ciPyDoc_STRVAR(_StateAccessType_decrement_count__doc__,
2087db96d56Sopenharmony_ci"decrement_count($self, /, n=1, *, twice=None)\n"
2097db96d56Sopenharmony_ci"--\n"
2107db96d56Sopenharmony_ci"\n"
2117db96d56Sopenharmony_ci"Add 'n' from the module-state counter.\n"
2127db96d56Sopenharmony_ci"Pass 'twice' to double that amount.\n"
2137db96d56Sopenharmony_ci"(This is to test both positional and keyword arguments.");
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci// Intentionally does not use Argument Clinic
2167db96d56Sopenharmony_cistatic PyObject *
2177db96d56Sopenharmony_ci_StateAccessType_increment_count_noclinic(StateAccessTypeObject *self,
2187db96d56Sopenharmony_ci                                          PyTypeObject *defining_class,
2197db96d56Sopenharmony_ci                                          PyObject *const *args,
2207db96d56Sopenharmony_ci                                          Py_ssize_t nargs,
2217db96d56Sopenharmony_ci                                          PyObject *kwnames)
2227db96d56Sopenharmony_ci{
2237db96d56Sopenharmony_ci    if (!_PyArg_CheckPositional("StateAccessTypeObject.decrement_count", nargs, 0, 1)) {
2247db96d56Sopenharmony_ci        return NULL;
2257db96d56Sopenharmony_ci    }
2267db96d56Sopenharmony_ci    long n = 1;
2277db96d56Sopenharmony_ci    if (nargs) {
2287db96d56Sopenharmony_ci        n = PyLong_AsLong(args[0]);
2297db96d56Sopenharmony_ci        if (PyErr_Occurred()) {
2307db96d56Sopenharmony_ci            return NULL;
2317db96d56Sopenharmony_ci        }
2327db96d56Sopenharmony_ci    }
2337db96d56Sopenharmony_ci    if (kwnames && PyTuple_Check(kwnames)) {
2347db96d56Sopenharmony_ci        if (PyTuple_GET_SIZE(kwnames) > 1 ||
2357db96d56Sopenharmony_ci            PyUnicode_CompareWithASCIIString(
2367db96d56Sopenharmony_ci                PyTuple_GET_ITEM(kwnames, 0),
2377db96d56Sopenharmony_ci                "twice"
2387db96d56Sopenharmony_ci            )) {
2397db96d56Sopenharmony_ci            PyErr_SetString(
2407db96d56Sopenharmony_ci                PyExc_TypeError,
2417db96d56Sopenharmony_ci                "decrement_count only takes 'twice' keyword argument"
2427db96d56Sopenharmony_ci            );
2437db96d56Sopenharmony_ci            return NULL;
2447db96d56Sopenharmony_ci        }
2457db96d56Sopenharmony_ci        n *= 2;
2467db96d56Sopenharmony_ci    }
2477db96d56Sopenharmony_ci    meth_state *m_state = PyType_GetModuleState(defining_class);
2487db96d56Sopenharmony_ci    m_state->counter += n;
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci    Py_RETURN_NONE;
2517db96d56Sopenharmony_ci}
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci/*[clinic input]
2547db96d56Sopenharmony_ci_testmultiphase.StateAccessType.get_count
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    cls: defining_class
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ciReturn the value of the module-state counter.
2597db96d56Sopenharmony_ci[clinic start generated code]*/
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_cistatic PyObject *
2627db96d56Sopenharmony_ci_testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self,
2637db96d56Sopenharmony_ci                                               PyTypeObject *cls)
2647db96d56Sopenharmony_ci/*[clinic end generated code: output=64600f95b499a319 input=d5d181f12384849f]*/
2657db96d56Sopenharmony_ci{
2667db96d56Sopenharmony_ci    meth_state *m_state = PyType_GetModuleState(cls);
2677db96d56Sopenharmony_ci    return PyLong_FromLong(m_state->counter);
2687db96d56Sopenharmony_ci}
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_cistatic PyMethodDef StateAccessType_methods[] = {
2717db96d56Sopenharmony_ci    _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF
2727db96d56Sopenharmony_ci    _TESTMULTIPHASE_STATEACCESSTYPE_GETMODULEBYDEF_BAD_DEF_METHODDEF
2737db96d56Sopenharmony_ci    _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF
2747db96d56Sopenharmony_ci    _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF
2757db96d56Sopenharmony_ci    {
2767db96d56Sopenharmony_ci        "increment_count_noclinic",
2777db96d56Sopenharmony_ci        _PyCFunction_CAST(_StateAccessType_increment_count_noclinic),
2787db96d56Sopenharmony_ci        METH_METHOD|METH_FASTCALL|METH_KEYWORDS,
2797db96d56Sopenharmony_ci        _StateAccessType_decrement_count__doc__
2807db96d56Sopenharmony_ci    },
2817db96d56Sopenharmony_ci    {NULL,              NULL}           /* sentinel */
2827db96d56Sopenharmony_ci};
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_cistatic PyType_Slot StateAccessType_Type_slots[] = {
2857db96d56Sopenharmony_ci    {Py_tp_doc, "Type for testing per-module state access from methods."},
2867db96d56Sopenharmony_ci    {Py_tp_methods, StateAccessType_methods},
2877db96d56Sopenharmony_ci    {0, NULL}
2887db96d56Sopenharmony_ci};
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_cistatic PyType_Spec StateAccessType_spec = {
2917db96d56Sopenharmony_ci    "_testimportexec.StateAccessType",
2927db96d56Sopenharmony_ci    sizeof(StateAccessTypeObject),
2937db96d56Sopenharmony_ci    0,
2947db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE | Py_TPFLAGS_BASETYPE,
2957db96d56Sopenharmony_ci    StateAccessType_Type_slots
2967db96d56Sopenharmony_ci};
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci/* Function of two integers returning integer */
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ciPyDoc_STRVAR(testexport_foo_doc,
3017db96d56Sopenharmony_ci"foo(i,j)\n\
3027db96d56Sopenharmony_ci\n\
3037db96d56Sopenharmony_ciReturn the sum of i and j.");
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_cistatic PyObject *
3067db96d56Sopenharmony_citestexport_foo(PyObject *self, PyObject *args)
3077db96d56Sopenharmony_ci{
3087db96d56Sopenharmony_ci    long i, j;
3097db96d56Sopenharmony_ci    long res;
3107db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "ll:foo", &i, &j))
3117db96d56Sopenharmony_ci        return NULL;
3127db96d56Sopenharmony_ci    res = i + j;
3137db96d56Sopenharmony_ci    return PyLong_FromLong(res);
3147db96d56Sopenharmony_ci}
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci/* Test that PyState registration fails  */
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ciPyDoc_STRVAR(call_state_registration_func_doc,
3197db96d56Sopenharmony_ci"register_state(0): call PyState_FindModule()\n\
3207db96d56Sopenharmony_ciregister_state(1): call PyState_AddModule()\n\
3217db96d56Sopenharmony_ciregister_state(2): call PyState_RemoveModule()");
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_cistatic PyObject *
3247db96d56Sopenharmony_cicall_state_registration_func(PyObject *mod, PyObject *args)
3257db96d56Sopenharmony_ci{
3267db96d56Sopenharmony_ci    int i, ret;
3277db96d56Sopenharmony_ci    PyModuleDef *def = PyModule_GetDef(mod);
3287db96d56Sopenharmony_ci    if (def == NULL) {
3297db96d56Sopenharmony_ci        return NULL;
3307db96d56Sopenharmony_ci    }
3317db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "i:call_state_registration_func", &i))
3327db96d56Sopenharmony_ci        return NULL;
3337db96d56Sopenharmony_ci    switch (i) {
3347db96d56Sopenharmony_ci        case 0:
3357db96d56Sopenharmony_ci            mod = PyState_FindModule(def);
3367db96d56Sopenharmony_ci            if (mod == NULL) {
3377db96d56Sopenharmony_ci                Py_RETURN_NONE;
3387db96d56Sopenharmony_ci            }
3397db96d56Sopenharmony_ci            return mod;
3407db96d56Sopenharmony_ci        case 1:
3417db96d56Sopenharmony_ci            ret = PyState_AddModule(mod, def);
3427db96d56Sopenharmony_ci            if (ret != 0) {
3437db96d56Sopenharmony_ci                return NULL;
3447db96d56Sopenharmony_ci            }
3457db96d56Sopenharmony_ci            break;
3467db96d56Sopenharmony_ci        case 2:
3477db96d56Sopenharmony_ci            ret = PyState_RemoveModule(def);
3487db96d56Sopenharmony_ci            if (ret != 0) {
3497db96d56Sopenharmony_ci                return NULL;
3507db96d56Sopenharmony_ci            }
3517db96d56Sopenharmony_ci            break;
3527db96d56Sopenharmony_ci    }
3537db96d56Sopenharmony_ci    Py_RETURN_NONE;
3547db96d56Sopenharmony_ci}
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_cistatic PyType_Slot Str_Type_slots[] = {
3587db96d56Sopenharmony_ci    {Py_tp_base, NULL}, /* filled out in module exec function */
3597db96d56Sopenharmony_ci    {0, 0},
3607db96d56Sopenharmony_ci};
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_cistatic PyType_Spec Str_Type_spec = {
3637db96d56Sopenharmony_ci    "_testimportexec.Str",
3647db96d56Sopenharmony_ci    0,
3657db96d56Sopenharmony_ci    0,
3667db96d56Sopenharmony_ci    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
3677db96d56Sopenharmony_ci    Str_Type_slots
3687db96d56Sopenharmony_ci};
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_cistatic PyMethodDef testexport_methods[] = {
3717db96d56Sopenharmony_ci    {"foo",             testexport_foo,         METH_VARARGS,
3727db96d56Sopenharmony_ci        testexport_foo_doc},
3737db96d56Sopenharmony_ci    {"call_state_registration_func",  call_state_registration_func,
3747db96d56Sopenharmony_ci        METH_VARARGS, call_state_registration_func_doc},
3757db96d56Sopenharmony_ci    {NULL,              NULL}           /* sentinel */
3767db96d56Sopenharmony_ci};
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_cistatic int execfunc(PyObject *m)
3797db96d56Sopenharmony_ci{
3807db96d56Sopenharmony_ci    PyObject *temp = NULL;
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci    /* Due to cross platform compiler issues the slots must be filled
3837db96d56Sopenharmony_ci     * here. It's required for portability to Windows without requiring
3847db96d56Sopenharmony_ci     * C++. */
3857db96d56Sopenharmony_ci    Str_Type_slots[0].pfunc = &PyUnicode_Type;
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci    /* Add a custom type */
3887db96d56Sopenharmony_ci    temp = PyType_FromSpec(&Example_Type_spec);
3897db96d56Sopenharmony_ci    if (temp == NULL) {
3907db96d56Sopenharmony_ci        goto fail;
3917db96d56Sopenharmony_ci    }
3927db96d56Sopenharmony_ci    if (PyModule_AddObject(m, "Example", temp) != 0) {
3937db96d56Sopenharmony_ci        Py_DECREF(temp);
3947db96d56Sopenharmony_ci        goto fail;
3957db96d56Sopenharmony_ci    }
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci    /* Add an exception type */
3997db96d56Sopenharmony_ci    temp = PyErr_NewException("_testimportexec.error", NULL, NULL);
4007db96d56Sopenharmony_ci    if (temp == NULL) {
4017db96d56Sopenharmony_ci        goto fail;
4027db96d56Sopenharmony_ci    }
4037db96d56Sopenharmony_ci    if (PyModule_AddObject(m, "error", temp) != 0) {
4047db96d56Sopenharmony_ci        Py_DECREF(temp);
4057db96d56Sopenharmony_ci        goto fail;
4067db96d56Sopenharmony_ci    }
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci    /* Add Str */
4097db96d56Sopenharmony_ci    temp = PyType_FromSpec(&Str_Type_spec);
4107db96d56Sopenharmony_ci    if (temp == NULL) {
4117db96d56Sopenharmony_ci        goto fail;
4127db96d56Sopenharmony_ci    }
4137db96d56Sopenharmony_ci    if (PyModule_AddObject(m, "Str", temp) != 0) {
4147db96d56Sopenharmony_ci        Py_DECREF(temp);
4157db96d56Sopenharmony_ci        goto fail;
4167db96d56Sopenharmony_ci    }
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci    if (PyModule_AddIntConstant(m, "int_const", 1969) != 0) {
4197db96d56Sopenharmony_ci        goto fail;
4207db96d56Sopenharmony_ci    }
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    if (PyModule_AddStringConstant(m, "str_const", "something different") != 0) {
4237db96d56Sopenharmony_ci        goto fail;
4247db96d56Sopenharmony_ci    }
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci    return 0;
4277db96d56Sopenharmony_ci fail:
4287db96d56Sopenharmony_ci    return -1;
4297db96d56Sopenharmony_ci}
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci/* Helper for module definitions; there'll be a lot of them */
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci#define TEST_MODULE_DEF(name, slots, methods) { \
4347db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,                      /* m_base */ \
4357db96d56Sopenharmony_ci    name,                                       /* m_name */ \
4367db96d56Sopenharmony_ci    PyDoc_STR("Test module " name),             /* m_doc */ \
4377db96d56Sopenharmony_ci    0,                                          /* m_size */ \
4387db96d56Sopenharmony_ci    methods,                                    /* m_methods */ \
4397db96d56Sopenharmony_ci    slots,                                      /* m_slots */ \
4407db96d56Sopenharmony_ci    NULL,                                       /* m_traverse */ \
4417db96d56Sopenharmony_ci    NULL,                                       /* m_clear */ \
4427db96d56Sopenharmony_ci    NULL,                                       /* m_free */ \
4437db96d56Sopenharmony_ci}
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_cistatic PyModuleDef_Slot main_slots[] = {
4467db96d56Sopenharmony_ci    {Py_mod_exec, execfunc},
4477db96d56Sopenharmony_ci    {0, NULL},
4487db96d56Sopenharmony_ci};
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_cistatic PyModuleDef main_def = TEST_MODULE_DEF("main", main_slots, testexport_methods);
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ciPyMODINIT_FUNC
4537db96d56Sopenharmony_ciPyInit__testmultiphase(void)
4547db96d56Sopenharmony_ci{
4557db96d56Sopenharmony_ci    return PyModuleDef_Init(&main_def);
4567db96d56Sopenharmony_ci}
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci/**** Importing a non-module object ****/
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci/* Create a SimpleNamespace(three=3) */
4627db96d56Sopenharmony_cistatic PyObject*
4637db96d56Sopenharmony_cicreatefunc_nonmodule(PyObject *spec, PyModuleDef *def)
4647db96d56Sopenharmony_ci{
4657db96d56Sopenharmony_ci    PyObject *dct, *ns, *three;
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci    if (def != &def_nonmodule && def != &def_nonmodule_with_methods) {
4687db96d56Sopenharmony_ci        PyErr_SetString(PyExc_SystemError, "def does not match");
4697db96d56Sopenharmony_ci        return NULL;
4707db96d56Sopenharmony_ci    }
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci    dct = PyDict_New();
4737db96d56Sopenharmony_ci    if (dct == NULL)
4747db96d56Sopenharmony_ci        return NULL;
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci    three = PyLong_FromLong(3);
4777db96d56Sopenharmony_ci    if (three == NULL) {
4787db96d56Sopenharmony_ci        Py_DECREF(dct);
4797db96d56Sopenharmony_ci        return NULL;
4807db96d56Sopenharmony_ci    }
4817db96d56Sopenharmony_ci    PyDict_SetItemString(dct, "three", three);
4827db96d56Sopenharmony_ci    Py_DECREF(three);
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci    ns = _PyNamespace_New(dct);
4857db96d56Sopenharmony_ci    Py_DECREF(dct);
4867db96d56Sopenharmony_ci    return ns;
4877db96d56Sopenharmony_ci}
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_create_nonmodule[] = {
4907db96d56Sopenharmony_ci    {Py_mod_create, createfunc_nonmodule},
4917db96d56Sopenharmony_ci    {0, NULL},
4927db96d56Sopenharmony_ci};
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_cistatic PyModuleDef def_nonmodule = TEST_MODULE_DEF(
4957db96d56Sopenharmony_ci    "_testmultiphase_nonmodule", slots_create_nonmodule, NULL);
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ciPyMODINIT_FUNC
4987db96d56Sopenharmony_ciPyInit__testmultiphase_nonmodule(void)
4997db96d56Sopenharmony_ci{
5007db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_nonmodule);
5017db96d56Sopenharmony_ci}
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ciPyDoc_STRVAR(nonmodule_bar_doc,
5047db96d56Sopenharmony_ci"bar(i,j)\n\
5057db96d56Sopenharmony_ci\n\
5067db96d56Sopenharmony_ciReturn the difference of i - j.");
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_cistatic PyObject *
5097db96d56Sopenharmony_cinonmodule_bar(PyObject *self, PyObject *args)
5107db96d56Sopenharmony_ci{
5117db96d56Sopenharmony_ci    long i, j;
5127db96d56Sopenharmony_ci    long res;
5137db96d56Sopenharmony_ci    if (!PyArg_ParseTuple(args, "ll:bar", &i, &j))
5147db96d56Sopenharmony_ci        return NULL;
5157db96d56Sopenharmony_ci    res = i - j;
5167db96d56Sopenharmony_ci    return PyLong_FromLong(res);
5177db96d56Sopenharmony_ci}
5187db96d56Sopenharmony_ci
5197db96d56Sopenharmony_cistatic PyMethodDef nonmodule_methods[] = {
5207db96d56Sopenharmony_ci    {"bar", nonmodule_bar, METH_VARARGS, nonmodule_bar_doc},
5217db96d56Sopenharmony_ci    {NULL, NULL}           /* sentinel */
5227db96d56Sopenharmony_ci};
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_cistatic PyModuleDef def_nonmodule_with_methods = TEST_MODULE_DEF(
5257db96d56Sopenharmony_ci    "_testmultiphase_nonmodule_with_methods", slots_create_nonmodule, nonmodule_methods);
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ciPyMODINIT_FUNC
5287db96d56Sopenharmony_ciPyInit__testmultiphase_nonmodule_with_methods(void)
5297db96d56Sopenharmony_ci{
5307db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_nonmodule_with_methods);
5317db96d56Sopenharmony_ci}
5327db96d56Sopenharmony_ci
5337db96d56Sopenharmony_ci/**** Non-ASCII-named modules ****/
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_cistatic PyModuleDef def_nonascii_latin = { \
5367db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,                      /* m_base */
5377db96d56Sopenharmony_ci    "_testmultiphase_nonascii_latin",           /* m_name */
5387db96d56Sopenharmony_ci    PyDoc_STR("Module named in Czech"),         /* m_doc */
5397db96d56Sopenharmony_ci    0,                                          /* m_size */
5407db96d56Sopenharmony_ci    NULL,                                       /* m_methods */
5417db96d56Sopenharmony_ci    NULL,                                       /* m_slots */
5427db96d56Sopenharmony_ci    NULL,                                       /* m_traverse */
5437db96d56Sopenharmony_ci    NULL,                                       /* m_clear */
5447db96d56Sopenharmony_ci    NULL,                                       /* m_free */
5457db96d56Sopenharmony_ci};
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ciPyMODINIT_FUNC
5487db96d56Sopenharmony_ciPyInitU__testmultiphase_zkouka_naten_evc07gi8e(void)
5497db96d56Sopenharmony_ci{
5507db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_nonascii_latin);
5517db96d56Sopenharmony_ci}
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_cistatic PyModuleDef def_nonascii_kana = { \
5547db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,                      /* m_base */
5557db96d56Sopenharmony_ci    "_testmultiphase_nonascii_kana",            /* m_name */
5567db96d56Sopenharmony_ci    PyDoc_STR("Module named in Japanese"),      /* m_doc */
5577db96d56Sopenharmony_ci    0,                                          /* m_size */
5587db96d56Sopenharmony_ci    NULL,                                       /* m_methods */
5597db96d56Sopenharmony_ci    NULL,                                       /* m_slots */
5607db96d56Sopenharmony_ci    NULL,                                       /* m_traverse */
5617db96d56Sopenharmony_ci    NULL,                                       /* m_clear */
5627db96d56Sopenharmony_ci    NULL,                                       /* m_free */
5637db96d56Sopenharmony_ci};
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ciPyMODINIT_FUNC
5667db96d56Sopenharmony_ciPyInitU_eckzbwbhc6jpgzcx415x(void)
5677db96d56Sopenharmony_ci{
5687db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_nonascii_kana);
5697db96d56Sopenharmony_ci}
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci/*** Module with a single-character name ***/
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ciPyMODINIT_FUNC
5747db96d56Sopenharmony_ciPyInit_x(void)
5757db96d56Sopenharmony_ci{
5767db96d56Sopenharmony_ci    return PyModuleDef_Init(&main_def);
5777db96d56Sopenharmony_ci}
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci/**** Testing NULL slots ****/
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_cistatic PyModuleDef null_slots_def = TEST_MODULE_DEF(
5827db96d56Sopenharmony_ci    "_testmultiphase_null_slots", NULL, NULL);
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ciPyMODINIT_FUNC
5857db96d56Sopenharmony_ciPyInit__testmultiphase_null_slots(void)
5867db96d56Sopenharmony_ci{
5877db96d56Sopenharmony_ci    return PyModuleDef_Init(&null_slots_def);
5887db96d56Sopenharmony_ci}
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci/**** Problematic modules ****/
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_bad_large[] = {
5937db96d56Sopenharmony_ci    {_Py_mod_LAST_SLOT + 1, NULL},
5947db96d56Sopenharmony_ci    {0, NULL},
5957db96d56Sopenharmony_ci};
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_cistatic PyModuleDef def_bad_large = TEST_MODULE_DEF(
5987db96d56Sopenharmony_ci    "_testmultiphase_bad_slot_large", slots_bad_large, NULL);
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ciPyMODINIT_FUNC
6017db96d56Sopenharmony_ciPyInit__testmultiphase_bad_slot_large(void)
6027db96d56Sopenharmony_ci{
6037db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_bad_large);
6047db96d56Sopenharmony_ci}
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_bad_negative[] = {
6077db96d56Sopenharmony_ci    {-1, NULL},
6087db96d56Sopenharmony_ci    {0, NULL},
6097db96d56Sopenharmony_ci};
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_cistatic PyModuleDef def_bad_negative = TEST_MODULE_DEF(
6127db96d56Sopenharmony_ci    "_testmultiphase_bad_slot_negative", slots_bad_negative, NULL);
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ciPyMODINIT_FUNC
6157db96d56Sopenharmony_ciPyInit__testmultiphase_bad_slot_negative(void)
6167db96d56Sopenharmony_ci{
6177db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_bad_negative);
6187db96d56Sopenharmony_ci}
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_cistatic PyModuleDef def_create_int_with_state = { \
6217db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,                      /* m_base */
6227db96d56Sopenharmony_ci    "create_with_state",                        /* m_name */
6237db96d56Sopenharmony_ci    PyDoc_STR("Not a PyModuleObject object, but requests per-module state"),
6247db96d56Sopenharmony_ci    10,                                         /* m_size */
6257db96d56Sopenharmony_ci    NULL,                                       /* m_methods */
6267db96d56Sopenharmony_ci    slots_create_nonmodule,                     /* m_slots */
6277db96d56Sopenharmony_ci    NULL,                                       /* m_traverse */
6287db96d56Sopenharmony_ci    NULL,                                       /* m_clear */
6297db96d56Sopenharmony_ci    NULL,                                       /* m_free */
6307db96d56Sopenharmony_ci};
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ciPyMODINIT_FUNC
6337db96d56Sopenharmony_ciPyInit__testmultiphase_create_int_with_state(void)
6347db96d56Sopenharmony_ci{
6357db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_create_int_with_state);
6367db96d56Sopenharmony_ci}
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_cistatic PyModuleDef def_negative_size = { \
6407db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,                      /* m_base */
6417db96d56Sopenharmony_ci    "negative_size",                            /* m_name */
6427db96d56Sopenharmony_ci    PyDoc_STR("PyModuleDef with negative m_size"),
6437db96d56Sopenharmony_ci    -1,                                         /* m_size */
6447db96d56Sopenharmony_ci    NULL,                                       /* m_methods */
6457db96d56Sopenharmony_ci    slots_create_nonmodule,                     /* m_slots */
6467db96d56Sopenharmony_ci    NULL,                                       /* m_traverse */
6477db96d56Sopenharmony_ci    NULL,                                       /* m_clear */
6487db96d56Sopenharmony_ci    NULL,                                       /* m_free */
6497db96d56Sopenharmony_ci};
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ciPyMODINIT_FUNC
6527db96d56Sopenharmony_ciPyInit__testmultiphase_negative_size(void)
6537db96d56Sopenharmony_ci{
6547db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_negative_size);
6557db96d56Sopenharmony_ci}
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_cistatic PyModuleDef uninitialized_def = TEST_MODULE_DEF("main", main_slots, testexport_methods);
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ciPyMODINIT_FUNC
6617db96d56Sopenharmony_ciPyInit__testmultiphase_export_uninitialized(void)
6627db96d56Sopenharmony_ci{
6637db96d56Sopenharmony_ci    return (PyObject*) &uninitialized_def;
6647db96d56Sopenharmony_ci}
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ciPyMODINIT_FUNC
6677db96d56Sopenharmony_ciPyInit__testmultiphase_export_null(void)
6687db96d56Sopenharmony_ci{
6697db96d56Sopenharmony_ci    return NULL;
6707db96d56Sopenharmony_ci}
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ciPyMODINIT_FUNC
6737db96d56Sopenharmony_ciPyInit__testmultiphase_export_raise(void)
6747db96d56Sopenharmony_ci{
6757db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad export function");
6767db96d56Sopenharmony_ci    return NULL;
6777db96d56Sopenharmony_ci}
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ciPyMODINIT_FUNC
6807db96d56Sopenharmony_ciPyInit__testmultiphase_export_unreported_exception(void)
6817db96d56Sopenharmony_ci{
6827db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad export function");
6837db96d56Sopenharmony_ci    return PyModuleDef_Init(&main_def);
6847db96d56Sopenharmony_ci}
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_cistatic PyObject*
6877db96d56Sopenharmony_cicreatefunc_null(PyObject *spec, PyModuleDef *def)
6887db96d56Sopenharmony_ci{
6897db96d56Sopenharmony_ci    return NULL;
6907db96d56Sopenharmony_ci}
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_create_null[] = {
6937db96d56Sopenharmony_ci    {Py_mod_create, createfunc_null},
6947db96d56Sopenharmony_ci    {0, NULL},
6957db96d56Sopenharmony_ci};
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_cistatic PyModuleDef def_create_null = TEST_MODULE_DEF(
6987db96d56Sopenharmony_ci    "_testmultiphase_create_null", slots_create_null, NULL);
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ciPyMODINIT_FUNC
7017db96d56Sopenharmony_ciPyInit__testmultiphase_create_null(void)
7027db96d56Sopenharmony_ci{
7037db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_create_null);
7047db96d56Sopenharmony_ci}
7057db96d56Sopenharmony_ci
7067db96d56Sopenharmony_cistatic PyObject*
7077db96d56Sopenharmony_cicreatefunc_raise(PyObject *spec, PyModuleDef *def)
7087db96d56Sopenharmony_ci{
7097db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad create function");
7107db96d56Sopenharmony_ci    return NULL;
7117db96d56Sopenharmony_ci}
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_create_raise[] = {
7147db96d56Sopenharmony_ci    {Py_mod_create, createfunc_raise},
7157db96d56Sopenharmony_ci    {0, NULL},
7167db96d56Sopenharmony_ci};
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_cistatic PyModuleDef def_create_raise = TEST_MODULE_DEF(
7197db96d56Sopenharmony_ci    "_testmultiphase_create_null", slots_create_raise, NULL);
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ciPyMODINIT_FUNC
7227db96d56Sopenharmony_ciPyInit__testmultiphase_create_raise(void)
7237db96d56Sopenharmony_ci{
7247db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_create_raise);
7257db96d56Sopenharmony_ci}
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_cistatic PyObject*
7287db96d56Sopenharmony_cicreatefunc_unreported_exception(PyObject *spec, PyModuleDef *def)
7297db96d56Sopenharmony_ci{
7307db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad create function");
7317db96d56Sopenharmony_ci    return PyModule_New("foo");
7327db96d56Sopenharmony_ci}
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_create_unreported_exception[] = {
7357db96d56Sopenharmony_ci    {Py_mod_create, createfunc_unreported_exception},
7367db96d56Sopenharmony_ci    {0, NULL},
7377db96d56Sopenharmony_ci};
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_cistatic PyModuleDef def_create_unreported_exception = TEST_MODULE_DEF(
7407db96d56Sopenharmony_ci    "_testmultiphase_create_unreported_exception", slots_create_unreported_exception, NULL);
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ciPyMODINIT_FUNC
7437db96d56Sopenharmony_ciPyInit__testmultiphase_create_unreported_exception(void)
7447db96d56Sopenharmony_ci{
7457db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_create_unreported_exception);
7467db96d56Sopenharmony_ci}
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_nonmodule_with_exec_slots[] = {
7497db96d56Sopenharmony_ci    {Py_mod_create, createfunc_nonmodule},
7507db96d56Sopenharmony_ci    {Py_mod_exec, execfunc},
7517db96d56Sopenharmony_ci    {0, NULL},
7527db96d56Sopenharmony_ci};
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_cistatic PyModuleDef def_nonmodule_with_exec_slots = TEST_MODULE_DEF(
7557db96d56Sopenharmony_ci    "_testmultiphase_nonmodule_with_exec_slots", slots_nonmodule_with_exec_slots, NULL);
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ciPyMODINIT_FUNC
7587db96d56Sopenharmony_ciPyInit__testmultiphase_nonmodule_with_exec_slots(void)
7597db96d56Sopenharmony_ci{
7607db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_nonmodule_with_exec_slots);
7617db96d56Sopenharmony_ci}
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_cistatic int
7647db96d56Sopenharmony_ciexecfunc_err(PyObject *mod)
7657db96d56Sopenharmony_ci{
7667db96d56Sopenharmony_ci    return -1;
7677db96d56Sopenharmony_ci}
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_exec_err[] = {
7707db96d56Sopenharmony_ci    {Py_mod_exec, execfunc_err},
7717db96d56Sopenharmony_ci    {0, NULL},
7727db96d56Sopenharmony_ci};
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_cistatic PyModuleDef def_exec_err = TEST_MODULE_DEF(
7757db96d56Sopenharmony_ci    "_testmultiphase_exec_err", slots_exec_err, NULL);
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ciPyMODINIT_FUNC
7787db96d56Sopenharmony_ciPyInit__testmultiphase_exec_err(void)
7797db96d56Sopenharmony_ci{
7807db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_exec_err);
7817db96d56Sopenharmony_ci}
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_cistatic int
7847db96d56Sopenharmony_ciexecfunc_raise(PyObject *spec)
7857db96d56Sopenharmony_ci{
7867db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad exec function");
7877db96d56Sopenharmony_ci    return -1;
7887db96d56Sopenharmony_ci}
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_exec_raise[] = {
7917db96d56Sopenharmony_ci    {Py_mod_exec, execfunc_raise},
7927db96d56Sopenharmony_ci    {0, NULL},
7937db96d56Sopenharmony_ci};
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_cistatic PyModuleDef def_exec_raise = TEST_MODULE_DEF(
7967db96d56Sopenharmony_ci    "_testmultiphase_exec_raise", slots_exec_raise, NULL);
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ciPyMODINIT_FUNC
7997db96d56Sopenharmony_ciPyInit__testmultiphase_exec_raise(void)
8007db96d56Sopenharmony_ci{
8017db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_exec_raise);
8027db96d56Sopenharmony_ci}
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_cistatic int
8057db96d56Sopenharmony_ciexecfunc_unreported_exception(PyObject *mod)
8067db96d56Sopenharmony_ci{
8077db96d56Sopenharmony_ci    PyErr_SetString(PyExc_SystemError, "bad exec function");
8087db96d56Sopenharmony_ci    return 0;
8097db96d56Sopenharmony_ci}
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_cistatic PyModuleDef_Slot slots_exec_unreported_exception[] = {
8127db96d56Sopenharmony_ci    {Py_mod_exec, execfunc_unreported_exception},
8137db96d56Sopenharmony_ci    {0, NULL},
8147db96d56Sopenharmony_ci};
8157db96d56Sopenharmony_ci
8167db96d56Sopenharmony_cistatic PyModuleDef def_exec_unreported_exception = TEST_MODULE_DEF(
8177db96d56Sopenharmony_ci    "_testmultiphase_exec_unreported_exception", slots_exec_unreported_exception, NULL);
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ciPyMODINIT_FUNC
8207db96d56Sopenharmony_ciPyInit__testmultiphase_exec_unreported_exception(void)
8217db96d56Sopenharmony_ci{
8227db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_exec_unreported_exception);
8237db96d56Sopenharmony_ci}
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_cistatic int
8267db96d56Sopenharmony_cimeth_state_access_exec(PyObject *m)
8277db96d56Sopenharmony_ci{
8287db96d56Sopenharmony_ci    PyObject *temp;
8297db96d56Sopenharmony_ci    meth_state *m_state;
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci    m_state = PyModule_GetState(m);
8327db96d56Sopenharmony_ci    if (m_state == NULL) {
8337db96d56Sopenharmony_ci        return -1;
8347db96d56Sopenharmony_ci    }
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci    temp = PyType_FromModuleAndSpec(m, &StateAccessType_spec, NULL);
8377db96d56Sopenharmony_ci    if (temp == NULL) {
8387db96d56Sopenharmony_ci        return -1;
8397db96d56Sopenharmony_ci    }
8407db96d56Sopenharmony_ci    if (PyModule_AddObject(m, "StateAccessType", temp) != 0) {
8417db96d56Sopenharmony_ci        Py_DECREF(temp);
8427db96d56Sopenharmony_ci        return -1;
8437db96d56Sopenharmony_ci    }
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci    return 0;
8477db96d56Sopenharmony_ci}
8487db96d56Sopenharmony_ci
8497db96d56Sopenharmony_cistatic PyModuleDef_Slot meth_state_access_slots[] = {
8507db96d56Sopenharmony_ci    {Py_mod_exec, meth_state_access_exec},
8517db96d56Sopenharmony_ci    {0, NULL}
8527db96d56Sopenharmony_ci};
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_cistatic PyModuleDef def_meth_state_access = {
8557db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
8567db96d56Sopenharmony_ci    .m_name = "_testmultiphase_meth_state_access",
8577db96d56Sopenharmony_ci    .m_doc = PyDoc_STR("Module testing access"
8587db96d56Sopenharmony_ci                       " to state from methods."),
8597db96d56Sopenharmony_ci    .m_size = sizeof(meth_state),
8607db96d56Sopenharmony_ci    .m_slots = meth_state_access_slots,
8617db96d56Sopenharmony_ci};
8627db96d56Sopenharmony_ci
8637db96d56Sopenharmony_ciPyMODINIT_FUNC
8647db96d56Sopenharmony_ciPyInit__testmultiphase_meth_state_access(void)
8657db96d56Sopenharmony_ci{
8667db96d56Sopenharmony_ci    return PyModuleDef_Init(&def_meth_state_access);
8677db96d56Sopenharmony_ci}
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_cistatic PyModuleDef def_module_state_shared = {
8707db96d56Sopenharmony_ci    PyModuleDef_HEAD_INIT,
8717db96d56Sopenharmony_ci    .m_name = "_test_module_state_shared",
8727db96d56Sopenharmony_ci    .m_doc = PyDoc_STR("Regression Test module for single-phase init."),
8737db96d56Sopenharmony_ci    .m_size = -1,
8747db96d56Sopenharmony_ci};
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ciPyMODINIT_FUNC
8777db96d56Sopenharmony_ciPyInit__test_module_state_shared(void)
8787db96d56Sopenharmony_ci{
8797db96d56Sopenharmony_ci    PyObject *module = PyModule_Create(&def_module_state_shared);
8807db96d56Sopenharmony_ci    if (module == NULL) {
8817db96d56Sopenharmony_ci        return NULL;
8827db96d56Sopenharmony_ci    }
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci    if (PyModule_AddObjectRef(module, "Error", PyExc_Exception) < 0) {
8857db96d56Sopenharmony_ci        Py_DECREF(module);
8867db96d56Sopenharmony_ci        return NULL;
8877db96d56Sopenharmony_ci    }
8887db96d56Sopenharmony_ci    return module;
8897db96d56Sopenharmony_ci}
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci/*** Helper for imp test ***/
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_cistatic PyModuleDef imp_dummy_def = TEST_MODULE_DEF("imp_dummy", main_slots, testexport_methods);
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ciPyMODINIT_FUNC
8977db96d56Sopenharmony_ciPyInit_imp_dummy(void)
8987db96d56Sopenharmony_ci{
8997db96d56Sopenharmony_ci    return PyModuleDef_Init(&imp_dummy_def);
9007db96d56Sopenharmony_ci}
9017db96d56Sopenharmony_ci
902