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