python-xdis icon indicating copy to clipboard operation
python-xdis copied to clipboard

Python 3.13 Support Draft

Open 2elli opened this issue 1 year ago • 5 comments

Added basic 3.13 support.

Currently passing all unit tests with make check. This PR also includes some small fixes to 3.12.

Still work in progress. While my fork passes testing, it still breaks in some major circumstances. For example, I cannot self disassemble xdis/opcodes/opcode_313.py, see TODO.

TODO (not exhaustive)

Formatting

  • Lots of oparg formatting to fix. Ex. some new ops SET_FUNCTION_ATTRIBUTE and CALL_KW need to have formatting fixed.
  • Running into an error with certain bytecode that uses EXTENDED_ARG. In some cases, I am finding EXTENDED_ARG with an oparg of None, leading to type comparison errors and incorrect behavior.

"drop-in" dis support

  • dis.disassemble and dis.distb have a new parameter show_offsets.
  • Instruction class in dis has new fields start_offset, cache_offset, end_offset, baseopname, baseopcode, jump_target, oparg, line_number and cache_info.

2elli avatar Oct 09 '24 04:10 2elli

@rocky Is there a best way to find out what the pop and push values should be for defining a new instruction with def_op? I am running into issues finding the correct pop and push values for the new CALL_KW op.

2elli avatar Oct 10 '24 02:10 2elli

@rocky Is there a best way to find out what the pop and push values should be for defining a new instruction with def_op? I am running into issues finding the correct pop and push values for the new CALL_KW op.

Hi @2elli :

For CALL_KW, use -2 for pop and 1 for push. -2 indicates that the "pop" value is not fixed and indeterminate. Down the line, I will define a literal value for that to make this more clear. This code goes back to Python 2.3 where literal values did not exist.

rocky avatar Oct 11 '24 14:10 rocky

@rocky Is there a best way to find out what the pop and push values should be for defining a new instruction with def_op? I am running into issues finding the correct pop and push values for the new CALL_KW op.

Hi @2elli :

For CALL_KW, use -2 for pop and 1 for push. -2 indicates that the "pop" value is not fixed and indeterminate. Down the line, I will define a literal value for that to make this more clear. This code goes back to Python 2.3 where literal values did not exist.

That makes sense thank you. I just pushed those changes. This does still raise an error with make check in pytest/test_stack_effect.py with error AssertionError: 57 (CALL_KW) needs adjusting; should be: should have effect -2. Is this okay to ignore or does this test need to be changed maybe?

2elli avatar Oct 11 '24 18:10 2elli

This does still raise an error with make check in pytest/test_stack_effect.py with error AssertionError: 57 (CALL_KW) needs adjusting; should be: should have effect -2. Is this okay to ignore or does this test need to be changed maybe?

I'll look into this when I get a chance. There is probably some (or a lot) of cleanup needed around push and pop fields.

rocky avatar Oct 11 '24 20:10 rocky

This does still raise an error with make check in pytest/test_stack_effect.py with error AssertionError: 57 (CALL_KW) needs adjusting; should be: should have effect -2. Is this okay to ignore or does this test need to be changed maybe?

I'll look into this when I get a chance. There is probably some (or a lot) of cleanup needed around push and pop fields.

Ok sounds good thanks. Let me know if I can help out with anything there.

2elli avatar Oct 11 '24 20:10 2elli

@rocky sounds good! I'll continue some work on this; currently there are some breaking changes I made in this. 3.12 line numbers are not correct at the moment unless ran from 3.12. I've been trying to debug in my free time. I'll update you.

2elli avatar Nov 09 '24 04:11 2elli