Message285727
Naoki: "On the other hand, PyCFunction may calls method of extension module, and it can cause recursive call. So I think PyCFunction_*Call* methods calling function pointer it has (e.g. _PyCFunction_FastCallKeywords) should call Py_EnterRecursiveCall()."
In Python 3.5, C functions are only calls inside Py_EnterRecursiveCall() if calls from PyObject_Call(). There are many other ways to call C functions which don't use Py_EnterRecursiveCall(). Examples:
* call_function() => call the C function
* call_function() => PyCFunction_Call() => call the C function
* call_function() => do_call() => PyCFunction_Call() => call the C function
* ext_do_call() => PyCFunction_Call() => call the C function
call_function() and do_call() have a special case for PyCFunction, otherwise they call the generic PyObject_Call() which uses Py_EnterRecursiveCall().
I agree that calling C functions with Py_EnterRecursiveCall() would help to prevent stack overflow crashs.
Attached enter_recursive_call.patch patch:
* _PyMethodDef_RawFastCallDict() (internal helper of _PyCFunction_FastCallDict()) and _PyCFunction_FastCallKeywords() now use Py_EnterRecursiveCall()
* _PyObject_FastCallKeywords(): move Py_EnterRecursiveCall() closer to the final call to simplify error handling
* Modify _PyObject_FastCallDict() to not call _PyFunction_FastCallDict() nor _PyCFunction_FastCallDict() inside Py_EnterRecursiveCall(), since these functions already use Py_EnterRecursiveCall() internally |
|
Date |
User |
Action |
Args |
2017-01-18 13:37:04 | vstinner | set | recipients:
+ vstinner, methane |
2017-01-18 13:37:04 | vstinner | set | messageid: <1484746624.35.0.62109232204.issue29306@psf.upfronthosting.co.za> |
2017-01-18 13:37:04 | vstinner | link | issue29306 messages |
2017-01-18 13:37:03 | vstinner | create | |
|