Message347336
One thing that keeps bothering me when using vectorcall for type.__call__ is that we would have two completely independent code paths for constructing an object: the new one using vectorcall and the old one using tp_call, which in turn calls tp_new and tp_init.
In typical vectorcall usages, there is no need to support the old way any longer: we can set tp_call = PyVectorcall_Call and that's it. But for "type", we still need to support tp_new and tp_init because there may be C code out there that calls tp_new/tp_init directly. To give one concrete example: collections.defaultdict calls PyDict_Type.tp_init
One solution is to keep the old code for tp_new/tp_init. This is what Mark did in PR 13930. But this leads to duplication of functionality and is therefore error-prone (different code paths may have subtly different behaviour).
Since we don't want to break Python code calling dict.__new__ or dict.__init__, not implementing those is not an option. But to be compatible with the vectorcall signature, ideally we want to implement __init__ using METH_FASTCALL, so __init__ would need to be a normal method instead of a slot wrapper of tp_init (similar to Python classes). This would work, but it needs some support in typeobject.c |
|
Date |
User |
Action |
Args |
2019-07-05 12:31:43 | jdemeyer | set | recipients:
+ jdemeyer, methane, Mark.Shannon |
2019-07-05 12:31:43 | jdemeyer | set | messageid: <1562329903.16.0.406310679042.issue37207@roundup.psfhosted.org> |
2019-07-05 12:31:43 | jdemeyer | link | issue37207 messages |
2019-07-05 12:31:42 | jdemeyer | create | |
|