PyObject* __stdcall Jit_EvalHelper(void* state, PyFrameObject*frame) { PyThreadState *tstate = PyThreadState_GET(); if (tstate->use_tracing) { if (tstate->c_tracefunc != NULL) { return PyEval_EvalFrameEx_NoJit(frame, 0); } } if (Py_EnterRecursiveCall("")) { return NULL; } frame->f_executing = 1; auto res = ((Py_EvalFunc)state)(nullptr, frame); Py_LeaveRecursiveCall(); frame->f_executing = 0; return _Py_CheckFunctionResult(NULL, res, "Jit_EvalHelper"); }
PyObject * PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwds) { PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); PyObject *arg, *res; Py_ssize_t size; int flags; /* PyCFunction_Call() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); flags = PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST); if (flags == (METH_VARARGS | METH_KEYWORDS)) { res = (*(PyCFunctionWithKeywords)meth)(self, args, kwds); } else { if (kwds != NULL && PyDict_Size(kwds) != 0) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); return NULL; } switch (flags) { case METH_VARARGS: res = (*meth)(self, args); break; case METH_NOARGS: size = PyTuple_GET_SIZE(args); if (size != 0) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%zd given)", f->m_ml->ml_name, size); return NULL; } res = (*meth)(self, NULL); break; case METH_O: size = PyTuple_GET_SIZE(args); if (size != 1) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%zd given)", f->m_ml->ml_name, size); return NULL; } arg = PyTuple_GET_ITEM(args, 0); res = (*meth)(self, arg); break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags in PyCFunction_Call. " "METH_OLDARGS is no longer supported!"); return NULL; } } return _Py_CheckFunctionResult(func, res, NULL); }