On Sun, Feb 7, 2016 at 7:58 AM, Randy Eels <randye...@gmail.com> wrote:
>
> Yet, I can't seem to understand where and when does the `tp_alloc` slot of
> PyType_Type get re-assigned to PyType_GenericAlloc. Does that even happen?
> Or am I missing something bigger?

_Py_InitializeEx_Private in Python/pylifecycle.c calls _Py_ReadyTypes
in Objects/object.c. This calls PyType_Ready(&PyType_Type) in
Objects/typeobject.c, which assigns type->tp_base = &PyBaseObject_Type
and then calls inherit_slots. This executes COPYSLOT(tp_alloc), which
assigns PyType_Type.tp_alloc = PyBaseObject_Type.tp_alloc, which is
statically assigned as PyType_GenericAlloc.

Debug trace on Windows:

    0:000> bp python35!PyType_Ready
    0:000> g
    Breakpoint 0 hit
    python35!PyType_Ready:
    00000000`6502d160 4053            push    rbx
    0:000> ?? ((PyTypeObject *)@rcx)->tp_name
    char * 0x00000000`650e4044
     "object"
    0:000> g
    Breakpoint 0 hit
    python35!PyType_Ready:
    00000000`6502d160 4053            push    rbx
    0:000> ?? ((PyTypeObject *)@rcx)->tp_name
    char * 0x00000000`651d8e5c
     "type"
    0:000> bp python35!inherit_slots
    0:000> g
    Breakpoint 1 hit
    python35!inherit_slots:
    00000000`6502c440 48895c2408      mov     qword ptr [rsp+8],rbx
                                            ss:00000000`0028f960={
                                            python35!PyType_Type
                                            (00000000`6527cba0)}

At entry to inherit_slots, PyType_Type.tp_alloc is NULL:

    0:000> ?? python35!PyType_Type.tp_alloc
    <function> * 0x00000000`00000000
    0:000> pt
    python35!inherit_slots+0xd17:
    00000000`6502d157 c3              ret

At exit it's set to PyType_GenericAlloc:

    0:000> ?? python35!PyType_Type.tp_alloc
    <function> * 0x00000000`65025580
    0:000> ln 65025580
    (00000000`65025580)   python35!PyType_GenericAlloc   |
    (00000000`650256a0)   python35!PyType_GenericNew
    Exact matches:
        python35!PyType_GenericAlloc (void)
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to