[Cython] Big backwards compatibility problem with fused types
stefan_ml at behnel.de
Wed Sep 20 06:24:29 EDT 2017
Robert Bradshaw schrieb am 19.09.2017 um 22:55:
> On Tue, Sep 19, 2017 at 10:48 AM, Stefan Behnel wrote:
>> this is really bad:
>> The problem is that cdef functions with fused types are expanded
>> arbitrarily on use, and their Entries removed and re-appended to the list
>> of cdef function entries. But that list also defines the order of the
>> entries in the vtable!
>> Currently, when a method with fused types is defined in a .pxd file, it is
>> the implementation order in the .pyx (!) file that determines the order in
>> the vtable. Even worse, for modules that cimport from that .pxd file, it is
>> the order in which these methods are *called* that determines the
>> corresponding vtable on the other side, as the entries are expanded at
>> first use, i.e. at their first occurrence in the code, and appended to the
>> current list of cdef functions at this (arbitrary) point.
>> What this means is that there is no way to safely infer the vtable order of
>> an extension type with fused methods from a .pxd file.
>> Now, the correct way to handle this would have been to *replace* the
>> original fused entry with the expanded list of specialised entries. But
>> it's too late for that now. All existing modules out there would need to
>> get recompiled if we changed their vtable order, at least if they use fused
>> any types methods anywhere in their hierarchy.
>> However, I think we can assume code that uses a different method order in
>> the .pxd and .pyx files to be broken already, so a way out of this misery
>> would be to make the .pxd order the one and only source, with the twist
>> that we must keep the "delete and re-append" algorithm to keep the order
>> that existing translated modules are using.
>> Thus the proposal:
>> - we switch to a scheme now that is only defined by the first declaration
>> order, i.e. the order in the .pxd file if there is one.
>> - we make sure all fused methods are expanded in that same order, but
>> continue to follow all non-fused methods in the vtable.
>> - we break all code now that uses a different order of fused methods in
>> their pyx and pxd files
> +1. We should let the .pxd file, as it is declared, be the source of
> truth. Code that doesn't already follow this is and does cross-module
> fused-cdef function calls is already broken.
This should fix it:
There were also other problems that I could fix along the way with respect
to inheritance from types with fused cdef methods, so I can hope that we're
really fixing a rare case in practice. At least, it took more than 5 years
after implementing fused types (in April 2012) to discover this bug, so it
can't be the most widely used Cython feature out there...
More information about the cython-devel