Skip to content

Python 3.13 #2454

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Dec 13, 2024
Merged

Python 3.13 #2454

merged 12 commits into from
Dec 13, 2024

Conversation

filmor
Copy link
Member

@filmor filmor commented Sep 19, 2024

This is crashing right now.

  • Investigate whether the generated type offsets are correct (investigated, but missed an error, see Python 3.13 #2454 (comment))
  • Decide how to deal with the removed Getter for the thread state
  • Find out why it crashes :)

@lostmsu
Copy link
Member

lostmsu commented Sep 19, 2024

Enable tests for 3.13 in the same PR?

@RobPasMue
Copy link
Contributor

@filmor @lostmsu - is there a plan for enabling support for 3.13? I see this PR has been stale for quite a while already. Just checking what's the status :)

@filmor
Copy link
Member Author

filmor commented Dec 11, 2024

All development is public. You can see here that the "simple" approach of adding new offsets (that I have indeed verified) fails. Debugging gave me additionally that it crashes in some very early dictionary access, but I don't really know how to go further.

@kunom
Copy link

kunom commented Dec 12, 2024

According to cvdump "c:\Program Files\Python313\python313.pdb" (cvdump from here), the PyHeapTypeStruct is stated to have a size of 928 bytes:

[...]
S_UDT:             0x1211, PyHeapTypeObject
[...]
0x1211 : Length = 58, Leaf = 0x1505 LF_STRUCTURE
	# members = 13,  field list type 0x1210, 
	Derivation list type 0x0000, VT shape type 0x0000
	Size = 928, class name = _heaptypeobject, unique name = .?AU_heaptypeobject@@, UDT(0x00001211)
[...]

However, when I look at the value of the TypeOffset313.init value, it is also 928.
image

We seem to have one property too much, don't we?

@filmor
Copy link
Member Author

filmor commented Dec 12, 2024

Aaah, got it, thanks @kunom!

The issue is that, unlike all other members, the new tp_watched and tp_versions_used attributes are char and uint16_t. I'll update our geninterop script to pick this up and release a new version latest tomorrow (CET).

I might have to release a new version of clr-loader as well to bump the cffi dependency.

/edit: Actually, fixing the generator requires more work that I don't think is worth the effort, seeing that we should remove the direct type offsets eventually. I will just lazy-fix this by dropping one of the fields, alignment does the rest.

@filmor filmor marked this pull request as ready for review December 12, 2024 19:29
@kunom
Copy link

kunom commented Dec 12, 2024

Not shure whether this still matters, but I was finally able to produce an offset listing of the full 3.13 struct PyHeapTypeObject using Ghidra reverse engineering. According to that tool, the following struct members have a size different from 8:

Name Size
tp_flags 4
tp_version_tag 4
tp_watched 1 (as stated above)
tp_versions_used 2 (as stated above)
getitem_version 4

But as you correctly noted, due to alignment, only the tp_watched;tp_versions_used; combination matters.

@filmor
Copy link
Member Author

filmor commented Dec 12, 2024

On my local machine, the embedding tests also pass for 3.13. I'll have to spend some more time tomorrow to get the CI going, but I'm quite confident that I can release a new version either tomorrow or this weekend.

@filmor filmor force-pushed the python3.13 branch 3 times, most recently from 21f3ffa to 1920b19 Compare December 13, 2024 07:59
Verified them locally, but there is an issue with the Github workflow
image that can hopefully be resolved later by using a full venv
instead of relying on the system environment.
@filmor filmor merged commit 4132a36 into master Dec 13, 2024
32 of 33 checks passed
@filmor filmor deleted the python3.13 branch December 13, 2024 08:26
@lostmsu
Copy link
Member

lostmsu commented Dec 13, 2024

Not that I'm against 3.13 support, but this seems to fail multiple tests and should have been marked alpha, or manually released calling our NuGet monthly build for preview packages, IMHO.

@filmor
Copy link
Member Author

filmor commented Dec 13, 2024

It is not failing tests, our CI is just a bit rusty. I ran a many combinations locally and will follow up in the next week to reactivate the excluded platforms.

@RobPasMue RobPasMue mentioned this pull request Jan 8, 2025
5 tasks
@maged-hanna
Copy link

maged-hanna commented Mar 3, 2025

@filmor I'm receiving a 'Attempted to read or write protected memory' error in my C# code when interacting with Python 3.13. This suggests potential memory corruption. Could this error be due to incompatibility with Python 3.13, or is it a sign that 3.13 is not supported?
var m_threadState = PythonEngine.BeginAllowThreads(); using (Py.GIL()){}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants