You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
3.14.0a2 rebuild needed for 0x03070000 limited api c extension #127191
An existing C api extension compiled with Python 3.7-3.11 behaves differently when run in Python 3.14.0a2. Causing a reference count change where none is expected. The python test code looks like this
fromsysimportgetrefcountfrom_rl_accelimportunicode2T1utext='This is the end of the world'classFont:
def__init__(self,name):
self.fontName=nameself.substitutionFonts= []
self.encName='utf8'font=Font('Helvetica')
defns='utext font font.encName font.fontName font.substitutionFonts'.split()
rc0= [getrefcount(eval(x,globals())) forxindefns]
print(rc0)
unicode2T1(utext,[font]+font.substitutionFonts)
rc1= [getrefcount(eval(x,globals())) forxindefns]
print(rc1)
ifrc1!=rc0:
print('!!!!! reference counts changed !!!!!')
The C function unicode2T1 is not expected to change any of the refcounts checked, but if built with python 3.7-3.11
we see a decrease in the refcount for font.encName when running in python 3.14.0a2.
If built with python 3.14.0a2 the reference count decrease is not seen in the test. It seems that my code is broken in terms of the abi3 guarantee.
To ease checking I built a bash script to checkout and build the test environments; this can be found here.
I think this is expected now that the immortality of some/all globals is happening in Python >= 3.12. Probably I just need to build new wheels using a late python.
I'm not sure we can do anything on our side since it affects 3rd party extensions and a security-branch only. However I don't know the exact policy concerning that kind of breaking change hence I'm asking @iritkatriel or @vstinner.
Yeah, reference counts aren't part of the stable ABI. I wonder if we should add a sys._is_immortal for situations like this, similar to how we have sys._is_interned.
Activity
MrBitBucket commentedon Nov 23, 2024
I think this is expected now that the immortality of some/all globals is happening in Python >= 3.12. Probably I just need to build new wheels using a late python.
picnixz commentedon Nov 23, 2024
I'm not sure we can do anything on our side since it affects 3rd party extensions and a security-branch only. However I don't know the exact policy concerning that kind of breaking change hence I'm asking @iritkatriel or @vstinner.
ZeroIntensity commentedon Nov 23, 2024
As far as I know, the actual reference count of an object is an implementation detail, not part of the stable ABI.
vstinner commentedon Nov 25, 2024
Can you try to write a reproducer which doesn't depend on third party code?
vstinner commentedon Nov 25, 2024
Ah, this issue is also discussed at: https://discuss.python.org/t/3-14-0a2-rebuild-needed-for-0x03070000-limited-api-c-extension/72006
erlend-aasland commentedon Jan 4, 2025
Based on the discussion over at DPO, it sounds to me we can close this as "not planned".
ZeroIntensity commentedon Jan 4, 2025
Yeah, reference counts aren't part of the stable ABI. I wonder if we should add a
sys._is_immortalfor situations like this, similar to how we havesys._is_interned.